emmylua_parser/kind/
mod.rs

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