Skip to content

Commit fcc9823

Browse files
committed
Switch fillSignature boolean params to single enum
1 parent dab6827 commit fcc9823

File tree

2 files changed

+34
-30
lines changed

2 files changed

+34
-30
lines changed

src/compiler/parser.ts

Lines changed: 27 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2218,15 +2218,12 @@ namespace ts {
22182218

22192219
function fillSignature(
22202220
returnToken: SyntaxKind.ColonToken | SyntaxKind.EqualsGreaterThanToken,
2221-
yieldContext: boolean,
2222-
awaitContext: boolean,
2223-
requireCompleteParameterList: boolean,
2221+
context: SignatureContext,
22242222
signature: SignatureDeclaration): void {
2225-
2226-
const returnTokenRequired = returnToken === SyntaxKind.EqualsGreaterThanToken;
22272223
signature.typeParameters = parseTypeParameters();
2228-
signature.parameters = parseParameterList(yieldContext, awaitContext, requireCompleteParameterList);
2224+
signature.parameters = parseParameterList(context);
22292225

2226+
const returnTokenRequired = returnToken === SyntaxKind.EqualsGreaterThanToken;
22302227
if (returnTokenRequired) {
22312228
parseExpected(returnToken);
22322229
signature.type = parseTypeOrTypePredicate();
@@ -2236,7 +2233,7 @@ namespace ts {
22362233
}
22372234
}
22382235

2239-
function parseParameterList(yieldContext: boolean, awaitContext: boolean, requireCompleteParameterList: boolean) {
2236+
function parseParameterList(context: SignatureContext) {
22402237
// FormalParameters [Yield,Await]: (modified)
22412238
// [empty]
22422239
// FormalParameterList[?Yield,Await]
@@ -2254,15 +2251,15 @@ namespace ts {
22542251
const savedYieldContext = inYieldContext();
22552252
const savedAwaitContext = inAwaitContext();
22562253

2257-
setYieldContext(yieldContext);
2258-
setAwaitContext(awaitContext);
2254+
setYieldContext(!!(context & SignatureContext.Yield));
2255+
setAwaitContext(!!(context & SignatureContext.Await));
22592256

22602257
const result = parseDelimitedList(ParsingContext.Parameters, parseParameter);
22612258

22622259
setYieldContext(savedYieldContext);
22632260
setAwaitContext(savedAwaitContext);
22642261

2265-
if (!parseExpected(SyntaxKind.CloseParenToken) && requireCompleteParameterList) {
2262+
if (!parseExpected(SyntaxKind.CloseParenToken) && (context & SignatureContext.RequireCompleteParameterList)) {
22662263
// Caller insisted that we had to end with a ) We didn't. So just return
22672264
// undefined here.
22682265
return undefined;
@@ -2274,7 +2271,7 @@ namespace ts {
22742271
// We didn't even have an open paren. If the caller requires a complete parameter list,
22752272
// we definitely can't provide that. However, if they're ok with an incomplete one,
22762273
// then just return an empty set of parameters.
2277-
return requireCompleteParameterList ? undefined : createMissingList<ParameterDeclaration>();
2274+
return (context & SignatureContext.RequireCompleteParameterList) ? undefined : createMissingList<ParameterDeclaration>();
22782275
}
22792276

22802277
function parseTypeMemberSemicolon() {
@@ -2293,7 +2290,7 @@ namespace ts {
22932290
if (kind === SyntaxKind.ConstructSignature) {
22942291
parseExpected(SyntaxKind.NewKeyword);
22952292
}
2296-
fillSignature(SyntaxKind.ColonToken, /*yieldContext*/ false, /*awaitContext*/ false, /*requireCompleteParameterList*/ false, node);
2293+
fillSignature(SyntaxKind.ColonToken, SignatureContext.Type, node);
22972294
parseTypeMemberSemicolon();
22982295
return addJSDocComment(finishNode(node));
22992296
}
@@ -2383,7 +2380,7 @@ namespace ts {
23832380

23842381
// Method signatures don't exist in expression contexts. So they have neither
23852382
// [Yield] nor [Await]
2386-
fillSignature(SyntaxKind.ColonToken, /*yieldContext*/ false, /*awaitContext*/ false, /*requireCompleteParameterList*/ false, method);
2383+
fillSignature(SyntaxKind.ColonToken, SignatureContext.Type, method);
23872384
parseTypeMemberSemicolon();
23882385
return addJSDocComment(finishNode(method));
23892386
}
@@ -2527,7 +2524,7 @@ namespace ts {
25272524
if (kind === SyntaxKind.ConstructorType) {
25282525
parseExpected(SyntaxKind.NewKeyword);
25292526
}
2530-
fillSignature(SyntaxKind.EqualsGreaterThanToken, /*yieldContext*/ false, /*awaitContext*/ false, /*requireCompleteParameterList*/ false, node);
2527+
fillSignature(SyntaxKind.EqualsGreaterThanToken, SignatureContext.Type, node);
25312528
return finishNode(node);
25322529
}
25332530

@@ -3254,7 +3251,7 @@ namespace ts {
32543251
function parseParenthesizedArrowFunctionExpressionHead(allowAmbiguity: boolean): ArrowFunction {
32553252
const node = <ArrowFunction>createNode(SyntaxKind.ArrowFunction);
32563253
node.modifiers = parseModifiersForArrowFunction();
3257-
const isAsync = !!(getModifierFlags(node) & ModifierFlags.Async);
3254+
const isAsync = (getModifierFlags(node) & ModifierFlags.Async) ? SignatureContext.Await : 0;
32583255

32593256
// Arrow functions are never generators.
32603257
//
@@ -3263,7 +3260,7 @@ namespace ts {
32633260
// a => (b => c)
32643261
// And think that "(b =>" was actually a parenthesized arrow function with a missing
32653262
// close paren.
3266-
fillSignature(SyntaxKind.ColonToken, /*yieldContext*/ false, /*awaitContext*/ isAsync, /*requireCompleteParameterList*/ !allowAmbiguity, node);
3263+
fillSignature(SyntaxKind.ColonToken, isAsync | (allowAmbiguity ? 0 : SignatureContext.RequireCompleteParameterList), node);
32673264

32683265
// If we couldn't get parameters, we definitely could not parse out an arrow function.
32693266
if (!node.parameters) {
@@ -4386,16 +4383,16 @@ namespace ts {
43864383
parseExpected(SyntaxKind.FunctionKeyword);
43874384
node.asteriskToken = parseOptionalToken(SyntaxKind.AsteriskToken);
43884385

4389-
const isGenerator = !!node.asteriskToken;
4390-
const isAsync = !!(getModifierFlags(node) & ModifierFlags.Async);
4386+
const isGenerator = node.asteriskToken ? SignatureContext.Yield : 0;
4387+
const isAsync = (getModifierFlags(node) & ModifierFlags.Async) ? SignatureContext.Await : 0;
43914388
node.name =
43924389
isGenerator && isAsync ? doInYieldAndAwaitContext(parseOptionalIdentifier) :
43934390
isGenerator ? doInYieldContext(parseOptionalIdentifier) :
43944391
isAsync ? doInAwaitContext(parseOptionalIdentifier) :
43954392
parseOptionalIdentifier();
43964393

4397-
fillSignature(SyntaxKind.ColonToken, /*yieldContext*/ isGenerator, /*awaitContext*/ isAsync, /*requireCompleteParameterList*/ false, node);
4398-
node.body = parseFunctionBlock(/*allowYield*/ isGenerator, /*allowAwait*/ isAsync, /*ignoreMissingOpenBrace*/ false);
4394+
fillSignature(SyntaxKind.ColonToken, isGenerator | isAsync, node);
4395+
node.body = parseFunctionBlock(/*allowYield*/ !!isGenerator, /*allowAwait*/ !!isAsync, /*ignoreMissingOpenBrace*/ false);
43994396

44004397
if (saveDecoratorContext) {
44014398
setDecoratorContext(/*val*/ true);
@@ -5146,10 +5143,10 @@ namespace ts {
51465143
parseExpected(SyntaxKind.FunctionKeyword);
51475144
node.asteriskToken = parseOptionalToken(SyntaxKind.AsteriskToken);
51485145
node.name = hasModifier(node, ModifierFlags.Default) ? parseOptionalIdentifier() : parseIdentifier();
5149-
const isGenerator = !!node.asteriskToken;
5150-
const isAsync = hasModifier(node, ModifierFlags.Async);
5151-
fillSignature(SyntaxKind.ColonToken, /*yieldContext*/ isGenerator, /*awaitContext*/ isAsync, /*requireCompleteParameterList*/ false, node);
5152-
node.body = parseFunctionBlockOrSemicolon(isGenerator, isAsync, Diagnostics.or_expected);
5146+
const isGenerator = node.asteriskToken ? SignatureContext.Yield : 0;
5147+
const isAsync = hasModifier(node, ModifierFlags.Async) ? SignatureContext.Await : 0;
5148+
fillSignature(SyntaxKind.ColonToken, isGenerator | isAsync, node);
5149+
node.body = parseFunctionBlockOrSemicolon(!!isGenerator, !!isAsync, Diagnostics.or_expected);
51535150
return addJSDocComment(finishNode(node));
51545151
}
51555152

@@ -5158,7 +5155,7 @@ namespace ts {
51585155
node.decorators = decorators;
51595156
node.modifiers = modifiers;
51605157
parseExpected(SyntaxKind.ConstructorKeyword);
5161-
fillSignature(SyntaxKind.ColonToken, /*yieldContext*/ false, /*awaitContext*/ false, /*requireCompleteParameterList*/ false, node);
5158+
fillSignature(SyntaxKind.ColonToken, /*context*/ 0, node);
51625159
node.body = parseFunctionBlockOrSemicolon(/*isGenerator*/ false, /*isAsync*/ false, Diagnostics.or_expected);
51635160
return addJSDocComment(finishNode(node));
51645161
}
@@ -5170,10 +5167,10 @@ namespace ts {
51705167
method.asteriskToken = asteriskToken;
51715168
method.name = name;
51725169
method.questionToken = questionToken;
5173-
const isGenerator = !!asteriskToken;
5174-
const isAsync = hasModifier(method, ModifierFlags.Async);
5175-
fillSignature(SyntaxKind.ColonToken, /*yieldContext*/ isGenerator, /*awaitContext*/ isAsync, /*requireCompleteParameterList*/ false, method);
5176-
method.body = parseFunctionBlockOrSemicolon(isGenerator, isAsync, diagnosticMessage);
5170+
const isGenerator = asteriskToken ? SignatureContext.Yield : 0;
5171+
const isAsync = hasModifier(method, ModifierFlags.Async) ? SignatureContext.Await : 0;
5172+
fillSignature(SyntaxKind.ColonToken, isGenerator | isAsync, method);
5173+
method.body = parseFunctionBlockOrSemicolon(!!isGenerator, !!isAsync, diagnosticMessage);
51775174
return addJSDocComment(finishNode(method));
51785175
}
51795176

@@ -5226,7 +5223,7 @@ namespace ts {
52265223
node.decorators = decorators;
52275224
node.modifiers = modifiers;
52285225
node.name = parsePropertyName();
5229-
fillSignature(SyntaxKind.ColonToken, /*yieldContext*/ false, /*awaitContext*/ false, /*requireCompleteParameterList*/ false, node);
5226+
fillSignature(SyntaxKind.ColonToken, /*context*/ 0, node);
52305227
node.body = parseFunctionBlockOrSemicolon(/*isGenerator*/ false, /*isAsync*/ false);
52315228
return addJSDocComment(finishNode(node));
52325229
}

src/compiler/types.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,13 @@ namespace ts {
3636
end: number;
3737
}
3838

39+
export const enum SignatureContext {
40+
Yield = 1 << 1,
41+
Await = 1 << 2,
42+
Type = 1 << 3,
43+
RequireCompleteParameterList = 1 << 4,
44+
}
45+
3946
// token > SyntaxKind.Identifer => token is a keyword
4047
// Also, If you add a new SyntaxKind be sure to keep the `Markers` section at the bottom in sync
4148
export const enum SyntaxKind {

0 commit comments

Comments
 (0)