Skip to content

Commit cd65a26

Browse files
authored
refactor: split consume(regex) as consumeType() (#569)
Fixes #313
1 parent 2ab0e5d commit cd65a26

17 files changed

+78
-53
lines changed

lib/productions/argument.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ export class Argument extends Base {
3636
if (!tokens.optional) {
3737
tokens.variadic = tokeniser.consume("...");
3838
}
39-
tokens.name = tokeniser.consume("identifier", ...argumentNameKeywords);
39+
tokens.name =
40+
tokeniser.consumeType("identifier") ||
41+
tokeniser.consume(...argumentNameKeywords);
4042
if (!tokens.name) {
4143
return tokeniser.unconsume(start_position);
4244
}

lib/productions/attribute.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ export class Attribute extends Base {
3939
type_with_extended_attributes(tokeniser, "attribute-type") ||
4040
tokeniser.error("Attribute lacks a type");
4141
tokens.name =
42-
tokeniser.consume("identifier", "async", "required") ||
42+
tokeniser.consumeType("identifier") ||
43+
tokeniser.consume("async", "required") ||
4344
tokeniser.error("Attribute lacks a name");
4445
tokens.termination =
4546
tokeniser.consume(";") ||

lib/productions/callback.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export class CallbackFunction extends Base {
1616
new CallbackFunction({ source: tokeniser.source, tokens })
1717
);
1818
tokens.name =
19-
tokeniser.consume("identifier") ||
19+
tokeniser.consumeType("identifier") ||
2020
tokeniser.error("Callback lacks a name");
2121
tokeniser.current = ret.this;
2222
tokens.assign =

lib/productions/constant.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export class Constant extends Base {
2222
let idlType = primitive_type(tokeniser);
2323
if (!idlType) {
2424
const base =
25-
tokeniser.consume("identifier") ||
25+
tokeniser.consumeType("identifier") ||
2626
tokeniser.error("Const lacks a type");
2727
idlType = new Type({ source: tokeniser.source, tokens: { base } });
2828
}
@@ -31,7 +31,8 @@ export class Constant extends Base {
3131
}
3232
idlType.type = "const-type";
3333
tokens.name =
34-
tokeniser.consume("identifier") || tokeniser.error("Const lacks a name");
34+
tokeniser.consumeType("identifier") ||
35+
tokeniser.error("Const lacks a name");
3536
tokens.assign =
3637
tokeniser.consume("=") || tokeniser.error("Const lacks value assignment");
3738
tokens.value =

lib/productions/container.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ function inheritance(tokeniser) {
1111
return {};
1212
}
1313
const inheritance =
14-
tokeniser.consume("identifier") ||
14+
tokeniser.consumeType("identifier") ||
1515
tokeniser.error("Inheritance lacks a type");
1616
return { colon, inheritance };
1717
}
@@ -26,7 +26,7 @@ export class Container extends Base {
2626
static parse(tokeniser, instance, { type, inheritable, allowedMembers }) {
2727
const { tokens } = instance;
2828
tokens.name =
29-
tokeniser.consume("identifier") ||
29+
tokeniser.consumeType("identifier") ||
3030
tokeniser.error(`Missing name in ${instance.type}`);
3131
tokeniser.current = instance;
3232
instance = autoParenter(instance);

lib/productions/default.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,16 @@ export class Default extends Base {
1212
}
1313
const def =
1414
const_value(tokeniser) ||
15-
tokeniser.consume("string", "null", "[", "{") ||
15+
tokeniser.consumeType("string") ||
16+
tokeniser.consume("null", "[", "{") ||
1617
tokeniser.error("No value for default");
1718
const expression = [def];
18-
if (def.type === "[") {
19+
if (def.value === "[") {
1920
const close =
2021
tokeniser.consume("]") ||
2122
tokeniser.error("Default sequence value must be empty");
2223
expression.push(close);
23-
} else if (def.type === "{") {
24+
} else if (def.value === "{") {
2425
const close =
2526
tokeniser.consume("}") ||
2627
tokeniser.error("Default dictionary value must be empty");

lib/productions/enum.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ class EnumValue extends Token {
77
* @param {import("../tokeniser").Tokeniser} tokeniser
88
*/
99
static parse(tokeniser) {
10-
const value = tokeniser.consume("string");
10+
const value = tokeniser.consumeType("string");
1111
if (value) {
1212
return new EnumValue({ source: tokeniser.source, tokens: { value } });
1313
}
@@ -46,7 +46,8 @@ export class Enum extends Base {
4646
return;
4747
}
4848
tokens.name =
49-
tokeniser.consume("identifier") || tokeniser.error("No name for enum");
49+
tokeniser.consumeType("identifier") ||
50+
tokeniser.error("No name for enum");
5051
const ret = autoParenter(new Enum({ source: tokeniser.source, tokens }));
5152
tokeniser.current = ret.this;
5253
tokens.open = tokeniser.consume("{") || tokeniser.error("Bodyless enum");
@@ -55,7 +56,7 @@ export class Enum extends Base {
5556
allowDangler: true,
5657
listName: "enumeration",
5758
});
58-
if (tokeniser.probe("string")) {
59+
if (tokeniser.probeType("string")) {
5960
tokeniser.error("No comma between enum values");
6061
}
6162
tokens.close =

lib/productions/extended-attributes.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ class ExtendedAttributeParameters extends Base {
5858
new ExtendedAttributeParameters({ source: tokeniser.source, tokens })
5959
);
6060
if (tokens.assign) {
61-
tokens.secondaryName = tokeniser.consume(...extAttrValueSyntax);
61+
tokens.secondaryName = tokeniser.consumeType(...extAttrValueSyntax);
6262
}
6363
tokens.open = tokeniser.consume("(");
6464
if (tokens.open) {
@@ -122,7 +122,7 @@ export class SimpleExtendedAttribute extends Base {
122122
* @param {import("../tokeniser").Tokeniser} tokeniser
123123
*/
124124
static parse(tokeniser) {
125-
const name = tokeniser.consume("identifier");
125+
const name = tokeniser.consumeType("identifier");
126126
if (name) {
127127
return new SimpleExtendedAttribute({
128128
source: tokeniser.source,

lib/productions/field.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export class Field extends Base {
2121
type_with_extended_attributes(tokeniser, "dictionary-type") ||
2222
tokeniser.error("Dictionary member lacks a type");
2323
tokens.name =
24-
tokeniser.consume("identifier") ||
24+
tokeniser.consumeType("identifier") ||
2525
tokeniser.error("Dictionary member lacks a name");
2626
ret.default = Default.parse(tokeniser);
2727
if (tokens.required && ret.default)

lib/productions/helpers.js

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,9 @@ export function list(tokeniser, { parser, allowDangler, listName = "list" }) {
4949
* @param {import("../tokeniser").Tokeniser} tokeniser
5050
*/
5151
export function const_value(tokeniser) {
52-
return tokeniser.consume(
53-
"true",
54-
"false",
55-
"Infinity",
56-
"-Infinity",
57-
"NaN",
58-
"decimal",
59-
"integer"
52+
return (
53+
tokeniser.consumeType("decimal", "integer") ||
54+
tokeniser.consume("true", "false", "Infinity", "-Infinity", "NaN")
6055
);
6156
}
6257

@@ -67,23 +62,26 @@ export function const_value(tokeniser) {
6762
*/
6863
export function const_data({ type, value }) {
6964
switch (type) {
65+
case "decimal":
66+
case "integer":
67+
return { type: "number", value };
68+
case "string":
69+
return { type: "string", value: value.slice(1, -1) };
70+
}
71+
72+
switch (value) {
7073
case "true":
7174
case "false":
72-
return { type: "boolean", value: type === "true" };
75+
return { type: "boolean", value: value === "true" };
7376
case "Infinity":
7477
case "-Infinity":
75-
return { type: "Infinity", negative: type.startsWith("-") };
78+
return { type: "Infinity", negative: value.startsWith("-") };
7679
case "[":
7780
return { type: "sequence", value: [] };
7881
case "{":
7982
return { type: "dictionary" };
80-
case "decimal":
81-
case "integer":
82-
return { type: "number", value };
83-
case "string":
84-
return { type: "string", value: value.slice(1, -1) };
8583
default:
86-
return { type };
84+
return { type: value };
8785
}
8886
}
8987

0 commit comments

Comments
 (0)