Skip to content

Commit 35162ab

Browse files
committed
support lua5.5 global grammar
1 parent 6a1e37c commit 35162ab

File tree

11 files changed

+84
-1
lines changed

11 files changed

+84
-1
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ end
5656

5757
`CHG` When an object returned by require function is a class/enum, defining new members on it is prohibited, while tables are not restricted
5858

59+
`NEW` Support `Lua 5.5` global decl grammar
60+
5961
# 0.7.2
6062

6163
`FIX` Fix reading configuration file encoded with UTF-8 BOM

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ pub enum EmmyrcLuaVersion {
5151
/// Lua 5.4
5252
#[serde(rename = "Lua5.4", alias = "Lua 5.4")]
5353
Lua54,
54+
/// Lua 5.5
55+
#[serde(rename = "Lua5.5", alias = "Lua 5.5")]
56+
Lua55,
5457
/// Lua Latest
5558
#[serde(rename = "LuaLatest", alias = "Lua Latest")]
5659
LuaLatest,
@@ -71,6 +74,7 @@ impl EmmyrcLuaVersion {
7174
EmmyrcLuaVersion::Lua53 => LuaVersionNumber::new(5, 3, 0),
7275
EmmyrcLuaVersion::Lua54 => LuaVersionNumber::new(5, 4, 0),
7376
EmmyrcLuaVersion::LuaLatest => LuaVersionNumber::new(5, 4, 0),
77+
EmmyrcLuaVersion::Lua55 => LuaVersionNumber::new(5, 5, 0),
7478
}
7579
}
7680
}

crates/emmylua_code_analysis/src/config/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ impl Emmyrc {
7070
EmmyrcLuaVersion::Lua54 => LuaLanguageLevel::Lua54,
7171
EmmyrcLuaVersion::LuaJIT => LuaLanguageLevel::LuaJIT,
7272
EmmyrcLuaVersion::LuaLatest => LuaLanguageLevel::Lua54,
73+
EmmyrcLuaVersion::Lua55 => LuaLanguageLevel::Lua55,
7374
};
7475

7576
let mut special_like = HashMap::new();

crates/emmylua_parser/src/grammar/lua/stat.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ fn parse_stat(p: &mut LuaParser) -> ParseResult {
5454
LuaTokenKind::TkGoto => parse_goto(p)?,
5555
LuaTokenKind::TkDbColon => parse_label_stat(p)?,
5656
LuaTokenKind::TkSemicolon => parse_empty_stat(p)?,
57+
LuaTokenKind::TkGlobal => parse_global_stat(p)?,
5758
_ => parse_assign_or_expr_stat(p)?,
5859
};
5960

@@ -316,6 +317,20 @@ fn parse_empty_stat(p: &mut LuaParser) -> ParseResult {
316317
Ok(m.complete(p))
317318
}
318319

320+
fn parse_global_stat(p: &mut LuaParser) -> ParseResult {
321+
let m = p.mark(LuaSyntaxKind::GlobalStat);
322+
p.bump();
323+
expect_token(p, LuaTokenKind::TkName)?;
324+
325+
while p.current_token() == LuaTokenKind::TkComma {
326+
p.bump();
327+
expect_token(p, LuaTokenKind::TkName)?;
328+
}
329+
330+
if_token_bump(p, LuaTokenKind::TkSemicolon);
331+
Ok(m.complete(p))
332+
}
333+
319334
fn parse_assign_or_expr_stat(p: &mut LuaParser) -> ParseResult {
320335
let mut m = p.mark(LuaSyntaxKind::AssignStat);
321336
let range = p.current_token_range();

crates/emmylua_parser/src/grammar/lua/test.rs

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#[cfg(test)]
22
mod tests {
3-
use crate::{parser::ParserConfig, LuaParser};
3+
use crate::{parser::ParserConfig, LuaLanguageLevel, LuaParser};
44

55
macro_rules! assert_ast_eq {
66
($lua_code:expr, $expected:expr) => {
@@ -9,6 +9,12 @@ mod tests {
99
let expected = $expected.trim().to_string();
1010
assert_eq!(result, expected);
1111
};
12+
($lua_code:expr, $expected:expr, $config:expr) => {
13+
let tree = LuaParser::parse($lua_code, $config);
14+
let result = format!("{:#?}", tree.get_red_root()).trim().to_string();
15+
let expected = $expected.trim().to_string();
16+
assert_eq!(result, expected);
17+
};
1218
}
1319

1420
#[allow(unused)]
@@ -17,6 +23,12 @@ mod tests {
1723
println!("{:#?}", tree.get_red_root());
1824
}
1925

26+
#[allow(unused)]
27+
fn print_ast_config(lua_code: &str, config: ParserConfig) {
28+
let tree = LuaParser::parse(lua_code, config);
29+
println!("{:#?}", tree.get_red_root());
30+
}
31+
2032
#[test]
2133
fn test_full_lua_syntax() {
2234
let code = r#"
@@ -1115,4 +1127,27 @@ Syntax(Chunk)@0..4
11151127

11161128
assert_ast_eq!(code, result);
11171129
}
1130+
1131+
#[test]
1132+
fn test_lua55_global_grammar() {
1133+
let code = "global a, b;";
1134+
let result = r#"
1135+
Syntax(Chunk)@0..12
1136+
Syntax(Block)@0..12
1137+
Syntax(GlobalStat)@0..12
1138+
Token(TkGlobal)@0..6 "global"
1139+
Token(TkWhitespace)@6..7 " "
1140+
Token(TkName)@7..8 "a"
1141+
Token(TkComma)@8..9 ","
1142+
Token(TkWhitespace)@9..10 " "
1143+
Token(TkName)@10..11 "b"
1144+
Token(TkSemicolon)@11..12 ";"
1145+
"#;
1146+
1147+
assert_ast_eq!(
1148+
code,
1149+
result,
1150+
ParserConfig::with_level(LuaLanguageLevel::Lua55)
1151+
);
1152+
}
11181153
}

crates/emmylua_parser/src/kind/lua_language_level.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ pub enum LuaLanguageLevel {
77
Lua53,
88
Lua54,
99
LuaJIT,
10+
Lua55,
1011
}
1112

1213
impl fmt::Display for LuaLanguageLevel {
@@ -17,6 +18,7 @@ impl fmt::Display for LuaLanguageLevel {
1718
LuaLanguageLevel::Lua53 => write!(f, "Lua 5.3"),
1819
LuaLanguageLevel::Lua54 => write!(f, "Lua 5.4"),
1920
LuaLanguageLevel::LuaJIT => write!(f, "LuaJIT"),
21+
LuaLanguageLevel::Lua55 => write!(f, "Lua 5.5"),
2022
}
2123
}
2224
}

crates/emmylua_parser/src/kind/lua_syntax_kind.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ pub enum LuaSyntaxKind {
2727
GotoStat,
2828
CallExprStat,
2929
AssignStat,
30+
GlobalStat,
3031
UnknownStat,
3132

3233
// expressions

crates/emmylua_parser/src/kind/lua_token_kind.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ pub enum LuaTokenKind {
2727
TkTrue,
2828
TkUntil,
2929
TkWhile,
30+
TkGlobal, // global *
3031

3132
TkWhitespace, // whitespace
3233
TkEndOfLine, // end of line

crates/emmylua_parser/src/lexer/lexer_config.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ impl LexerConfig {
4444
| LuaLanguageLevel::LuaJIT
4545
)
4646
}
47+
48+
pub fn support_global_decl(&self) -> bool {
49+
matches!(self.language_level, LuaLanguageLevel::Lua55)
50+
}
4751
}
4852

4953
impl Default for LexerConfig {

crates/emmylua_parser/src/lexer/lua_lexer.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,13 @@ impl LuaLexer<'_> {
6666
"true" => LuaTokenKind::TkTrue,
6767
"until" => LuaTokenKind::TkUntil,
6868
"while" => LuaTokenKind::TkWhile,
69+
"global" => {
70+
if self.lexer_config.support_global_decl() {
71+
LuaTokenKind::TkGlobal
72+
} else {
73+
LuaTokenKind::TkName
74+
}
75+
}
6976
_ => LuaTokenKind::TkName,
7077
}
7178
}

0 commit comments

Comments
 (0)