mirror of https://github.com/sveltejs/svelte
54 lines
1.2 KiB
54 lines
1.2 KiB
import { Node } from '../interfaces';
|
|
|
|
const binaryOperators: Record<string, number> = {
|
|
'**': 15,
|
|
'*': 14,
|
|
'/': 14,
|
|
'%': 14,
|
|
'+': 13,
|
|
'-': 13,
|
|
'<<': 12,
|
|
'>>': 12,
|
|
'>>>': 12,
|
|
'<': 11,
|
|
'<=': 11,
|
|
'>': 11,
|
|
'>=': 11,
|
|
'in': 11,
|
|
'instanceof': 11,
|
|
'==': 10,
|
|
'!=': 10,
|
|
'===': 10,
|
|
'!==': 10,
|
|
'&': 9,
|
|
'^': 8,
|
|
'|': 7
|
|
};
|
|
|
|
const logicalOperators: Record<string, number> = {
|
|
'&&': 6,
|
|
'||': 5
|
|
};
|
|
|
|
const precedence: Record<string, (expression?: Node) => number> = {
|
|
Literal: () => 21,
|
|
Identifier: () => 21,
|
|
ParenthesizedExpression: () => 20,
|
|
MemberExpression: () => 19,
|
|
NewExpression: () => 19, // can be 18 (if no args) but makes no practical difference
|
|
CallExpression: () => 19,
|
|
UpdateExpression: () => 17,
|
|
UnaryExpression: () => 16,
|
|
BinaryExpression: (expression: Node) => binaryOperators[expression.operator],
|
|
LogicalExpression: (expression: Node) => logicalOperators[expression.operator],
|
|
ConditionalExpression: () => 4,
|
|
AssignmentExpression: () => 3,
|
|
YieldExpression: () => 2,
|
|
SpreadElement: () => 1,
|
|
SequenceExpression: () => 0
|
|
};
|
|
|
|
// TODO make this a method of Expression
|
|
export default function getExpressionPrecedence(expression: Node) {
|
|
return expression.type in precedence ? precedence[expression.type](expression) : 0;
|
|
} |