From 07a890dbbbcd60232c309aa2bf9d993b0c33bbc5 Mon Sep 17 00:00:00 2001 From: Andy Date: Tue, 27 Mar 2018 16:38:39 -0700 Subject: [PATCH] Reuse getBinaryOperatorPrecedence (#22844) * Reuse getBinaryOperatorPrecedence * Code review * Consistently sort cases in ascending order --- src/compiler/parser.ts | 51 +-------- src/compiler/utilities.ts | 210 +++++++++++++++++++------------------- 2 files changed, 107 insertions(+), 154 deletions(-) diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 6e3ccdb5998..b5c780de934 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -3600,7 +3600,7 @@ namespace ts { // reScanGreaterToken so that we merge token sequences like > and = into >= reScanGreaterToken(); - const newPrecedence = getBinaryOperatorPrecedence(); + const newPrecedence = getBinaryOperatorPrecedence(token()); // Check the precedence to see if we should "take" this operator // - For left associative operator (all operator but **), consume the operator, @@ -3662,52 +3662,7 @@ namespace ts { return false; } - return getBinaryOperatorPrecedence() > 0; - } - - function getBinaryOperatorPrecedence(): number { - switch (token()) { - case SyntaxKind.BarBarToken: - return 1; - case SyntaxKind.AmpersandAmpersandToken: - return 2; - case SyntaxKind.BarToken: - return 3; - case SyntaxKind.CaretToken: - return 4; - case SyntaxKind.AmpersandToken: - return 5; - case SyntaxKind.EqualsEqualsToken: - case SyntaxKind.ExclamationEqualsToken: - case SyntaxKind.EqualsEqualsEqualsToken: - case SyntaxKind.ExclamationEqualsEqualsToken: - return 6; - case SyntaxKind.LessThanToken: - case SyntaxKind.GreaterThanToken: - case SyntaxKind.LessThanEqualsToken: - case SyntaxKind.GreaterThanEqualsToken: - case SyntaxKind.InstanceOfKeyword: - case SyntaxKind.InKeyword: - case SyntaxKind.AsKeyword: - return 7; - case SyntaxKind.LessThanLessThanToken: - case SyntaxKind.GreaterThanGreaterThanToken: - case SyntaxKind.GreaterThanGreaterThanGreaterThanToken: - return 8; - case SyntaxKind.PlusToken: - case SyntaxKind.MinusToken: - return 9; - case SyntaxKind.AsteriskToken: - case SyntaxKind.SlashToken: - case SyntaxKind.PercentToken: - return 10; - case SyntaxKind.AsteriskAsteriskToken: - return 11; - } - - // -1 is lower than all other precedences. Returning it will cause binary expression - // parsing to stop. - return -1; + return getBinaryOperatorPrecedence(token()) > 0; } function makeBinaryExpression(left: Expression, operatorToken: BinaryOperatorToken, right: Expression): BinaryExpression { @@ -3795,7 +3750,7 @@ namespace ts { if (isUpdateExpression()) { const updateExpression = parseUpdateExpression(); return token() === SyntaxKind.AsteriskAsteriskToken ? - parseBinaryExpressionRest(getBinaryOperatorPrecedence(), updateExpression) : + parseBinaryExpressionRest(getBinaryOperatorPrecedence(token()), updateExpression) : updateExpression; } diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 7030b3baaa8..fa49837fa84 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -2414,6 +2414,63 @@ namespace ts { export function getOperatorPrecedence(nodeKind: SyntaxKind, operatorKind: SyntaxKind, hasArguments?: boolean) { switch (nodeKind) { + case SyntaxKind.CommaListExpression: + return 0; + + case SyntaxKind.SpreadElement: + return 1; + + case SyntaxKind.YieldExpression: + return 2; + + case SyntaxKind.ConditionalExpression: + return 4; + + case SyntaxKind.BinaryExpression: + switch (operatorKind) { + case SyntaxKind.CommaToken: + return 0; + + case SyntaxKind.EqualsToken: + case SyntaxKind.PlusEqualsToken: + case SyntaxKind.MinusEqualsToken: + case SyntaxKind.AsteriskAsteriskEqualsToken: + case SyntaxKind.AsteriskEqualsToken: + case SyntaxKind.SlashEqualsToken: + case SyntaxKind.PercentEqualsToken: + case SyntaxKind.LessThanLessThanEqualsToken: + case SyntaxKind.GreaterThanGreaterThanEqualsToken: + case SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken: + case SyntaxKind.AmpersandEqualsToken: + case SyntaxKind.CaretEqualsToken: + case SyntaxKind.BarEqualsToken: + return 3; + + default: + return getBinaryOperatorPrecedence(operatorKind); + } + + case SyntaxKind.PrefixUnaryExpression: + case SyntaxKind.TypeOfExpression: + case SyntaxKind.VoidExpression: + case SyntaxKind.DeleteExpression: + case SyntaxKind.AwaitExpression: + return 16; + + case SyntaxKind.PostfixUnaryExpression: + return 17; + + case SyntaxKind.CallExpression: + return 18; + + case SyntaxKind.NewExpression: + return hasArguments ? 19 : 18; + + case SyntaxKind.TaggedTemplateExpression: + case SyntaxKind.PropertyAccessExpression: + case SyntaxKind.ElementAccessExpression: + return 19; + case SyntaxKind.ThisKeyword: case SyntaxKind.SuperKeyword: case SyntaxKind.Identifier: @@ -2435,118 +2492,59 @@ namespace ts { case SyntaxKind.TemplateExpression: case SyntaxKind.ParenthesizedExpression: case SyntaxKind.OmittedExpression: - return 19; - - case SyntaxKind.TaggedTemplateExpression: - case SyntaxKind.PropertyAccessExpression: - case SyntaxKind.ElementAccessExpression: - return 18; - - case SyntaxKind.NewExpression: - return hasArguments ? 18 : 17; - - case SyntaxKind.CallExpression: - return 17; - - case SyntaxKind.PostfixUnaryExpression: - return 16; - - case SyntaxKind.PrefixUnaryExpression: - case SyntaxKind.TypeOfExpression: - case SyntaxKind.VoidExpression: - case SyntaxKind.DeleteExpression: - case SyntaxKind.AwaitExpression: - return 15; - - case SyntaxKind.BinaryExpression: - switch (operatorKind) { - case SyntaxKind.ExclamationToken: - case SyntaxKind.TildeToken: - return 15; - - case SyntaxKind.AsteriskAsteriskToken: - case SyntaxKind.AsteriskToken: - case SyntaxKind.SlashToken: - case SyntaxKind.PercentToken: - return 14; - - case SyntaxKind.PlusToken: - case SyntaxKind.MinusToken: - return 13; - - case SyntaxKind.LessThanLessThanToken: - case SyntaxKind.GreaterThanGreaterThanToken: - case SyntaxKind.GreaterThanGreaterThanGreaterThanToken: - return 12; - - case SyntaxKind.LessThanToken: - case SyntaxKind.LessThanEqualsToken: - case SyntaxKind.GreaterThanToken: - case SyntaxKind.GreaterThanEqualsToken: - case SyntaxKind.InKeyword: - case SyntaxKind.InstanceOfKeyword: - return 11; - - case SyntaxKind.EqualsEqualsToken: - case SyntaxKind.EqualsEqualsEqualsToken: - case SyntaxKind.ExclamationEqualsToken: - case SyntaxKind.ExclamationEqualsEqualsToken: - return 10; - - case SyntaxKind.AmpersandToken: - return 9; - - case SyntaxKind.CaretToken: - return 8; - - case SyntaxKind.BarToken: - return 7; - - case SyntaxKind.AmpersandAmpersandToken: - return 6; - - case SyntaxKind.BarBarToken: - return 5; - - case SyntaxKind.EqualsToken: - case SyntaxKind.PlusEqualsToken: - case SyntaxKind.MinusEqualsToken: - case SyntaxKind.AsteriskAsteriskEqualsToken: - case SyntaxKind.AsteriskEqualsToken: - case SyntaxKind.SlashEqualsToken: - case SyntaxKind.PercentEqualsToken: - case SyntaxKind.LessThanLessThanEqualsToken: - case SyntaxKind.GreaterThanGreaterThanEqualsToken: - case SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken: - case SyntaxKind.AmpersandEqualsToken: - case SyntaxKind.CaretEqualsToken: - case SyntaxKind.BarEqualsToken: - return 3; - - case SyntaxKind.CommaToken: - return 0; - - default: - return -1; - } - - case SyntaxKind.ConditionalExpression: - return 4; - - case SyntaxKind.YieldExpression: - return 2; - - case SyntaxKind.SpreadElement: - return 1; - - case SyntaxKind.CommaListExpression: - return 0; + return 20; default: return -1; } } + /* @internal */ + export function getBinaryOperatorPrecedence(kind: SyntaxKind): number { + switch (kind) { + case SyntaxKind.BarBarToken: + return 5; + case SyntaxKind.AmpersandAmpersandToken: + return 6; + case SyntaxKind.BarToken: + return 7; + case SyntaxKind.CaretToken: + return 8; + case SyntaxKind.AmpersandToken: + return 9; + case SyntaxKind.EqualsEqualsToken: + case SyntaxKind.ExclamationEqualsToken: + case SyntaxKind.EqualsEqualsEqualsToken: + case SyntaxKind.ExclamationEqualsEqualsToken: + return 10; + case SyntaxKind.LessThanToken: + case SyntaxKind.GreaterThanToken: + case SyntaxKind.LessThanEqualsToken: + case SyntaxKind.GreaterThanEqualsToken: + case SyntaxKind.InstanceOfKeyword: + case SyntaxKind.InKeyword: + case SyntaxKind.AsKeyword: + return 11; + case SyntaxKind.LessThanLessThanToken: + case SyntaxKind.GreaterThanGreaterThanToken: + case SyntaxKind.GreaterThanGreaterThanGreaterThanToken: + return 12; + case SyntaxKind.PlusToken: + case SyntaxKind.MinusToken: + return 13; + case SyntaxKind.AsteriskToken: + case SyntaxKind.SlashToken: + case SyntaxKind.PercentToken: + return 14; + case SyntaxKind.AsteriskAsteriskToken: + return 15; + } + + // -1 is lower than all other precedences. Returning it will cause binary expression + // parsing to stop. + return -1; + } + export function createDiagnosticCollection(): DiagnosticCollection { let nonFileDiagnostics = [] as SortedArray; const filesWithDiagnostics = [] as SortedArray;