emmylua_parser/kind/
mod.rs1mod 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}