mirror of
https://github.com/danbulant/oxc
synced 2026-05-25 12:51:57 +00:00
part of https://github.com/oxc-project/backlog/issues/58 `monitor-oxc` run: https://github.com/oxc-project/monitor-oxc/actions/runs/10179047831 binary expression stack length tally using `counts` in top 100 npm packages from monitor-oxc: ``` 29772 counts ( 1) 17652 (59.3%, 59.3%): 0 ( 2) 5772 (19.4%, 78.7%): 1 ( 3) 3204 (10.8%, 89.4%): 2 ( 4) 1276 ( 4.3%, 93.7%): 3 ( 5) 616 ( 2.1%, 95.8%): 4 ( 6) 308 ( 1.0%, 96.8%): 5 ( 7) 202 ( 0.7%, 97.5%): 6 ( 8) 168 ( 0.6%, 98.1%): 7 ( 9) 114 ( 0.4%, 98.5%): 9 ( 10) 90 ( 0.3%, 98.8%): 8 ( 11) 84 ( 0.3%, 99.0%): 13 ( 12) 58 ( 0.2%, 99.2%): 10 ( 13) 48 ( 0.2%, 99.4%): 12 ( 14) 32 ( 0.1%, 99.5%): 11 ( 15) 20 ( 0.1%, 99.6%): 134 ( 16) 16 ( 0.1%, 99.6%): 18 ( 17) 16 ( 0.1%, 99.7%): 20 ( 18) 12 ( 0.0%, 99.7%): 19 ( 19) 12 ( 0.0%, 99.8%): 35 ( 20) 12 ( 0.0%, 99.8%): 51 ( 21) 10 ( 0.0%, 99.8%): 15 ( 22) 6 ( 0.0%, 99.9%): 17 ( 23) 6 ( 0.0%, 99.9%): 21 ( 24) 6 ( 0.0%, 99.9%): 45 ( 25) 4 ( 0.0%, 99.9%): 14 ( 26) 4 ( 0.0%, 99.9%): 26 ( 27) 4 ( 0.0%, 99.9%): 53 ( 28) 2 ( 0.0%, 99.9%): 172 ( 29) 2 ( 0.0%, 99.9%): 214 ( 30) 2 ( 0.0%,100.0%): 22 ( 31) 2 ( 0.0%,100.0%): 27 ( 32) 2 ( 0.0%,100.0%): 28 ( 33) 2 ( 0.0%,100.0%): 29 ( 34) 2 ( 0.0%,100.0%): 31 ( 35) 2 ( 0.0%,100.0%): 36 ( 36) 2 ( 0.0%,100.0%): 46 ( 37) 2 ( 0.0%,100.0%): 55 ```
74 lines
2.1 KiB
Rust
74 lines
2.1 KiB
Rust
pub trait GetPrecedence {
|
|
fn precedence(&self) -> Precedence;
|
|
}
|
|
|
|
/// Operator Precedence
|
|
///
|
|
/// The following values are meaningful relative position, not their individual values.
|
|
/// The relative positions are derived from the ECMA Spec by following the grammar bottom up, starting from the "Comma Operator".
|
|
///
|
|
/// Note: This differs from the the operator precedence table
|
|
/// <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#table>
|
|
/// but the relative positions are the same, as both are derived from the ECMA specification.
|
|
///
|
|
/// The values are the same as
|
|
/// [esbuild](https://github.com/evanw/esbuild/blob/78f89e41d5e8a7088f4820351c6305cc339f8820/internal/js_ast/js_ast.go#L28)
|
|
#[derive(Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd)]
|
|
#[repr(u8)]
|
|
pub enum Precedence {
|
|
Lowest = 0,
|
|
Comma = 1,
|
|
Spread = 2,
|
|
Yield = 3,
|
|
Assign = 4,
|
|
Conditional = 5,
|
|
NullishCoalescing = 6,
|
|
LogicalOr = 7,
|
|
LogicalAnd = 8,
|
|
BitwiseOr = 9,
|
|
BitwiseXor = 10,
|
|
BitwiseAnd = 11,
|
|
Equals = 12,
|
|
Compare = 13,
|
|
Shift = 14,
|
|
Add = 15,
|
|
Multiply = 16,
|
|
Exponentiation = 17,
|
|
Prefix = 18,
|
|
Postfix = 19,
|
|
New = 20,
|
|
Call = 21,
|
|
Member = 22,
|
|
}
|
|
|
|
impl Precedence {
|
|
pub fn is_right_associative(&self) -> bool {
|
|
matches!(self, Self::Exponentiation | Self::Conditional | Self::Assign)
|
|
}
|
|
|
|
pub fn is_left_associative(&self) -> bool {
|
|
matches!(
|
|
self,
|
|
Self::Lowest
|
|
| Self::Comma
|
|
| Self::Spread
|
|
| Self::Yield
|
|
| Self::NullishCoalescing
|
|
| Self::LogicalOr
|
|
| Self::LogicalAnd
|
|
| Self::BitwiseOr
|
|
| Self::BitwiseXor
|
|
| Self::BitwiseAnd
|
|
| Self::Equals
|
|
| Self::Compare
|
|
| Self::Shift
|
|
| Self::Add
|
|
| Self::Multiply
|
|
| Self::Prefix
|
|
| Self::Postfix
|
|
| Self::New
|
|
| Self::Call
|
|
| Self::Member
|
|
)
|
|
}
|
|
}
|