Skip to content

Commit 903caa3

Browse files
committed
fix safe nav format
1 parent 196895e commit 903caa3

4 files changed

Lines changed: 64 additions & 2 deletions

File tree

crates/emmylua_formatter/src/formatter/expr.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3258,17 +3258,27 @@ fn format_index_access_ir(
32583258
expr: &LuaIndexExpr,
32593259
) -> Vec<DocIR> {
32603260
let mut docs = Vec::new();
3261+
let is_safe = expr.is_safe_index();
32613262
if let Some(index_token) = expr.get_index_token() {
32623263
if index_token.is_dot() {
3264+
if is_safe {
3265+
docs.push(ir::syntax_token(LuaTokenKind::TkSafeNavigation));
3266+
}
32633267
docs.push(ir::syntax_token(LuaTokenKind::TkDot));
32643268
docs.extend(format_named_index_key_ir(expr));
32653269
} else if index_token.is_colon() {
3270+
if is_safe {
3271+
docs.push(ir::syntax_token(LuaTokenKind::TkSafeNavigation));
3272+
}
32663273
docs.push(ir::syntax_token(LuaTokenKind::TkColon));
32673274
docs.extend(format_named_index_key_ir(expr));
32683275
} else if index_token.is_safe_navigation() {
32693276
docs.push(ir::syntax_token(LuaTokenKind::TkSafeNavigation));
32703277
docs.extend(format_named_index_key_ir(expr));
32713278
} else if index_token.is_left_bracket() {
3279+
if is_safe {
3280+
docs.push(ir::syntax_token(LuaTokenKind::TkSafeNavigation));
3281+
}
32723282
docs.push(ir::syntax_token(LuaTokenKind::TkLeftBracket));
32733283
if ctx.config.spacing.space_inside_brackets {
32743284
docs.push(ir::space());

crates/emmylua_formatter/src/formatter/render/control.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -693,8 +693,12 @@ fn render_named_function_stat_source_order(
693693
kind
694694
),
695695
(
696-
Some(LuaTokenKind::TkLocal | LuaTokenKind::TkGlobal),
697-
LuaTokenKind::TkFunction
696+
Some(
697+
LuaTokenKind::TkLocal
698+
| LuaTokenKind::TkGlobal
699+
| LuaTokenKind::TkConst,
700+
),
701+
LuaTokenKind::TkFunction,
698702
)
699703
)
700704
{

crates/emmylua_formatter/src/test/statement_tests.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2013,4 +2013,15 @@ end
20132013
let result = format_text(input, LuaLanguageLevel::LuaJITExt, &config).formatted;
20142014
assert_eq!(result, expected);
20152015
}
2016+
2017+
#[test]
2018+
fn test_safe_method_colon_format() {
2019+
use crate::format_text;
2020+
use emmylua_parser::LuaLanguageLevel;
2021+
let config = LuaFormatConfig::default();
2022+
let input = "local x = MyClass.myField?.:byte(1)\n";
2023+
let expected = "local x = MyClass.myField?.:byte(1)\n";
2024+
let result = format_text(input, LuaLanguageLevel::LuaJITExt, &config).formatted;
2025+
assert_eq!(result, expected);
2026+
}
20162027
}

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

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1282,6 +1282,43 @@ Syntax(Chunk)@0..27
12821282
);
12831283
}
12841284

1285+
#[test]
1286+
fn test_safe_method_colon() {
1287+
let code = "local x = a?.field?.:method()\n";
1288+
let result = r#"
1289+
Syntax(Chunk)@0..30
1290+
Syntax(Block)@0..30
1291+
Syntax(LocalStat)@0..29
1292+
Token(TkLocal)@0..5 "local"
1293+
Token(TkWhitespace)@5..6 " "
1294+
Syntax(LocalName)@6..7
1295+
Token(TkName)@6..7 "x"
1296+
Token(TkWhitespace)@7..8 " "
1297+
Token(TkAssign)@8..9 "="
1298+
Token(TkWhitespace)@9..10 " "
1299+
Syntax(CallExpr)@10..29
1300+
Syntax(SafeIndexExpr)@10..27
1301+
Syntax(SafeIndexExpr)@10..18
1302+
Syntax(NameExpr)@10..11
1303+
Token(TkName)@10..11 "a"
1304+
Token(TkSafeNavigation)@11..13 "?."
1305+
Token(TkName)@13..18 "field"
1306+
Token(TkSafeNavigation)@18..20 "?."
1307+
Token(TkColon)@20..21 ":"
1308+
Token(TkName)@21..27 "method"
1309+
Syntax(CallArgList)@27..29
1310+
Token(TkLeftParen)@27..28 "("
1311+
Token(TkRightParen)@28..29 ")"
1312+
Token(TkEndOfLine)@29..30 "\n"
1313+
"#;
1314+
1315+
assert_ast_eq!(
1316+
code,
1317+
result,
1318+
ParserConfig::with_level(LuaLanguageLevel::LuaJITExt)
1319+
);
1320+
}
1321+
12851322
#[test]
12861323
fn test_safe_navigation_dot() {
12871324
let code = "local x = obj?.field\n";

0 commit comments

Comments
 (0)