parse_js/parse/
operator.rs

1use crate::operator::Operator;
2use crate::operator::OperatorName;
3use crate::operator::OPERATORS;
4use crate::token::TokenType;
5use ahash::AHashMap;
6use once_cell::sync::Lazy;
7
8#[rustfmt::skip]
9pub static MULTARY_OPERATOR_MAPPING: Lazy<AHashMap<TokenType, &'static Operator>> = Lazy::new(|| {
10  let mut map = AHashMap::<TokenType, &'static Operator>::new();
11  map.insert(TokenType::Plus, &OPERATORS[&OperatorName::Addition]);
12  map.insert(TokenType::Equals, &OPERATORS[&OperatorName::Assignment]);
13  map.insert(TokenType::PlusEquals, &OPERATORS[&OperatorName::AssignmentAddition]);
14  map.insert(TokenType::AmpersandEquals, &OPERATORS[&OperatorName::AssignmentBitwiseAnd]);
15  map.insert(TokenType::ChevronLeftChevronLeftEquals, &OPERATORS[&OperatorName::AssignmentBitwiseLeftShift]);
16  map.insert(TokenType::BarEquals, &OPERATORS[&OperatorName::AssignmentBitwiseOr]);
17  map.insert(TokenType::ChevronRightChevronRightEquals, &OPERATORS[&OperatorName::AssignmentBitwiseRightShift]);
18  map.insert(TokenType::ChevronRightChevronRightChevronRightEquals, &OPERATORS[&OperatorName::AssignmentBitwiseUnsignedRightShift]);
19  map.insert(TokenType::CaretEquals, &OPERATORS[&OperatorName::AssignmentBitwiseXor]);
20  map.insert(TokenType::SlashEquals, &OPERATORS[&OperatorName::AssignmentDivision]);
21  map.insert(TokenType::AsteriskAsteriskEquals, &OPERATORS[&OperatorName::AssignmentExponentiation]);
22  map.insert(TokenType::AmpersandAmpersandEquals, &OPERATORS[&OperatorName::AssignmentLogicalAnd]);
23  map.insert(TokenType::BarBarEquals, &OPERATORS[&OperatorName::AssignmentLogicalOr]);
24  map.insert(TokenType::AsteriskEquals, &OPERATORS[&OperatorName::AssignmentMultiplication]);
25  map.insert(TokenType::QuestionQuestionEquals, &OPERATORS[&OperatorName::AssignmentNullishCoalescing]);
26  map.insert(TokenType::PercentEquals, &OPERATORS[&OperatorName::AssignmentRemainder]);
27  map.insert(TokenType::HyphenEquals, &OPERATORS[&OperatorName::AssignmentSubtraction]);
28  map.insert(TokenType::Ampersand, &OPERATORS[&OperatorName::BitwiseAnd]);
29  map.insert(TokenType::ChevronLeftChevronLeft, &OPERATORS[&OperatorName::BitwiseLeftShift]);
30  map.insert(TokenType::Bar, &OPERATORS[&OperatorName::BitwiseOr]);
31  map.insert(TokenType::ChevronRightChevronRight, &OPERATORS[&OperatorName::BitwiseRightShift]);
32  map.insert(TokenType::ChevronRightChevronRightChevronRight, &OPERATORS[&OperatorName::BitwiseUnsignedRightShift]);
33  map.insert(TokenType::Caret, &OPERATORS[&OperatorName::BitwiseXor]);
34  map.insert(TokenType::ParenthesisOpen, &OPERATORS[&OperatorName::Call]);
35  map.insert(TokenType::Comma, &OPERATORS[&OperatorName::Comma]);
36  map.insert(TokenType::BracketOpen, &OPERATORS[&OperatorName::ComputedMemberAccess]);
37  map.insert(TokenType::Question, &OPERATORS[&OperatorName::Conditional]);
38  map.insert(TokenType::Slash, &OPERATORS[&OperatorName::Division]);
39  map.insert(TokenType::EqualsEquals, &OPERATORS[&OperatorName::Equality]);
40  map.insert(TokenType::AsteriskAsterisk, &OPERATORS[&OperatorName::Exponentiation]);
41  map.insert(TokenType::ChevronRight, &OPERATORS[&OperatorName::GreaterThan]);
42  map.insert(TokenType::ChevronRightEquals, &OPERATORS[&OperatorName::GreaterThanOrEqual]);
43  map.insert(TokenType::KeywordIn, &OPERATORS[&OperatorName::In]);
44  map.insert(TokenType::ExclamationEquals, &OPERATORS[&OperatorName::Inequality]);
45  map.insert(TokenType::KeywordInstanceof, &OPERATORS[&OperatorName::Instanceof]);
46  map.insert(TokenType::ChevronLeft, &OPERATORS[&OperatorName::LessThan]);
47  map.insert(TokenType::ChevronLeftEquals, &OPERATORS[&OperatorName::LessThanOrEqual]);
48  map.insert(TokenType::AmpersandAmpersand, &OPERATORS[&OperatorName::LogicalAnd]);
49  map.insert(TokenType::BarBar, &OPERATORS[&OperatorName::LogicalOr]);
50  map.insert(TokenType::Dot, &OPERATORS[&OperatorName::MemberAccess]);
51  map.insert(TokenType::Asterisk, &OPERATORS[&OperatorName::Multiplication]);
52  map.insert(TokenType::QuestionQuestion, &OPERATORS[&OperatorName::NullishCoalescing]);
53  map.insert(TokenType::QuestionDot, &OPERATORS[&OperatorName::OptionalChainingMemberAccess]);
54  map.insert(TokenType::QuestionDotBracketOpen, &OPERATORS[&OperatorName::OptionalChainingComputedMemberAccess]);
55  map.insert(TokenType::QuestionDotParenthesisOpen, &OPERATORS[&OperatorName::OptionalChainingCall]);
56  map.insert(TokenType::Percent, &OPERATORS[&OperatorName::Remainder]);
57  map.insert(TokenType::EqualsEqualsEquals, &OPERATORS[&OperatorName::StrictEquality]);
58  map.insert(TokenType::ExclamationEqualsEquals, &OPERATORS[&OperatorName::StrictInequality]);
59  map.insert(TokenType::Hyphen, &OPERATORS[&OperatorName::Subtraction]);
60  map.insert(TokenType::KeywordTypeof, &OPERATORS[&OperatorName::Typeof]);
61  map
62});
63
64#[rustfmt::skip]
65pub static UNARY_OPERATOR_MAPPING: Lazy<AHashMap<TokenType, &'static Operator>> = Lazy::new(|| {
66  let mut map = AHashMap::<TokenType, &'static Operator>::new();
67  // Postfix{Increment,Decrement} and YieldDelegated omitted and handled manually.
68  map.insert(TokenType::KeywordAwait, &OPERATORS[&OperatorName::Await]);
69  map.insert(TokenType::Tilde, &OPERATORS[&OperatorName::BitwiseNot]);
70  map.insert(TokenType::KeywordDelete, &OPERATORS[&OperatorName::Delete]);
71  map.insert(TokenType::Exclamation, &OPERATORS[&OperatorName::LogicalNot]);
72  map.insert(TokenType::KeywordNew, &OPERATORS[&OperatorName::New]);
73  map.insert(TokenType::HyphenHyphen, &OPERATORS[&OperatorName::PrefixDecrement]);
74  map.insert(TokenType::PlusPlus, &OPERATORS[&OperatorName::PrefixIncrement]);
75  map.insert(TokenType::Hyphen, &OPERATORS[&OperatorName::UnaryNegation]);
76  map.insert(TokenType::Plus, &OPERATORS[&OperatorName::UnaryPlus]);
77  map.insert(TokenType::KeywordTypeof, &OPERATORS[&OperatorName::Typeof]);
78  map.insert(TokenType::KeywordVoid, &OPERATORS[&OperatorName::Void]);
79  map.insert(TokenType::KeywordYield, &OPERATORS[&OperatorName::Yield]);
80  map
81});