emmylua_parser/kind/
mod.rs

1mod lua_language_level;
2mod lua_non_std_symbol;
3mod lua_operator_kind;
4mod lua_syntax_kind;
5mod lua_token_kind;
6mod lua_type_operator_kind;
7mod lua_version;
8mod lua_visibility_kind;
9
10pub use lua_language_level::LuaLanguageLevel;
11pub use lua_non_std_symbol::{LuaNonStdSymbol, LuaNonStdSymbolSet};
12pub use lua_operator_kind::{BinaryOperator, UNARY_PRIORITY, UnaryOperator};
13pub use lua_syntax_kind::LuaSyntaxKind;
14pub use lua_token_kind::LuaTokenKind;
15pub use lua_type_operator_kind::{
16    LuaTypeBinaryOperator, LuaTypeTernaryOperator, LuaTypeUnaryOperator, UNARY_TYPE_PRIORITY,
17};
18pub use lua_version::{LuaVersionCondition, LuaVersionNumber};
19pub use lua_visibility_kind::VisibilityKind;
20
21#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
22#[repr(u16)]
23pub enum LuaKind {
24    Syntax(LuaSyntaxKind),
25    Token(LuaTokenKind),
26}
27
28impl From<LuaSyntaxKind> for LuaKind {
29    fn from(kind: LuaSyntaxKind) -> Self {
30        LuaKind::Syntax(kind)
31    }
32}
33
34impl From<LuaTokenKind> for LuaKind {
35    fn from(kind: LuaTokenKind) -> Self {
36        LuaKind::Token(kind)
37    }
38}
39
40impl From<LuaKind> for LuaSyntaxKind {
41    fn from(val: LuaKind) -> Self {
42        match val {
43            LuaKind::Syntax(kind) => kind,
44            _ => LuaSyntaxKind::None,
45        }
46    }
47}
48
49impl From<LuaKind> for LuaTokenKind {
50    fn from(val: LuaKind) -> Self {
51        match val {
52            LuaKind::Token(kind) => kind,
53            _ => LuaTokenKind::None,
54        }
55    }
56}
57
58impl LuaKind {
59    pub fn is_syntax(self) -> bool {
60        matches!(self, LuaKind::Syntax(_))
61    }
62
63    pub fn is_token(self) -> bool {
64        matches!(self, LuaKind::Token(_))
65    }
66
67    pub fn to_syntax(self) -> LuaSyntaxKind {
68        match self {
69            LuaKind::Syntax(kind) => kind,
70            LuaKind::Token(_) => LuaSyntaxKind::None,
71        }
72    }
73
74    pub fn to_token(self) -> LuaTokenKind {
75        match self {
76            LuaKind::Token(kind) => kind,
77            LuaKind::Syntax(_) => LuaTokenKind::None,
78        }
79    }
80
81    pub fn get_raw(self) -> u16 {
82        match self {
83            LuaKind::Syntax(kind) => kind as u16 | 0x8000,
84            LuaKind::Token(kind) => kind as u16,
85        }
86    }
87
88    pub fn from_raw(raw: u16) -> LuaKind {
89        if raw & 0x8000 != 0 {
90            LuaKind::Syntax(unsafe { std::mem::transmute::<u16, LuaSyntaxKind>(raw & 0x7FFF) })
91        } else {
92            LuaKind::Token(unsafe { std::mem::transmute::<u16, LuaTokenKind>(raw) })
93        }
94    }
95}
96
97#[derive(Debug)]
98pub struct PriorityTable {
99    pub left: i32,
100    pub right: i32,
101}
102
103#[derive(Debug, PartialEq)]
104pub enum LuaOpKind {
105    None,
106    Unary(UnaryOperator),
107    Binary(BinaryOperator),
108    TypeUnary(LuaTypeUnaryOperator),
109    TypeBinary(LuaTypeBinaryOperator),
110    TypeTernary(LuaTypeTernaryOperator),
111}
112
113impl From<UnaryOperator> for LuaOpKind {
114    fn from(op: UnaryOperator) -> Self {
115        LuaOpKind::Unary(op)
116    }
117}
118
119impl From<BinaryOperator> for LuaOpKind {
120    fn from(op: BinaryOperator) -> Self {
121        LuaOpKind::Binary(op)
122    }
123}
124
125impl From<LuaTypeUnaryOperator> for LuaOpKind {
126    fn from(op: LuaTypeUnaryOperator) -> Self {
127        LuaOpKind::TypeUnary(op)
128    }
129}
130
131impl From<LuaTypeBinaryOperator> for LuaOpKind {
132    fn from(op: LuaTypeBinaryOperator) -> Self {
133        LuaOpKind::TypeBinary(op)
134    }
135}
136
137impl From<LuaTypeTernaryOperator> for LuaOpKind {
138    fn from(op: LuaTypeTernaryOperator) -> Self {
139        LuaOpKind::TypeTernary(op)
140    }
141}
142
143impl LuaOpKind {
144    pub fn to_unary_operator(kind: LuaTokenKind) -> UnaryOperator {
145        match kind {
146            LuaTokenKind::TkNot => UnaryOperator::OpNot,
147            LuaTokenKind::TkLen => UnaryOperator::OpLen,
148            LuaTokenKind::TkMinus => UnaryOperator::OpUnm,
149            LuaTokenKind::TkBitXor => UnaryOperator::OpBNot,
150            _ => UnaryOperator::OpNop,
151        }
152    }
153
154    pub fn to_binary_operator(kind: LuaTokenKind) -> BinaryOperator {
155        match kind {
156            LuaTokenKind::TkPlus => BinaryOperator::OpAdd,
157            LuaTokenKind::TkMinus => BinaryOperator::OpSub,
158            LuaTokenKind::TkMul => BinaryOperator::OpMul,
159            LuaTokenKind::TkMod => BinaryOperator::OpMod,
160            LuaTokenKind::TkPow => BinaryOperator::OpPow,
161            LuaTokenKind::TkDiv => BinaryOperator::OpDiv,
162            LuaTokenKind::TkIDiv => BinaryOperator::OpIDiv,
163            LuaTokenKind::TkBitAnd => BinaryOperator::OpBAnd,
164            LuaTokenKind::TkBitOr => BinaryOperator::OpBOr,
165            LuaTokenKind::TkBitXor => BinaryOperator::OpBXor,
166            LuaTokenKind::TkShl => BinaryOperator::OpShl,
167            LuaTokenKind::TkShr => BinaryOperator::OpShr,
168            LuaTokenKind::TkConcat => BinaryOperator::OpConcat,
169            LuaTokenKind::TkLt => BinaryOperator::OpLt,
170            LuaTokenKind::TkLe => BinaryOperator::OpLe,
171            LuaTokenKind::TkGt => BinaryOperator::OpGt,
172            LuaTokenKind::TkGe => BinaryOperator::OpGe,
173            LuaTokenKind::TkEq => BinaryOperator::OpEq,
174            LuaTokenKind::TkNe => BinaryOperator::OpNe,
175            LuaTokenKind::TkAnd => BinaryOperator::OpAnd,
176            LuaTokenKind::TkOr => BinaryOperator::OpOr,
177            _ => BinaryOperator::OpNop,
178        }
179    }
180
181    pub fn to_type_unary_operator(kind: LuaTokenKind) -> LuaTypeUnaryOperator {
182        match kind {
183            LuaTokenKind::TkDocKeyOf => LuaTypeUnaryOperator::Keyof,
184            LuaTokenKind::TkMinus => LuaTypeUnaryOperator::Neg,
185            _ => LuaTypeUnaryOperator::None,
186        }
187    }
188
189    pub fn to_parse_binary_operator(kind: LuaTokenKind) -> LuaTypeBinaryOperator {
190        match kind {
191            LuaTokenKind::TkDocOr => LuaTypeBinaryOperator::Union,
192            LuaTokenKind::TkDocAnd => LuaTypeBinaryOperator::Intersection,
193            LuaTokenKind::TkIn => LuaTypeBinaryOperator::In,
194            LuaTokenKind::TkDocExtends => LuaTypeBinaryOperator::Extends,
195            LuaTokenKind::TkPlus => LuaTypeBinaryOperator::Add,
196            LuaTokenKind::TkMinus => LuaTypeBinaryOperator::Sub,
197            _ => LuaTypeBinaryOperator::None,
198        }
199    }
200
201    pub fn to_type_binary_operator(kind: LuaTokenKind) -> LuaTypeBinaryOperator {
202        match kind {
203            LuaTokenKind::TkDocOr | LuaTokenKind::TkDocContinueOr => LuaTypeBinaryOperator::Union,
204            LuaTokenKind::TkDocAnd => LuaTypeBinaryOperator::Intersection,
205            LuaTokenKind::TkIn => LuaTypeBinaryOperator::In,
206            LuaTokenKind::TkDocExtends => LuaTypeBinaryOperator::Extends,
207            LuaTokenKind::TkPlus => LuaTypeBinaryOperator::Add,
208            LuaTokenKind::TkMinus => LuaTypeBinaryOperator::Sub,
209            _ => LuaTypeBinaryOperator::None,
210        }
211    }
212}