Skip to content

Commit 68cdb5f

Browse files
committed
Fixed: Most of the parser is not case insensitive, see #705
1 parent b69173b commit 68cdb5f

File tree

2 files changed

+33
-40
lines changed

2 files changed

+33
-40
lines changed

Diff for: src/parse.js

+29-40
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,15 @@ var tokenize = require("./tokenize"),
1818

1919
var base10Re = /^[1-9][0-9]*$/,
2020
base10NegRe = /^-?[1-9][0-9]*$/,
21-
base16Re = /^0[x][0-9a-f]+$/,
22-
base16NegRe = /^-?0[x][0-9a-f]+$/,
21+
base16Re = /^0[x][0-9a-fA-F]+$/,
22+
base16NegRe = /^-?0[x][0-9a-fA-F]+$/,
2323
base8Re = /^0[0-7]+$/,
2424
base8NegRe = /^-?0[0-7]+$/,
25-
numberRe = /^(?!e)[0-9]*(?:\.[0-9]*)?(?:[e][+-]?[0-9]+)?$/,
25+
numberRe = /^(?![eE])[0-9]*(?:\.[0-9]*)?(?:[eE][+-]?[0-9]+)?$/,
2626
nameRe = /^[a-zA-Z_][a-zA-Z_0-9]*$/,
2727
typeRefRe = /^(?:\.?[a-zA-Z_][a-zA-Z_0-9]*)+$/,
2828
fqTypeRefRe = /^(?:\.[a-zA-Z][a-zA-Z_0-9]*)+$/;
2929

30-
function lower(token) {
31-
return token === null ? null : token.toLowerCase();
32-
}
33-
3430
var camelCaseRe = /_([a-z])(?=[a-z]|$)/g;
3531

3632
function camelCase(str) {
@@ -118,14 +114,14 @@ function parse(source, root, options) {
118114

119115
function readValue(acceptTypeRef) {
120116
var token = next();
121-
switch (lower(token)) {
117+
switch (token) {
122118
case "'":
123119
case "\"":
124120
push(token);
125121
return readString();
126-
case "true":
122+
case "true": case "TRUE":
127123
return true;
128-
case "false":
124+
case "false": case "FALSE":
129125
return false;
130126
}
131127
try {
@@ -156,36 +152,34 @@ function parse(source, root, options) {
156152
sign = -1;
157153
token = token.substring(1);
158154
}
159-
var tokenLower = lower(token);
160-
switch (tokenLower) {
161-
case "inf": return sign * Infinity;
162-
case "nan": return NaN;
155+
switch (token) {
156+
case "inf": case "INF": return sign * Infinity;
157+
case "nan": case "NaN": case "NAN": return NaN;
163158
case "0": return 0;
164159
}
165160
if (base10Re.test(token))
166161
return sign * parseInt(token, 10);
167-
if (base16Re.test(tokenLower))
162+
if (base16Re.test(token))
168163
return sign * parseInt(token, 16);
169164
if (base8Re.test(token))
170165
return sign * parseInt(token, 8);
171-
if (numberRe.test(tokenLower))
166+
if (numberRe.test(token))
172167
return sign * parseFloat(token);
173168
/* istanbul ignore next */
174169
throw illegal(token, "number", insideTryCatch);
175170
}
176171

177172
function parseId(token, acceptNegative) {
178-
var tokenLower = lower(token);
179-
switch (tokenLower) {
180-
case "max": return 536870911;
173+
switch (token) {
174+
case "max": case "MAX": return 536870911;
181175
case "0": return 0;
182176
}
183177
/* istanbul ignore next */
184178
if (token.charAt(0) === "-" && !acceptNegative)
185179
throw illegal(token, "id");
186180
if (base10NegRe.test(token))
187181
return parseInt(token, 10);
188-
if (base16NegRe.test(tokenLower))
182+
if (base16NegRe.test(token))
189183
return parseInt(token, 16);
190184
/* istanbul ignore else */
191185
if (base8NegRe.test(token))
@@ -228,7 +222,7 @@ function parse(source, root, options) {
228222

229223
function parseSyntax() {
230224
skip("=");
231-
syntax = lower(readString());
225+
syntax = readString();
232226
isProto3 = syntax === "proto3";
233227
/* istanbul ignore next */
234228
if (!isProto3 && syntax !== "proto2")
@@ -273,23 +267,22 @@ function parse(source, root, options) {
273267
type.filename = parse.filename;
274268
if (skip("{", true)) {
275269
while ((token = next()) !== "}") {
276-
var tokenLower = lower(token);
277270
if (parseCommon(type, token))
278271
continue;
279-
switch (tokenLower) {
272+
switch (token) {
280273

281274
case "map":
282-
parseMapField(type, tokenLower);
275+
parseMapField(type, token);
283276
break;
284277

285278
case "required":
286279
case "optional":
287280
case "repeated":
288-
parseField(type, tokenLower);
281+
parseField(type, token);
289282
break;
290283

291284
case "oneof":
292-
parseOneOf(type, tokenLower);
285+
parseOneOf(type, token);
293286
break;
294287

295288
case "extensions":
@@ -363,7 +356,7 @@ function parse(source, root, options) {
363356
type.filename = field.filename = parse.filename;
364357
skip("{");
365358
while ((token = next()) !== "}") {
366-
switch (token = lower(token)) {
359+
switch (token) {
367360
case "option":
368361
parseOption(type, token);
369362
skip(";");
@@ -456,7 +449,7 @@ function parse(source, root, options) {
456449
enm.filename = parse.filename;
457450
if (skip("{", true)) {
458451
while ((token = next()) !== "}") {
459-
if (lower(token) === "option") {
452+
if (token === "option") {
460453
parseOption(enm, token);
461454
skip(";");
462455
} else
@@ -552,14 +545,13 @@ function parse(source, root, options) {
552545
service.filename = parse.filename;
553546
if (skip("{", true)) {
554547
while ((token = next()) !== "}") {
555-
var tokenLower = lower(token);
556-
switch (tokenLower) {
548+
switch (token) {
557549
case "option":
558-
parseOption(service, tokenLower);
550+
parseOption(service, token);
559551
skip(";");
560552
break;
561553
case "rpc":
562-
parseMethod(service, tokenLower);
554+
parseMethod(service, token);
563555
break;
564556

565557
/* istanbul ignore next */
@@ -604,10 +596,9 @@ function parse(source, root, options) {
604596
method.filename = parse.filename;
605597
if (skip("{", true)) {
606598
while ((token = next()) !== "}") {
607-
var tokenLower = lower(token);
608-
switch (tokenLower) {
599+
switch (token) {
609600
case "option":
610-
parseOption(method, tokenLower);
601+
parseOption(method, token);
611602
skip(";");
612603
break;
613604

@@ -634,12 +625,11 @@ function parse(source, root, options) {
634625

635626
if (skip("{", true)) {
636627
while ((token = next()) !== "}") {
637-
var tokenLower = lower(token);
638-
switch (tokenLower) {
628+
switch (token) {
639629
case "required":
640630
case "repeated":
641631
case "optional":
642-
parseField(parent, tokenLower, reference);
632+
parseField(parent, token, reference);
643633
break;
644634
default:
645635
/* istanbul ignore next */
@@ -657,8 +647,7 @@ function parse(source, root, options) {
657647

658648
var token;
659649
while ((token = next()) !== null) {
660-
var tokenLower = lower(token);
661-
switch (tokenLower) {
650+
switch (token) {
662651

663652
case "package":
664653
/* istanbul ignore next */

Diff for: tests/data/uncommon.proto

+4
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ enum Test4{
4545
TWO = 2 [(my_options) = { a: "foo" b { c: "bar" } }];
4646
};
4747

48+
enum Test4_1{
49+
OPTION = 1;
50+
}
51+
4852
service Test5;
4953

5054
service Test6 { option (custom).bar = "";

0 commit comments

Comments
 (0)