1use oxc_syntax::precedence::{GetPrecedence, Precedence};
3
4use crate::ast::{
5 AssignmentExpression, AwaitExpression, BinaryExpression, CallExpression, ChainExpression,
6 ComputedMemberExpression, ConditionalExpression, Expression, ImportExpression,
7 LogicalExpression, MemberExpression, NewExpression, PrivateFieldExpression, SequenceExpression,
8 StaticMemberExpression, TSTypeAssertion, UnaryExpression, UpdateExpression, YieldExpression,
9 match_member_expression,
10};
11
12impl GetPrecedence for Expression<'_> {
13 fn precedence(&self) -> Precedence {
14 match self {
15 Self::SequenceExpression(expr) => expr.precedence(),
16 Self::AssignmentExpression(expr) => expr.precedence(),
17 Self::YieldExpression(expr) => expr.precedence(),
18 Self::ConditionalExpression(expr) => expr.precedence(),
19 Self::LogicalExpression(expr) => expr.precedence(),
20 Self::BinaryExpression(expr) => expr.precedence(),
21 Self::UnaryExpression(expr) => expr.precedence(),
22 Self::UpdateExpression(expr) => expr.precedence(),
23 Self::AwaitExpression(expr) => expr.precedence(),
24 Self::NewExpression(expr) => expr.precedence(),
25 Self::CallExpression(expr) => expr.precedence(),
26 match_member_expression!(Self) => self.to_member_expression().precedence(),
27 _ => panic!("All cases should be covered"),
28 }
29 }
30}
31
32impl GetPrecedence for SequenceExpression<'_> {
33 fn precedence(&self) -> Precedence {
34 Precedence::Comma
35 }
36}
37
38impl GetPrecedence for YieldExpression<'_> {
39 fn precedence(&self) -> Precedence {
40 Precedence::Yield
41 }
42}
43
44impl GetPrecedence for ConditionalExpression<'_> {
45 fn precedence(&self) -> Precedence {
46 Precedence::Conditional
47 }
48}
49
50impl GetPrecedence for AssignmentExpression<'_> {
51 fn precedence(&self) -> Precedence {
52 Precedence::Assign
53 }
54}
55
56impl GetPrecedence for LogicalExpression<'_> {
57 fn precedence(&self) -> Precedence {
58 self.operator.precedence()
59 }
60}
61
62impl GetPrecedence for BinaryExpression<'_> {
63 fn precedence(&self) -> Precedence {
64 self.operator.precedence()
65 }
66}
67
68impl GetPrecedence for UnaryExpression<'_> {
69 fn precedence(&self) -> Precedence {
70 Precedence::Prefix
71 }
72}
73
74impl GetPrecedence for AwaitExpression<'_> {
75 fn precedence(&self) -> Precedence {
76 Precedence::Prefix
77 }
78}
79
80impl GetPrecedence for UpdateExpression<'_> {
81 fn precedence(&self) -> Precedence {
82 if self.prefix { Precedence::Prefix } else { Precedence::Postfix }
83 }
84}
85
86impl GetPrecedence for CallExpression<'_> {
87 fn precedence(&self) -> Precedence {
88 Precedence::Call
89 }
90}
91
92impl GetPrecedence for ImportExpression<'_> {
93 fn precedence(&self) -> Precedence {
94 Precedence::Call
95 }
96}
97
98impl GetPrecedence for NewExpression<'_> {
99 fn precedence(&self) -> Precedence {
100 Precedence::Call
101 }
102}
103
104impl GetPrecedence for ChainExpression<'_> {
105 fn precedence(&self) -> Precedence {
106 Precedence::Member
107 }
108}
109
110impl GetPrecedence for MemberExpression<'_> {
111 fn precedence(&self) -> Precedence {
112 Precedence::Member
113 }
114}
115
116impl GetPrecedence for ComputedMemberExpression<'_> {
117 fn precedence(&self) -> Precedence {
118 Precedence::Member
119 }
120}
121
122impl GetPrecedence for StaticMemberExpression<'_> {
123 fn precedence(&self) -> Precedence {
124 Precedence::Member
125 }
126}
127
128impl GetPrecedence for PrivateFieldExpression<'_> {
129 fn precedence(&self) -> Precedence {
130 Precedence::Member
131 }
132}
133
134impl GetPrecedence for TSTypeAssertion<'_> {
135 fn precedence(&self) -> Precedence {
136 Precedence::Lowest
137 }
138}