From 8893c4458b336adf827b74b13784653edf58d55d Mon Sep 17 00:00:00 2001 From: Clown Date: Fri, 4 Oct 2024 20:01:42 -0400 Subject: [PATCH] Fix including trivia in check for typeof identifier (#317) --- full-moon/src/ast/parsers.rs | 2 +- .../pass/multiline_typeof_regression/ast.snap | 190 ++++++++++++++++++ .../multiline_typeof_regression/source.lua | 2 + .../multiline_typeof_regression/tokens.snap | 158 +++++++++++++++ 4 files changed, 351 insertions(+), 1 deletion(-) create mode 100644 full-moon/tests/roblox_cases/pass/multiline_typeof_regression/ast.snap create mode 100644 full-moon/tests/roblox_cases/pass/multiline_typeof_regression/source.lua create mode 100644 full-moon/tests/roblox_cases/pass/multiline_typeof_regression/tokens.snap diff --git a/full-moon/src/ast/parsers.rs b/full-moon/src/ast/parsers.rs index 18a2d8cd..a40c764a 100644 --- a/full-moon/src/ast/parsers.rs +++ b/full-moon/src/ast/parsers.rs @@ -2345,7 +2345,7 @@ fn parse_simple_type( TokenType::Identifier { .. } => { let name = state.consume().unwrap(); - if name.to_string() == "typeof" { + if name.token.to_string() == "typeof" { let left_parenthesis = match state.require(Symbol::LeftParen, "expected `(` after `typeof`") { Some(token) => token, diff --git a/full-moon/tests/roblox_cases/pass/multiline_typeof_regression/ast.snap b/full-moon/tests/roblox_cases/pass/multiline_typeof_regression/ast.snap new file mode 100644 index 00000000..c818214b --- /dev/null +++ b/full-moon/tests/roblox_cases/pass/multiline_typeof_regression/ast.snap @@ -0,0 +1,190 @@ +--- +source: full-moon/tests/pass_cases.rs +expression: ast.nodes() +input_file: full-moon/tests/roblox_cases/pass/multiline_typeof_regression +--- +stmts: + - - TypeDeclaration: + type_token: + leading_trivia: [] + token: + start_position: + bytes: 0 + line: 1 + character: 1 + end_position: + bytes: 4 + line: 1 + character: 5 + token_type: + type: Identifier + identifier: type + trailing_trivia: + - start_position: + bytes: 4 + line: 1 + character: 5 + end_position: + bytes: 5 + line: 1 + character: 6 + token_type: + type: Whitespace + characters: " " + base: + leading_trivia: [] + token: + start_position: + bytes: 5 + line: 1 + character: 6 + end_position: + bytes: 11 + line: 1 + character: 12 + token_type: + type: Identifier + identifier: TypeOf + trailing_trivia: + - start_position: + bytes: 11 + line: 1 + character: 12 + end_position: + bytes: 12 + line: 1 + character: 13 + token_type: + type: Whitespace + characters: " " + generics: ~ + equal_token: + leading_trivia: [] + token: + start_position: + bytes: 12 + line: 1 + character: 13 + end_position: + bytes: 13 + line: 1 + character: 14 + token_type: + type: Symbol + symbol: "=" + trailing_trivia: + - start_position: + bytes: 13 + line: 1 + character: 14 + end_position: + bytes: 14 + line: 1 + character: 14 + token_type: + type: Whitespace + characters: "\n" + declare_as: + Typeof: + typeof_token: + leading_trivia: + - start_position: + bytes: 14 + line: 2 + character: 1 + end_position: + bytes: 18 + line: 2 + character: 5 + token_type: + type: Whitespace + characters: " " + token: + start_position: + bytes: 18 + line: 2 + character: 5 + end_position: + bytes: 24 + line: 2 + character: 11 + token_type: + type: Identifier + identifier: typeof + trailing_trivia: [] + parentheses: + tokens: + - leading_trivia: [] + token: + start_position: + bytes: 24 + line: 2 + character: 11 + end_position: + bytes: 25 + line: 2 + character: 12 + token_type: + type: Symbol + symbol: ( + trailing_trivia: [] + - leading_trivia: [] + token: + start_position: + bytes: 27 + line: 2 + character: 14 + end_position: + bytes: 28 + line: 2 + character: 15 + token_type: + type: Symbol + symbol: ) + trailing_trivia: + - start_position: + bytes: 28 + line: 2 + character: 15 + end_position: + bytes: 29 + line: 2 + character: 15 + token_type: + type: Whitespace + characters: "\n" + inner: + TableConstructor: + braces: + tokens: + - leading_trivia: [] + token: + start_position: + bytes: 25 + line: 2 + character: 12 + end_position: + bytes: 26 + line: 2 + character: 13 + token_type: + type: Symbol + symbol: "{" + trailing_trivia: [] + - leading_trivia: [] + token: + start_position: + bytes: 26 + line: 2 + character: 13 + end_position: + bytes: 27 + line: 2 + character: 14 + token_type: + type: Symbol + symbol: "}" + trailing_trivia: [] + fields: + pairs: [] + - ~ diff --git a/full-moon/tests/roblox_cases/pass/multiline_typeof_regression/source.lua b/full-moon/tests/roblox_cases/pass/multiline_typeof_regression/source.lua new file mode 100644 index 00000000..918ba268 --- /dev/null +++ b/full-moon/tests/roblox_cases/pass/multiline_typeof_regression/source.lua @@ -0,0 +1,2 @@ +type TypeOf = + typeof({}) diff --git a/full-moon/tests/roblox_cases/pass/multiline_typeof_regression/tokens.snap b/full-moon/tests/roblox_cases/pass/multiline_typeof_regression/tokens.snap new file mode 100644 index 00000000..b2697c3c --- /dev/null +++ b/full-moon/tests/roblox_cases/pass/multiline_typeof_regression/tokens.snap @@ -0,0 +1,158 @@ +--- +source: full-moon/tests/pass_cases.rs +expression: tokens +input_file: full-moon/tests/roblox_cases/pass/multiline_typeof_regression +--- +- start_position: + bytes: 0 + line: 1 + character: 1 + end_position: + bytes: 4 + line: 1 + character: 5 + token_type: + type: Identifier + identifier: type +- start_position: + bytes: 4 + line: 1 + character: 5 + end_position: + bytes: 5 + line: 1 + character: 6 + token_type: + type: Whitespace + characters: " " +- start_position: + bytes: 5 + line: 1 + character: 6 + end_position: + bytes: 11 + line: 1 + character: 12 + token_type: + type: Identifier + identifier: TypeOf +- start_position: + bytes: 11 + line: 1 + character: 12 + end_position: + bytes: 12 + line: 1 + character: 13 + token_type: + type: Whitespace + characters: " " +- start_position: + bytes: 12 + line: 1 + character: 13 + end_position: + bytes: 13 + line: 1 + character: 14 + token_type: + type: Symbol + symbol: "=" +- start_position: + bytes: 13 + line: 1 + character: 14 + end_position: + bytes: 14 + line: 1 + character: 14 + token_type: + type: Whitespace + characters: "\n" +- start_position: + bytes: 14 + line: 2 + character: 1 + end_position: + bytes: 18 + line: 2 + character: 5 + token_type: + type: Whitespace + characters: " " +- start_position: + bytes: 18 + line: 2 + character: 5 + end_position: + bytes: 24 + line: 2 + character: 11 + token_type: + type: Identifier + identifier: typeof +- start_position: + bytes: 24 + line: 2 + character: 11 + end_position: + bytes: 25 + line: 2 + character: 12 + token_type: + type: Symbol + symbol: ( +- start_position: + bytes: 25 + line: 2 + character: 12 + end_position: + bytes: 26 + line: 2 + character: 13 + token_type: + type: Symbol + symbol: "{" +- start_position: + bytes: 26 + line: 2 + character: 13 + end_position: + bytes: 27 + line: 2 + character: 14 + token_type: + type: Symbol + symbol: "}" +- start_position: + bytes: 27 + line: 2 + character: 14 + end_position: + bytes: 28 + line: 2 + character: 15 + token_type: + type: Symbol + symbol: ) +- start_position: + bytes: 28 + line: 2 + character: 15 + end_position: + bytes: 29 + line: 2 + character: 15 + token_type: + type: Whitespace + characters: "\n" +- start_position: + bytes: 29 + line: 3 + character: 1 + end_position: + bytes: 29 + line: 3 + character: 1 + token_type: + type: Eof