Skip to content

Commit c269d34

Browse files
committed
support luajit-ext formatter
1 parent 80419f5 commit c269d34

16 files changed

Lines changed: 72 additions & 35 deletions

File tree

README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,6 @@ emmylua_doc_cli ./src --output ./docs
198198
- [**Configuration**](./docs/config/emmyrc_json_EN.md) - Advanced configuration options
199199
- [**Formatter Guide**](./docs/emmylua_formatter/README_EN.md) - Formatter behavior, options, and usage guide
200200
- [**Annotations Reference**](./docs/emmylua_doc/annotations_EN/README.md) - Detailed annotation documentation
201-
- [**Old Formatter**](https://github.com/CppCXY/EmmyLuaCodeStyle/blob/master/README_EN.md) - Formatting and style guidelines
202201
- [**External Formatter Integration**](./docs/external_format/external_formatter_options_EN.md) - Using external formatters
203202

204203
---

crates/emmylua_formatter/src/config/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,7 @@ pub enum LuaSyntaxLevel {
427427
#[default]
428428
Lua55,
429429
LuaJIT,
430+
LuaJITExt,
430431
}
431432

432433
impl From<LuaSyntaxLevel> for emmylua_parser::LuaLanguageLevel {
@@ -438,6 +439,7 @@ impl From<LuaSyntaxLevel> for emmylua_parser::LuaLanguageLevel {
438439
LuaSyntaxLevel::Lua54 => emmylua_parser::LuaLanguageLevel::Lua54,
439440
LuaSyntaxLevel::Lua55 => emmylua_parser::LuaLanguageLevel::Lua55,
440441
LuaSyntaxLevel::LuaJIT => emmylua_parser::LuaLanguageLevel::LuaJIT,
442+
LuaSyntaxLevel::LuaJITExt => emmylua_parser::LuaLanguageLevel::LuaJITExt,
441443
}
442444
}
443445
}

crates/emmylua_formatter/src/formatter/expr.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -586,6 +586,10 @@ fn format_call_expr(ctx: &FormatContext, plan: &FormatPlan, expr: &LuaCallExpr)
586586
.map(|prefix| format_expr(ctx, plan, &prefix))
587587
.unwrap_or_default();
588588

589+
if expr.has_safe_navigation() {
590+
docs.push(ir::syntax_token(LuaTokenKind::TkSafeNavigation));
591+
}
592+
589593
let Some(args_list) = expr.get_args_list() else {
590594
return docs;
591595
};

crates/emmylua_formatter/src/formatter/spacing.rs

Lines changed: 9 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use crate::config::LuaFormatConfig;
22
use crate::ir::{self, DocIR};
33
use emmylua_parser::{
4-
BinaryOperator, LuaAstNode, LuaChunk, LuaKind, LuaSyntaxId, LuaSyntaxKind, LuaSyntaxToken,
5-
LuaTokenKind,
4+
BinaryOperator, LuaAstNode, LuaChunk, LuaKind, LuaOpKind, LuaSyntaxId, LuaSyntaxKind,
5+
LuaSyntaxToken, LuaTokenKind,
66
};
77
use smol_str::SmolStr;
88

@@ -234,10 +234,14 @@ fn analyze_token_spacing(ctx: &FormatContext, spacing: &mut SpacingModel, token:
234234
| LuaTokenKind::TkElse
235235
| LuaTokenKind::TkThen
236236
| LuaTokenKind::TkUntil
237-
| LuaTokenKind::TkIn
238-
| LuaTokenKind::TkNot => {
237+
| LuaTokenKind::TkNot
238+
| LuaTokenKind::TkIn => {
239239
apply_space_rule(spacing, syntax_id, SpaceRule::Space);
240240
}
241+
LuaTokenKind::TkToggle => {
242+
spacing.add_token_left_expected(syntax_id, TokenSpacingExpected::Space(1));
243+
spacing.add_token_right_expected(syntax_id, TokenSpacingExpected::Space(0));
244+
}
241245
LuaTokenKind::TkDocQuestion => {
242246
spacing.add_token_left_expected(syntax_id, TokenSpacingExpected::Space(0));
243247
spacing.add_token_right_expected(syntax_id, TokenSpacingExpected::Space(1));
@@ -434,31 +438,7 @@ fn comment_start_looks_like_long_comment_prefix(token: &LuaSyntaxToken) -> bool
434438
}
435439

436440
fn binary_space_rule_for_token(ctx: &FormatContext, token: &LuaSyntaxToken) -> Option<SpaceRule> {
437-
let op = match token.kind().to_token() {
438-
LuaTokenKind::TkPlus => BinaryOperator::OpAdd,
439-
LuaTokenKind::TkMinus => BinaryOperator::OpSub,
440-
LuaTokenKind::TkMul => BinaryOperator::OpMul,
441-
LuaTokenKind::TkDiv => BinaryOperator::OpDiv,
442-
LuaTokenKind::TkIDiv => BinaryOperator::OpIDiv,
443-
LuaTokenKind::TkMod => BinaryOperator::OpMod,
444-
LuaTokenKind::TkPow => BinaryOperator::OpPow,
445-
LuaTokenKind::TkConcat => BinaryOperator::OpConcat,
446-
LuaTokenKind::TkBitAnd => BinaryOperator::OpBAnd,
447-
LuaTokenKind::TkBitOr => BinaryOperator::OpBOr,
448-
LuaTokenKind::TkBitXor => BinaryOperator::OpBXor,
449-
LuaTokenKind::TkShl => BinaryOperator::OpShl,
450-
LuaTokenKind::TkShr => BinaryOperator::OpShr,
451-
LuaTokenKind::TkEq => BinaryOperator::OpEq,
452-
LuaTokenKind::TkGe => BinaryOperator::OpGe,
453-
LuaTokenKind::TkGt => BinaryOperator::OpGt,
454-
LuaTokenKind::TkLe => BinaryOperator::OpLe,
455-
LuaTokenKind::TkLt => BinaryOperator::OpLt,
456-
LuaTokenKind::TkNe => BinaryOperator::OpNe,
457-
LuaTokenKind::TkAnd => BinaryOperator::OpAnd,
458-
LuaTokenKind::TkOr => BinaryOperator::OpOr,
459-
_ => return None,
460-
};
461-
441+
let op = LuaOpKind::to_binary_operator(token.kind().to_token());
462442
Some(space_around_binary_op(op, ctx.config))
463443
}
464444

crates/emmylua_formatter/src/test/statement_tests.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2002,4 +2002,15 @@ end
20022002
let result = format_text(input, LuaLanguageLevel::LuaJITExt, &config).formatted;
20032003
assert_eq!(result, expected);
20042004
}
2005+
2006+
#[test]
2007+
fn test_safe_call_format() {
2008+
use crate::format_text;
2009+
use emmylua_parser::LuaLanguageLevel;
2010+
let config = LuaFormatConfig::default();
2011+
let input = "self.call?.()\n";
2012+
let expected = "self.call?.()\n";
2013+
let result = format_text(input, LuaLanguageLevel::LuaJITExt, &config).formatted;
2014+
assert_eq!(result, expected);
2015+
}
20052016
}

crates/emmylua_ls/src/handlers/completion/data/keywords.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,12 @@ pub const KEYWORD_COMPLETIONS: &[KeywordCompletionInfo] = &[
121121
insert_text: "local",
122122
kind: CompletionItemKind::KEYWORD,
123123
},
124+
KeywordCompletionInfo {
125+
label: "const",
126+
detail: " name = value",
127+
insert_text: "const ${1:name} = ${2:value}",
128+
kind: CompletionItemKind::SNIPPET,
129+
},
124130
KeywordCompletionInfo {
125131
label: "local function",
126132
detail: " name(...) .. end",
@@ -184,4 +190,10 @@ pub const KEYWORD_EXPR_COMPLETIONS: &[KeywordCompletionInfo] = &[
184190
insert_text: "${1:a} and ${2:b} or ${3:c}",
185191
kind: CompletionItemKind::SNIPPET,
186192
},
193+
KeywordCompletionInfo {
194+
label: "continue",
195+
detail: "",
196+
insert_text: "continue",
197+
kind: CompletionItemKind::KEYWORD,
198+
},
187199
];

crates/emmylua_ls/src/handlers/completion/providers/keywords_provider.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use emmylua_code_analysis::EmmyrcLuaVersion::LuaJITExt;
12
use emmylua_parser::{LuaAstNode, LuaKind, LuaNameExpr, LuaSyntaxKind, LuaTokenKind};
23
use lsp_types::{CompletionItem, CompletionItemLabelDetails, InsertTextFormat, InsertTextMode};
34

@@ -89,6 +90,7 @@ fn add_stat_keyword_completions(
8990
builder: &mut CompletionBuilder,
9091
name_expr: Option<LuaNameExpr>,
9192
) -> Option<()> {
93+
let level = builder.semantic_model.get_emmyrc().runtime.version;
9294
if let Some(name_expr) = name_expr
9395
&& name_expr.syntax().parent()?.parent()?.kind() != LuaSyntaxKind::Block.into()
9496
{
@@ -114,6 +116,9 @@ fn add_stat_keyword_completions(
114116
keyword_info.insert_text.to_string(),
115117
)
116118
};
119+
if level != LuaJITExt && keyword_info.label == "continue" {
120+
continue;
121+
}
117122

118123
let item = CompletionItem {
119124
label: keyword_info.label.to_string(),

crates/emmylua_ls/src/handlers/semantic_token/build_semantic_tokens.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ fn build_tokens_semantic_token(
115115
| LuaTokenKind::TkTernary
116116
| LuaTokenKind::TkSafeNavigation
117117
| LuaTokenKind::TkShrArithmetic
118+
| LuaTokenKind::TkToggle
118119
| LuaTokenKind::TkNilCoalescing => {
119120
builder.push(token, SemanticTokenTypeKind::Operator);
120121
}
@@ -292,6 +293,9 @@ fn build_tokens_semantic_token(
292293
LuaTokenKind::TkDocStart | LuaTokenKind::TkDocContinue | LuaTokenKind::TkDocContinueOr => {
293294
render_doc_at(builder, token)
294295
}
296+
ch if ch.is_assign_op() => {
297+
builder.push(token, SemanticTokenTypeKind::Operator);
298+
}
295299
_ => {}
296300
}
297301
}

crates/emmylua_parser/src/kind/lua_features.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ pub enum LuaFeatures {
2626
ShiftLeftAssign, // "<<="
2727
ShiftRightAssign, // ">>="
2828
ShrArithmeticAssign, // "~>>="
29+
ConcatAssign, // "..="
2930
DoublePipe, // "||"
3031
DoubleAmp, // "&&"
3132
Exclamation, // "!"
@@ -92,7 +93,6 @@ impl LuaFeaturesSet {
9293
// lua5.3+
9394
set.add(LuaFeatures::IntegerFloorDivision);
9495
// luajit-extension
95-
set.add(LuaFeatures::DoubleSlash);
9696
set.add(LuaFeatures::PlusAssign);
9797
set.add(LuaFeatures::MinusAssign);
9898
set.add(LuaFeatures::StarAssign);
@@ -109,6 +109,7 @@ impl LuaFeaturesSet {
109109
set.add(LuaFeatures::NotEqual);
110110
set.add(LuaFeatures::ShiftRightArithmetic);
111111
set.add(LuaFeatures::ShrArithmeticAssign);
112+
set.add(LuaFeatures::ConcatAssign);
112113
set.add(LuaFeatures::Continue);
113114
set.add(LuaFeatures::Ternary);
114115
set.add(LuaFeatures::SafeNavigationOperator);

crates/emmylua_parser/src/kind/lua_token_kind.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ pub enum LuaTokenKind {
3232
// extension keywords
3333
TkContinue, // continue
3434
TkConst, // const
35+
TkToggle, // !
3536

3637
TkWhitespace, // whitespace
3738
TkEndOfLine, // end of line
@@ -77,6 +78,7 @@ pub enum LuaTokenKind {
7778
TkShiftLeftAssign, // <<=
7879
TkShiftRightAssign, // >>=
7980
TkShrArithmeticAssign, // ~>>=
81+
TkConcatAssign, // ..=
8082

8183
TkNilCoalescing, // ??
8284
TkSafeNavigation, // ?.
@@ -201,6 +203,7 @@ impl LuaTokenKind {
201203
LuaTokenKind::TkLocal => "local",
202204
LuaTokenKind::TkNil => "nil",
203205
LuaTokenKind::TkNot => "not",
206+
LuaTokenKind::TkToggle => "!",
204207
LuaTokenKind::TkOr => "or",
205208
LuaTokenKind::TkRepeat => "repeat",
206209
LuaTokenKind::TkReturn => "return",
@@ -258,6 +261,7 @@ impl LuaTokenKind {
258261
LuaTokenKind::TkSafeNavigation => "?.",
259262
LuaTokenKind::TkTernary => "?",
260263
LuaTokenKind::TkShrArithmeticAssign => "~>>=",
264+
LuaTokenKind::TkConcatAssign => "..=",
261265
_ => return None,
262266
})
263267
}
@@ -307,6 +311,7 @@ impl LuaTokenKind {
307311
| LuaTokenKind::TkShiftLeftAssign
308312
| LuaTokenKind::TkShiftRightAssign
309313
| LuaTokenKind::TkShrArithmeticAssign
314+
| LuaTokenKind::TkConcatAssign
310315
)
311316
}
312317
}

0 commit comments

Comments
 (0)