Skip to content

Commit 07a890d

Browse files
author
Andy
authored
Reuse getBinaryOperatorPrecedence (#22844)
* Reuse getBinaryOperatorPrecedence * Code review * Consistently sort cases in ascending order
1 parent 47d768c commit 07a890d

File tree

2 files changed

+100
-147
lines changed

2 files changed

+100
-147
lines changed

src/compiler/parser.ts

Lines changed: 3 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -3600,7 +3600,7 @@ namespace ts {
36003600
// reScanGreaterToken so that we merge token sequences like > and = into >=
36013601

36023602
reScanGreaterToken();
3603-
const newPrecedence = getBinaryOperatorPrecedence();
3603+
const newPrecedence = getBinaryOperatorPrecedence(token());
36043604

36053605
// Check the precedence to see if we should "take" this operator
36063606
// - For left associative operator (all operator but **), consume the operator,
@@ -3662,52 +3662,7 @@ namespace ts {
36623662
return false;
36633663
}
36643664

3665-
return getBinaryOperatorPrecedence() > 0;
3666-
}
3667-
3668-
function getBinaryOperatorPrecedence(): number {
3669-
switch (token()) {
3670-
case SyntaxKind.BarBarToken:
3671-
return 1;
3672-
case SyntaxKind.AmpersandAmpersandToken:
3673-
return 2;
3674-
case SyntaxKind.BarToken:
3675-
return 3;
3676-
case SyntaxKind.CaretToken:
3677-
return 4;
3678-
case SyntaxKind.AmpersandToken:
3679-
return 5;
3680-
case SyntaxKind.EqualsEqualsToken:
3681-
case SyntaxKind.ExclamationEqualsToken:
3682-
case SyntaxKind.EqualsEqualsEqualsToken:
3683-
case SyntaxKind.ExclamationEqualsEqualsToken:
3684-
return 6;
3685-
case SyntaxKind.LessThanToken:
3686-
case SyntaxKind.GreaterThanToken:
3687-
case SyntaxKind.LessThanEqualsToken:
3688-
case SyntaxKind.GreaterThanEqualsToken:
3689-
case SyntaxKind.InstanceOfKeyword:
3690-
case SyntaxKind.InKeyword:
3691-
case SyntaxKind.AsKeyword:
3692-
return 7;
3693-
case SyntaxKind.LessThanLessThanToken:
3694-
case SyntaxKind.GreaterThanGreaterThanToken:
3695-
case SyntaxKind.GreaterThanGreaterThanGreaterThanToken:
3696-
return 8;
3697-
case SyntaxKind.PlusToken:
3698-
case SyntaxKind.MinusToken:
3699-
return 9;
3700-
case SyntaxKind.AsteriskToken:
3701-
case SyntaxKind.SlashToken:
3702-
case SyntaxKind.PercentToken:
3703-
return 10;
3704-
case SyntaxKind.AsteriskAsteriskToken:
3705-
return 11;
3706-
}
3707-
3708-
// -1 is lower than all other precedences. Returning it will cause binary expression
3709-
// parsing to stop.
3710-
return -1;
3665+
return getBinaryOperatorPrecedence(token()) > 0;
37113666
}
37123667

37133668
function makeBinaryExpression(left: Expression, operatorToken: BinaryOperatorToken, right: Expression): BinaryExpression {
@@ -3795,7 +3750,7 @@ namespace ts {
37953750
if (isUpdateExpression()) {
37963751
const updateExpression = parseUpdateExpression();
37973752
return token() === SyntaxKind.AsteriskAsteriskToken ?
3798-
<BinaryExpression>parseBinaryExpressionRest(getBinaryOperatorPrecedence(), updateExpression) :
3753+
<BinaryExpression>parseBinaryExpressionRest(getBinaryOperatorPrecedence(token()), updateExpression) :
37993754
updateExpression;
38003755
}
38013756

src/compiler/utilities.ts

Lines changed: 97 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -2414,99 +2414,22 @@ namespace ts {
24142414

24152415
export function getOperatorPrecedence(nodeKind: SyntaxKind, operatorKind: SyntaxKind, hasArguments?: boolean) {
24162416
switch (nodeKind) {
2417-
case SyntaxKind.ThisKeyword:
2418-
case SyntaxKind.SuperKeyword:
2419-
case SyntaxKind.Identifier:
2420-
case SyntaxKind.NullKeyword:
2421-
case SyntaxKind.TrueKeyword:
2422-
case SyntaxKind.FalseKeyword:
2423-
case SyntaxKind.NumericLiteral:
2424-
case SyntaxKind.StringLiteral:
2425-
case SyntaxKind.ArrayLiteralExpression:
2426-
case SyntaxKind.ObjectLiteralExpression:
2427-
case SyntaxKind.FunctionExpression:
2428-
case SyntaxKind.ArrowFunction:
2429-
case SyntaxKind.ClassExpression:
2430-
case SyntaxKind.JsxElement:
2431-
case SyntaxKind.JsxSelfClosingElement:
2432-
case SyntaxKind.JsxFragment:
2433-
case SyntaxKind.RegularExpressionLiteral:
2434-
case SyntaxKind.NoSubstitutionTemplateLiteral:
2435-
case SyntaxKind.TemplateExpression:
2436-
case SyntaxKind.ParenthesizedExpression:
2437-
case SyntaxKind.OmittedExpression:
2438-
return 19;
2439-
2440-
case SyntaxKind.TaggedTemplateExpression:
2441-
case SyntaxKind.PropertyAccessExpression:
2442-
case SyntaxKind.ElementAccessExpression:
2443-
return 18;
2444-
2445-
case SyntaxKind.NewExpression:
2446-
return hasArguments ? 18 : 17;
2417+
case SyntaxKind.CommaListExpression:
2418+
return 0;
24472419

2448-
case SyntaxKind.CallExpression:
2449-
return 17;
2420+
case SyntaxKind.SpreadElement:
2421+
return 1;
24502422

2451-
case SyntaxKind.PostfixUnaryExpression:
2452-
return 16;
2423+
case SyntaxKind.YieldExpression:
2424+
return 2;
24532425

2454-
case SyntaxKind.PrefixUnaryExpression:
2455-
case SyntaxKind.TypeOfExpression:
2456-
case SyntaxKind.VoidExpression:
2457-
case SyntaxKind.DeleteExpression:
2458-
case SyntaxKind.AwaitExpression:
2459-
return 15;
2426+
case SyntaxKind.ConditionalExpression:
2427+
return 4;
24602428

24612429
case SyntaxKind.BinaryExpression:
24622430
switch (operatorKind) {
2463-
case SyntaxKind.ExclamationToken:
2464-
case SyntaxKind.TildeToken:
2465-
return 15;
2466-
2467-
case SyntaxKind.AsteriskAsteriskToken:
2468-
case SyntaxKind.AsteriskToken:
2469-
case SyntaxKind.SlashToken:
2470-
case SyntaxKind.PercentToken:
2471-
return 14;
2472-
2473-
case SyntaxKind.PlusToken:
2474-
case SyntaxKind.MinusToken:
2475-
return 13;
2476-
2477-
case SyntaxKind.LessThanLessThanToken:
2478-
case SyntaxKind.GreaterThanGreaterThanToken:
2479-
case SyntaxKind.GreaterThanGreaterThanGreaterThanToken:
2480-
return 12;
2481-
2482-
case SyntaxKind.LessThanToken:
2483-
case SyntaxKind.LessThanEqualsToken:
2484-
case SyntaxKind.GreaterThanToken:
2485-
case SyntaxKind.GreaterThanEqualsToken:
2486-
case SyntaxKind.InKeyword:
2487-
case SyntaxKind.InstanceOfKeyword:
2488-
return 11;
2489-
2490-
case SyntaxKind.EqualsEqualsToken:
2491-
case SyntaxKind.EqualsEqualsEqualsToken:
2492-
case SyntaxKind.ExclamationEqualsToken:
2493-
case SyntaxKind.ExclamationEqualsEqualsToken:
2494-
return 10;
2495-
2496-
case SyntaxKind.AmpersandToken:
2497-
return 9;
2498-
2499-
case SyntaxKind.CaretToken:
2500-
return 8;
2501-
2502-
case SyntaxKind.BarToken:
2503-
return 7;
2504-
2505-
case SyntaxKind.AmpersandAmpersandToken:
2506-
return 6;
2507-
2508-
case SyntaxKind.BarBarToken:
2509-
return 5;
2431+
case SyntaxKind.CommaToken:
2432+
return 0;
25102433

25112434
case SyntaxKind.EqualsToken:
25122435
case SyntaxKind.PlusEqualsToken:
@@ -2523,30 +2446,105 @@ namespace ts {
25232446
case SyntaxKind.BarEqualsToken:
25242447
return 3;
25252448

2526-
case SyntaxKind.CommaToken:
2527-
return 0;
2528-
25292449
default:
2530-
return -1;
2450+
return getBinaryOperatorPrecedence(operatorKind);
25312451
}
25322452

2533-
case SyntaxKind.ConditionalExpression:
2534-
return 4;
2453+
case SyntaxKind.PrefixUnaryExpression:
2454+
case SyntaxKind.TypeOfExpression:
2455+
case SyntaxKind.VoidExpression:
2456+
case SyntaxKind.DeleteExpression:
2457+
case SyntaxKind.AwaitExpression:
2458+
return 16;
25352459

2536-
case SyntaxKind.YieldExpression:
2537-
return 2;
2460+
case SyntaxKind.PostfixUnaryExpression:
2461+
return 17;
25382462

2539-
case SyntaxKind.SpreadElement:
2540-
return 1;
2463+
case SyntaxKind.CallExpression:
2464+
return 18;
25412465

2542-
case SyntaxKind.CommaListExpression:
2543-
return 0;
2466+
case SyntaxKind.NewExpression:
2467+
return hasArguments ? 19 : 18;
2468+
2469+
case SyntaxKind.TaggedTemplateExpression:
2470+
case SyntaxKind.PropertyAccessExpression:
2471+
case SyntaxKind.ElementAccessExpression:
2472+
return 19;
2473+
2474+
case SyntaxKind.ThisKeyword:
2475+
case SyntaxKind.SuperKeyword:
2476+
case SyntaxKind.Identifier:
2477+
case SyntaxKind.NullKeyword:
2478+
case SyntaxKind.TrueKeyword:
2479+
case SyntaxKind.FalseKeyword:
2480+
case SyntaxKind.NumericLiteral:
2481+
case SyntaxKind.StringLiteral:
2482+
case SyntaxKind.ArrayLiteralExpression:
2483+
case SyntaxKind.ObjectLiteralExpression:
2484+
case SyntaxKind.FunctionExpression:
2485+
case SyntaxKind.ArrowFunction:
2486+
case SyntaxKind.ClassExpression:
2487+
case SyntaxKind.JsxElement:
2488+
case SyntaxKind.JsxSelfClosingElement:
2489+
case SyntaxKind.JsxFragment:
2490+
case SyntaxKind.RegularExpressionLiteral:
2491+
case SyntaxKind.NoSubstitutionTemplateLiteral:
2492+
case SyntaxKind.TemplateExpression:
2493+
case SyntaxKind.ParenthesizedExpression:
2494+
case SyntaxKind.OmittedExpression:
2495+
return 20;
25442496

25452497
default:
25462498
return -1;
25472499
}
25482500
}
25492501

2502+
/* @internal */
2503+
export function getBinaryOperatorPrecedence(kind: SyntaxKind): number {
2504+
switch (kind) {
2505+
case SyntaxKind.BarBarToken:
2506+
return 5;
2507+
case SyntaxKind.AmpersandAmpersandToken:
2508+
return 6;
2509+
case SyntaxKind.BarToken:
2510+
return 7;
2511+
case SyntaxKind.CaretToken:
2512+
return 8;
2513+
case SyntaxKind.AmpersandToken:
2514+
return 9;
2515+
case SyntaxKind.EqualsEqualsToken:
2516+
case SyntaxKind.ExclamationEqualsToken:
2517+
case SyntaxKind.EqualsEqualsEqualsToken:
2518+
case SyntaxKind.ExclamationEqualsEqualsToken:
2519+
return 10;
2520+
case SyntaxKind.LessThanToken:
2521+
case SyntaxKind.GreaterThanToken:
2522+
case SyntaxKind.LessThanEqualsToken:
2523+
case SyntaxKind.GreaterThanEqualsToken:
2524+
case SyntaxKind.InstanceOfKeyword:
2525+
case SyntaxKind.InKeyword:
2526+
case SyntaxKind.AsKeyword:
2527+
return 11;
2528+
case SyntaxKind.LessThanLessThanToken:
2529+
case SyntaxKind.GreaterThanGreaterThanToken:
2530+
case SyntaxKind.GreaterThanGreaterThanGreaterThanToken:
2531+
return 12;
2532+
case SyntaxKind.PlusToken:
2533+
case SyntaxKind.MinusToken:
2534+
return 13;
2535+
case SyntaxKind.AsteriskToken:
2536+
case SyntaxKind.SlashToken:
2537+
case SyntaxKind.PercentToken:
2538+
return 14;
2539+
case SyntaxKind.AsteriskAsteriskToken:
2540+
return 15;
2541+
}
2542+
2543+
// -1 is lower than all other precedences. Returning it will cause binary expression
2544+
// parsing to stop.
2545+
return -1;
2546+
}
2547+
25502548
export function createDiagnosticCollection(): DiagnosticCollection {
25512549
let nonFileDiagnostics = [] as SortedArray<Diagnostic>;
25522550
const filesWithDiagnostics = [] as SortedArray<string>;

0 commit comments

Comments
 (0)