Skip to content

Commit e8c3f53

Browse files
committed
support luajit3
1 parent 46af516 commit e8c3f53

13 files changed

Lines changed: 68 additions & 23 deletions

File tree

crates/emmylua_code_analysis/src/config/configs/runtime.rs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::collections::HashMap;
22

3-
use emmylua_parser::{LuaFeatures, LuaVersionNumber, SpecialFunction};
3+
use emmylua_parser::{LuaFeatures, LuaLanguageLevel, LuaVersionNumber, SpecialFunction};
44
use schemars::JsonSchema;
55
use serde::de::Deserializer;
66
use serde::{Deserialize, Serialize};
@@ -42,6 +42,8 @@ pub enum EmmyrcLuaVersion {
4242
LuaJIT,
4343
#[serde(rename = "LuaJIT-Ext", alias = "LuaJIT Ext")]
4444
LuaJITExt,
45+
#[serde(rename = "LuaJIT3", alias = "LuaJIT 3")]
46+
LuaJIT3,
4547
/// Lua 5.2
4648
#[serde(rename = "Lua5.2", alias = "Lua 5.2")]
4749
Lua52,
@@ -66,13 +68,28 @@ impl EmmyrcLuaVersion {
6668
EmmyrcLuaVersion::Lua51 => LuaVersionNumber::new(5, 1, 0),
6769
EmmyrcLuaVersion::LuaJIT => LuaVersionNumber::LUA_JIT,
6870
EmmyrcLuaVersion::LuaJITExt => LuaVersionNumber::LUA_JIT_EXT,
71+
EmmyrcLuaVersion::LuaJIT3 => LuaVersionNumber::LUA_JIT3,
6972
EmmyrcLuaVersion::Lua52 => LuaVersionNumber::new(5, 2, 0),
7073
EmmyrcLuaVersion::Lua53 => LuaVersionNumber::new(5, 3, 0),
7174
EmmyrcLuaVersion::Lua54 => LuaVersionNumber::new(5, 4, 0),
7275
EmmyrcLuaVersion::LuaLatest => LuaVersionNumber::new(5, 4, 0),
7376
EmmyrcLuaVersion::Lua55 => LuaVersionNumber::new(5, 5, 0),
7477
}
7578
}
79+
80+
pub fn get_language_level(&self) -> LuaLanguageLevel {
81+
match self {
82+
EmmyrcLuaVersion::Lua51 => LuaLanguageLevel::Lua51,
83+
EmmyrcLuaVersion::LuaJIT => LuaLanguageLevel::LuaJIT,
84+
EmmyrcLuaVersion::LuaJITExt => LuaLanguageLevel::LuaJITExt,
85+
EmmyrcLuaVersion::LuaJIT3 => LuaLanguageLevel::LuaJIT3,
86+
EmmyrcLuaVersion::Lua52 => LuaLanguageLevel::Lua52,
87+
EmmyrcLuaVersion::Lua53 => LuaLanguageLevel::Lua53,
88+
EmmyrcLuaVersion::Lua54 => LuaLanguageLevel::Lua54,
89+
EmmyrcLuaVersion::LuaLatest => LuaLanguageLevel::Lua55,
90+
EmmyrcLuaVersion::Lua55 => LuaLanguageLevel::Lua55,
91+
}
92+
}
7693
}
7794

7895
#[allow(unused)]
@@ -127,7 +144,7 @@ impl From<EmmyrcNonStdSymbol> for LuaFeatures {
127144
match symbol {
128145
EmmyrcNonStdSymbol::DoubleSlash => LuaFeatures::DoubleSlash,
129146
EmmyrcNonStdSymbol::SlashStar => LuaFeatures::SlashStar,
130-
EmmyrcNonStdSymbol::Backtick => LuaFeatures::Backtick,
147+
EmmyrcNonStdSymbol::Backtick => LuaFeatures::StringInterpolation,
131148
EmmyrcNonStdSymbol::PlusAssign => LuaFeatures::PlusAssign,
132149
EmmyrcNonStdSymbol::MinusAssign => LuaFeatures::MinusAssign,
133150
EmmyrcNonStdSymbol::StarAssign => LuaFeatures::StarAssign,

crates/emmylua_code_analysis/src/config/mod.rs

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -94,16 +94,7 @@ impl Emmyrc {
9494
}
9595

9696
pub fn get_language_level(&self) -> LuaLanguageLevel {
97-
match self.runtime.version {
98-
EmmyrcLuaVersion::Lua51 => LuaLanguageLevel::Lua51,
99-
EmmyrcLuaVersion::Lua52 => LuaLanguageLevel::Lua52,
100-
EmmyrcLuaVersion::Lua53 => LuaLanguageLevel::Lua53,
101-
EmmyrcLuaVersion::Lua54 => LuaLanguageLevel::Lua54,
102-
EmmyrcLuaVersion::LuaJIT => LuaLanguageLevel::LuaJIT,
103-
EmmyrcLuaVersion::LuaJITExt => LuaLanguageLevel::LuaJITExt,
104-
EmmyrcLuaVersion::Lua55 => LuaLanguageLevel::Lua55,
105-
EmmyrcLuaVersion::LuaLatest => LuaLanguageLevel::Lua55,
106-
}
97+
self.runtime.version.get_language_level()
10798
}
10899

109100
pub fn pre_process_emmyrc(&mut self, workspace_root: &Path) {

crates/emmylua_formatter/src/config/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,7 @@ pub enum LuaSyntaxLevel {
428428
Lua55,
429429
LuaJIT,
430430
LuaJITExt,
431+
LuaJIT3,
431432
}
432433

433434
impl From<LuaSyntaxLevel> for emmylua_parser::LuaLanguageLevel {
@@ -440,6 +441,7 @@ impl From<LuaSyntaxLevel> for emmylua_parser::LuaLanguageLevel {
440441
LuaSyntaxLevel::Lua55 => emmylua_parser::LuaLanguageLevel::Lua55,
441442
LuaSyntaxLevel::LuaJIT => emmylua_parser::LuaLanguageLevel::LuaJIT,
442443
LuaSyntaxLevel::LuaJITExt => emmylua_parser::LuaLanguageLevel::LuaJITExt,
444+
LuaSyntaxLevel::LuaJIT3 => emmylua_parser::LuaLanguageLevel::LuaJIT3,
443445
}
444446
}
445447
}

crates/emmylua_formatter/src/formatter/spacing.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -216,9 +216,7 @@ fn analyze_token_spacing(ctx: &FormatContext, spacing: &mut SpacingModel, token:
216216
| LuaTokenKind::TkDocNew => {
217217
apply_space_rule(spacing, syntax_id, SpaceRule::Space);
218218
}
219-
LuaTokenKind::TkAssign => {
220-
apply_space_rule(spacing, syntax_id, space_around_assign(ctx.config));
221-
}
219+
222220
LuaTokenKind::TkLocal
223221
| LuaTokenKind::TkConst
224222
| LuaTokenKind::TkBreak
@@ -246,6 +244,9 @@ fn analyze_token_spacing(ctx: &FormatContext, spacing: &mut SpacingModel, token:
246244
spacing.add_token_left_expected(syntax_id, TokenSpacingExpected::Space(0));
247245
spacing.add_token_right_expected(syntax_id, TokenSpacingExpected::Space(1));
248246
}
247+
ch if ch.is_assign_op() => {
248+
apply_space_rule(spacing, syntax_id, space_around_assign(ctx.config));
249+
}
249250
_ => {}
250251
}
251252
}

crates/emmylua_parser/src/kind/lua_features.rs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,8 @@ pub enum LuaFeatures {
1111
// non-standard symbols
1212
DoubleSlash, // "//"
1313
SlashStar, // "/**/"
14-
Backtick, // "`"
1514

16-
// luajit-extension symbols
15+
// luajit2-extension symbols
1716
PlusAssign, // "+="
1817
MinusAssign, // "-="
1918
StarAssign, // "*="
@@ -37,6 +36,10 @@ pub enum LuaFeatures {
3736
SafeNavigationOperator, // "?."
3837
NilCoalescingOperator, // "??"
3938
ConstStatement, // "const"
39+
40+
// luajit3
41+
StringInterpolation, // "`"
42+
NilCoalescingAssign, // "??="
4043
}
4144

4245
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
@@ -90,8 +93,7 @@ impl LuaFeaturesSet {
9093

9194
pub fn features_luajit_extension() -> Self {
9295
let mut set = LuaFeaturesSet::features_luajit();
93-
// lua5.3+
94-
set.add(LuaFeatures::IntegerFloorDivision);
96+
9597
// luajit-extension
9698
set.add(LuaFeatures::PlusAssign);
9799
set.add(LuaFeatures::MinusAssign);
@@ -118,6 +120,17 @@ impl LuaFeaturesSet {
118120
set
119121
}
120122

123+
pub fn features_luajit3() -> Self {
124+
let mut set = LuaFeaturesSet::features_luajit_extension();
125+
// lua5.3+
126+
set.add(LuaFeatures::IntegerFloorDivision);
127+
128+
// luajit3
129+
set.add(LuaFeatures::NilCoalescingAssign);
130+
set.add(LuaFeatures::StringInterpolation);
131+
set
132+
}
133+
121134
pub fn add(&mut self, symbol: LuaFeatures) {
122135
self.0 |= 1 << (symbol as u64);
123136
}

crates/emmylua_parser/src/kind/lua_language_level.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ pub enum LuaLanguageLevel {
55
Lua51,
66
LuaJIT,
77
LuaJITExt,
8+
LuaJIT3,
89
Lua52,
910
Lua53,
1011
Lua54,
@@ -21,6 +22,7 @@ impl fmt::Display for LuaLanguageLevel {
2122
LuaLanguageLevel::Lua54 => write!(f, "Lua 5.4"),
2223
LuaLanguageLevel::LuaJIT => write!(f, "LuaJIT"),
2324
LuaLanguageLevel::LuaJITExt => write!(f, "LuaJIT-Ext"),
25+
LuaLanguageLevel::LuaJIT3 => write!(f, "LuaJIT3"),
2426
LuaLanguageLevel::Lua55 => write!(f, "Lua 5.5"),
2527
}
2628
}

crates/emmylua_parser/src/kind/lua_token_kind.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ pub enum LuaTokenKind {
7979
TkShiftRightAssign, // >>=
8080
TkShrArithmeticAssign, // ~>>=
8181
TkConcatAssign, // ..=
82+
TkNilCoalescingAssign, // ??=
8283

8384
TkNilCoalescing, // ??
8485
TkSafeNavigation, // ?.
@@ -262,6 +263,7 @@ impl LuaTokenKind {
262263
LuaTokenKind::TkTernary => "?",
263264
LuaTokenKind::TkShrArithmeticAssign => "~>>=",
264265
LuaTokenKind::TkConcatAssign => "..=",
266+
LuaTokenKind::TkNilCoalescingAssign => "??=",
265267
_ => return None,
266268
})
267269
}
@@ -312,6 +314,7 @@ impl LuaTokenKind {
312314
| LuaTokenKind::TkShiftRightAssign
313315
| LuaTokenKind::TkShrArithmeticAssign
314316
| LuaTokenKind::TkConcatAssign
317+
| LuaTokenKind::TkNilCoalescingAssign
315318
)
316319
}
317320
}

crates/emmylua_parser/src/kind/lua_version.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,12 @@ impl LuaVersionNumber {
2525
};
2626

2727
pub const LUA_JIT_EXT: Self = Self {
28+
major: 2,
29+
minor: 2,
30+
patch: 0,
31+
};
32+
33+
pub const LUA_JIT3: Self = Self {
2834
major: 3,
2935
minor: 0,
3036
patch: 0,
@@ -36,6 +42,8 @@ impl LuaVersionNumber {
3642
return Some(Self::LUA_JIT);
3743
} else if s == "JIT-Ext" {
3844
return Some(Self::LUA_JIT_EXT);
45+
} else if s == "JIT3" {
46+
return Some(Self::LUA_JIT3);
3947
}
4048

4149
let mut iter = s.split('.').map(|it| it.parse::<u32>().unwrap_or(0));

crates/emmylua_parser/src/lexer/lexer_config.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ impl LexerConfig {
1717
LuaLanguageLevel::Lua54 => LuaFeaturesSet::features_lua54(),
1818
LuaLanguageLevel::LuaJIT => LuaFeaturesSet::features_luajit(),
1919
LuaLanguageLevel::LuaJITExt => LuaFeaturesSet::features_luajit_extension(),
20+
LuaLanguageLevel::LuaJIT3 => LuaFeaturesSet::features_luajit3(),
2021
LuaLanguageLevel::Lua55 => LuaFeaturesSet::features_lua55(),
2122
},
2223
}

crates/emmylua_parser/src/lexer/lua_lexer.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ impl<'a> LuaLexer<'a> {
269269
}
270270
'"' | '\'' | '`' => {
271271
let quote = self.reader.current_char();
272-
if quote == '`' && !self.support(LuaFeatures::Backtick) {
272+
if quote == '`' && !self.support(LuaFeatures::StringInterpolation) {
273273
self.reader.bump();
274274
return LuaTokenKind::TkUnknown;
275275
}
@@ -474,6 +474,13 @@ impl<'a> LuaLexer<'a> {
474474
match self.reader.current_char() {
475475
'?' if self.support(LuaFeatures::NilCoalescingOperator) => {
476476
self.reader.bump();
477+
478+
if self.support(LuaFeatures::NilCoalescingAssign)
479+
&& self.reader.current_char() == '='
480+
{
481+
self.reader.bump();
482+
return LuaTokenKind::TkNilCoalescingAssign;
483+
}
477484
LuaTokenKind::TkNilCoalescing
478485
}
479486
'.' if self.support(LuaFeatures::SafeNavigationOperator) => {

0 commit comments

Comments
 (0)