Skip to main content

oxc_ast/
precedence.rs

1//! [Expression precedence trait](GetPrecedence) implementations.
2use 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}