Skip to content

Commit fbba2e4

Browse files
authored
chore: Optimize parser & tokenizer logic (#1376)
1 parent 1d86695 commit fbba2e4

File tree

3 files changed

+320
-273
lines changed

3 files changed

+320
-273
lines changed

src/diagnostics.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ export abstract class DiagnosticEmitter {
275275

276276
/** Initializes this diagnostic emitter. */
277277
protected constructor(diagnostics: DiagnosticMessage[] | null = null) {
278-
if (!diagnostics) diagnostics = new Array();
278+
if (!diagnostics) diagnostics = [];
279279
this.diagnostics = diagnostics;
280280
}
281281

src/parser.ts

Lines changed: 59 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ export class Parser extends DiagnosticEmitter {
193193
namespace: NamespaceDeclaration | null = null
194194
): Statement | null {
195195
var flags = CommonFlags.NONE;
196-
var startPos: i32 = -1;
196+
var startPos = -1;
197197

198198
// check decorators
199199
var decorators: DecoratorNode[] | null = null;
@@ -209,10 +209,10 @@ export class Parser extends DiagnosticEmitter {
209209
}
210210

211211
// check modifiers
212-
var exportStart: i32 = 0;
213-
var exportEnd: i32 = 0;
214-
var defaultStart: i32 = 0;
215-
var defaultEnd: i32 = 0;
212+
var exportStart = 0;
213+
var exportEnd = 0;
214+
var defaultStart = 0;
215+
var defaultEnd = 0;
216216
if (tn.skip(Token.EXPORT)) {
217217
if (startPos < 0) startPos = tn.tokenPos;
218218
flags |= CommonFlags.EXPORT;
@@ -224,8 +224,8 @@ export class Parser extends DiagnosticEmitter {
224224
}
225225
}
226226

227-
var declareStart: i32 = 0;
228-
var declareEnd: i32 = 0;
227+
var declareStart = 0;
228+
var declareEnd = 0;
229229
var contextIsAmbient = namespace != null && namespace.is(CommonFlags.AMBIENT);
230230
if (tn.skip(Token.DECLARE)) {
231231
if (contextIsAmbient) {
@@ -700,7 +700,7 @@ export class Parser extends DiagnosticEmitter {
700700
} else {
701701
isSignature = false; // not yet known
702702
do {
703-
let paramStart: i32 = -1;
703+
let paramStart = -1;
704704
let kind = ParameterKind.DEFAULT;
705705
if (tn.skip(Token.DOT_DOT_DOT)) {
706706
paramStart = tn.tokenPos;
@@ -713,17 +713,17 @@ export class Parser extends DiagnosticEmitter {
713713
if (tn.skip(Token.COLON)) {
714714
isSignature = true;
715715
tn.discard(state);
716-
let t = this.parseType(tn, false);
717-
if (!t) return null;
718-
if (t.kind != NodeKind.NAMEDTYPE) {
716+
let type = this.parseType(tn, false);
717+
if (!type) return null;
718+
if (type.kind != NodeKind.NAMEDTYPE) {
719719
this.error(
720720
DiagnosticCode.Identifier_expected,
721-
t.range
721+
type.range
722722
);
723723
this.tryParseSignatureIsSignature = true;
724724
return null;
725725
}
726-
thisType = <NamedTypeNode>t;
726+
thisType = <NamedTypeNode>type;
727727
} else {
728728
tn.reset(state);
729729
this.tryParseSignatureIsSignature = false;
@@ -981,7 +981,7 @@ export class Parser extends DiagnosticEmitter {
981981
}
982982
}
983983
var range = Range.join(identifier.range, tn.range());
984-
if ((flags & CommonFlags.DEFINITELY_ASSIGNED) != 0 && initializer !== null) {
984+
if (initializer !== null && (flags & CommonFlags.DEFINITELY_ASSIGNED) != 0) {
985985
this.error(
986986
DiagnosticCode.A_definite_assignment_assertion_is_not_permitted_in_this_context,
987987
range
@@ -1154,29 +1154,29 @@ export class Parser extends DiagnosticEmitter {
11541154
);
11551155
let extendsType: NamedTypeNode | null = null;
11561156
if (tn.skip(Token.EXTENDS)) {
1157-
let t = this.parseType(tn);
1158-
if (!t) return null;
1159-
if (t.kind != NodeKind.NAMEDTYPE) {
1157+
let type = this.parseType(tn);
1158+
if (!type) return null;
1159+
if (type.kind != NodeKind.NAMEDTYPE) {
11601160
this.error(
11611161
DiagnosticCode.Identifier_expected,
1162-
t.range
1162+
type.range
11631163
);
11641164
return null;
11651165
}
1166-
extendsType = <NamedTypeNode>t;
1166+
extendsType = <NamedTypeNode>type;
11671167
}
11681168
let defaultType: NamedTypeNode | null = null;
11691169
if (tn.skip(Token.EQUALS)) {
1170-
let t = this.parseType(tn);
1171-
if (!t) return null;
1172-
if (t.kind != NodeKind.NAMEDTYPE) {
1170+
let type = this.parseType(tn);
1171+
if (!type) return null;
1172+
if (type.kind != NodeKind.NAMEDTYPE) {
11731173
this.error(
11741174
DiagnosticCode.Identifier_expected,
1175-
t.range
1175+
type.range
11761176
);
11771177
return null;
11781178
}
1179-
defaultType = <NamedTypeNode>t;
1179+
defaultType = <NamedTypeNode>type;
11801180
}
11811181
return Node.createTypeParameter(
11821182
identifier,
@@ -1414,7 +1414,7 @@ export class Parser extends DiagnosticEmitter {
14141414
}
14151415

14161416
var name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());
1417-
var signatureStart: i32 = -1;
1417+
var signatureStart = -1;
14181418

14191419
var typeParameters: TypeParameterNode[] | null = null;
14201420
if (tn.skip(Token.LESSTHAN)) {
@@ -1674,16 +1674,16 @@ export class Parser extends DiagnosticEmitter {
16741674

16751675
var extendsType: NamedTypeNode | null = null;
16761676
if (tn.skip(Token.EXTENDS)) {
1677-
let t = this.parseType(tn);
1678-
if (!t) return null;
1679-
if (t.kind != NodeKind.NAMEDTYPE) {
1677+
let type = this.parseType(tn);
1678+
if (!type) return null;
1679+
if (type.kind != NodeKind.NAMEDTYPE) {
16801680
this.error(
16811681
DiagnosticCode.Identifier_expected,
1682-
t.range
1682+
type.range
16831683
);
16841684
return null;
16851685
}
1686-
extendsType = <NamedTypeNode>t;
1686+
extendsType = <NamedTypeNode>type;
16871687
}
16881688

16891689
var implementsTypes: NamedTypeNode[] | null = null;
@@ -1852,7 +1852,7 @@ export class Parser extends DiagnosticEmitter {
18521852
if (!decorators) decorators = new Array();
18531853
decorators.push(decorator);
18541854
} while (tn.skip(Token.AT));
1855-
if (decorators !== null && isInterface) {
1855+
if (isInterface && decorators !== null) {
18561856
this.error(
18571857
DiagnosticCode.Decorators_are_not_valid_here,
18581858
Range.join(decorators[0].range, decorators[decorators.length - 1].range)
@@ -1940,8 +1940,8 @@ export class Parser extends DiagnosticEmitter {
19401940
if (parent.flags & CommonFlags.GENERIC) flags |= CommonFlags.GENERIC_CONTEXT;
19411941
}
19421942

1943-
var readonlyStart: i32 = 0;
1944-
var readonlyEnd: i32 = 0;
1943+
var readonlyStart = 0;
1944+
var readonlyEnd = 0;
19451945
if (tn.peek() == Token.READONLY) {
19461946
let state = tn.mark();
19471947
tn.next();
@@ -1960,11 +1960,11 @@ export class Parser extends DiagnosticEmitter {
19601960
var state = tn.mark();
19611961
var isConstructor = false;
19621962
var isGetter = false;
1963-
var getStart: i32 = 0;
1964-
var getEnd: i32 = 0;
1963+
var getStart = 0;
1964+
var getEnd = 0;
19651965
var isSetter = false;
1966-
var setStart: i32 = 0;
1967-
var setEnd: i32 = 0;
1966+
var setStart = 0;
1967+
var setEnd = 0;
19681968
if (!isInterface) {
19691969
if (tn.skip(Token.GET)) {
19701970
if (tn.peek(true, IdentifierHandling.PREFER) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {
@@ -2023,11 +2023,12 @@ export class Parser extends DiagnosticEmitter {
20232023
}
20242024
}
20252025

2026+
var isGetterOrSetter = isGetter || isSetter;
20262027
var name: IdentifierExpression;
20272028
if (isConstructor) {
20282029
name = Node.createConstructorExpression(tn.range());
20292030
} else {
2030-
if (!(isGetter || isSetter) && tn.skip(Token.OPENBRACKET)) {
2031+
if (!isGetterOrSetter && tn.skip(Token.OPENBRACKET)) {
20312032
if (!startPos) startPos = tn.tokenPos;
20322033
// TODO: also handle symbols, which might have some of these modifiers
20332034
if (flags & CommonFlags.PUBLIC) {
@@ -2091,7 +2092,7 @@ export class Parser extends DiagnosticEmitter {
20912092
DiagnosticCode.Type_parameters_cannot_appear_on_a_constructor_declaration,
20922093
tn.range(typeParametersStart, tn.pos)
20932094
); // recoverable
2094-
} else if (isGetter || isSetter) {
2095+
} else if (isGetterOrSetter) {
20952096
this.error(
20962097
DiagnosticCode.An_accessor_cannot_have_type_parameters,
20972098
tn.range(typeParametersStart, tn.pos)
@@ -2236,7 +2237,7 @@ export class Parser extends DiagnosticEmitter {
22362237
name.range
22372238
);
22382239

2239-
} else if (isGetter || isSetter) {
2240+
} else if (isGetterOrSetter) {
22402241
this.error(
22412242
DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,
22422243
name.range
@@ -3246,7 +3247,11 @@ export class Parser extends DiagnosticEmitter {
32463247
if (!label) return null;
32473248
if (tn.skip(Token.COLON)) {
32483249
statements = new Array<Statement>();
3249-
while (tn.peek() != Token.CASE && tn.nextToken != Token.DEFAULT && tn.nextToken != Token.CLOSEBRACE) {
3250+
while (
3251+
tn.peek() != Token.CASE &&
3252+
tn.nextToken != Token.DEFAULT &&
3253+
tn.nextToken != Token.CLOSEBRACE
3254+
) {
32503255
statement = this.parseStatement(tn);
32513256
if (!statement) return null;
32523257
statements.push(statement);
@@ -3264,7 +3269,11 @@ export class Parser extends DiagnosticEmitter {
32643269
} else if (tn.skip(Token.DEFAULT)) {
32653270
if (tn.skip(Token.COLON)) {
32663271
statements = new Array<Statement>();
3267-
while (tn.peek() != Token.CASE && tn.nextToken != Token.DEFAULT && tn.nextToken != Token.CLOSEBRACE) {
3272+
while (
3273+
tn.peek() != Token.CASE &&
3274+
tn.nextToken != Token.DEFAULT &&
3275+
tn.nextToken != Token.CLOSEBRACE
3276+
) {
32683277
statement = this.parseStatement(tn);
32693278
if (!statement) return null;
32703279
statements.push(statement);
@@ -3544,8 +3553,7 @@ export class Parser extends DiagnosticEmitter {
35443553
let typeArguments: TypeNode[] | null = null;
35453554
let arguments_: Expression[] | null = null;
35463555
if (
3547-
tn.skip(Token.OPENPAREN)
3548-
||
3556+
tn.skip(Token.OPENPAREN) ||
35493557
(typeArguments = this.tryParseTypeArgumentsBeforeArguments(tn)) !== null
35503558
) {
35513559
arguments_ = this.parseArguments(tn);
@@ -3845,7 +3853,7 @@ export class Parser extends DiagnosticEmitter {
38453853
var state = tn.mark();
38463854
if (!tn.skip(Token.LESSTHAN)) return null;
38473855
var start = tn.tokenPos;
3848-
var typeArguments = new Array<TypeNode>();
3856+
var typeArguments: TypeNode[] | null = null;
38493857
do {
38503858
if (tn.peek() === Token.GREATERTHAN) {
38513859
break;
@@ -3855,12 +3863,13 @@ export class Parser extends DiagnosticEmitter {
38553863
tn.reset(state);
38563864
return null;
38573865
}
3858-
typeArguments.push(type);
3866+
if (!typeArguments) typeArguments = [ type ];
3867+
else typeArguments.push(type);
38593868
} while (tn.skip(Token.COMMA));
38603869
if (tn.skip(Token.GREATERTHAN)) {
38613870
let end = tn.pos;
38623871
if (tn.skip(Token.OPENPAREN)) {
3863-
if (!typeArguments.length) {
3872+
if (!typeArguments) {
38643873
this.error(
38653874
DiagnosticCode.Type_argument_list_cannot_be_empty,
38663875
tn.range(start, end)
@@ -4153,9 +4162,9 @@ export class Parser extends DiagnosticEmitter {
41534162
): Expression {
41544163
var typeArguments: TypeNode[] | null = null;
41554164
while (
4156-
tn.skip(Token.OPENPAREN)
4157-
||
4158-
potentiallyGeneric && (typeArguments = this.tryParseTypeArgumentsBeforeArguments(tn)) !== null
4165+
tn.skip(Token.OPENPAREN) ||
4166+
potentiallyGeneric &&
4167+
(typeArguments = this.tryParseTypeArgumentsBeforeArguments(tn)) !== null
41594168
) {
41604169
let args = this.parseArguments(tn);
41614170
if (!args) break;

0 commit comments

Comments
 (0)