From 4b429ce0716136fb213c52349a1c0ca9a7b88738 Mon Sep 17 00:00:00 2001 From: Robert Sipka Date: Tue, 22 Jul 2025 16:06:09 +0200 Subject: [PATCH] Handle predefined type names in locals Issue: #ICO45T Internal issue: 28086 Change-Id: Iadc897acd2fef51e3e4662d4c26593743eb986a6 Signed-off-by: Robert Sipka --- ets2panda/lexer/scripts/keywords.yaml | 26 +++++++++---------- ets2panda/parser/ETSparser.cpp | 7 ++++- ets2panda/parser/ETSparser.h | 3 +++ ets2panda/parser/parserImpl.cpp | 3 +-- ets2panda/parser/parserImpl.h | 5 ++++ .../test/ast/parser/ets/InvalidParserImpl.ets | 4 +-- .../test/ast/parser/ets/ambient_indexer_3.ets | 2 +- .../ast/parser/ets/circular_type_in_alias.ets | 4 +-- .../ets/typenode_clone_comprehensive.ets | 2 +- .../test/ast/parser/ets/user_defined_20.ets | 3 +-- .../test/ast/parser/ets/user_defined_21.ets | 3 +-- .../test/ast/parser/ets/user_defined_5.ets | 4 +-- .../test/ast/parser/ets/user_defined_7.ets | 4 +-- .../test/ast/parser/ets/user_defined_8.ets | 4 +-- .../test/ast/parser/ets/user_defined_9.ets | 4 +-- 15 files changed, 39 insertions(+), 39 deletions(-) diff --git a/ets2panda/lexer/scripts/keywords.yaml b/ets2panda/lexer/scripts/keywords.yaml index de7a45f209..800f183c3b 100644 --- a/ets2panda/lexer/scripts/keywords.yaml +++ b/ets2panda/lexer/scripts/keywords.yaml @@ -68,9 +68,9 @@ keywords: - name: 'bigint' token: KEYW_BIGINT keyword_like: [ets, ts] - flags: [definable_type_name] + flags: [predefined_type] - - name: 'Bigint' + - name: 'BigInt' token: KEYW_BUILTIN_BIGINT keyword_like: [ets] flags: [predefined_type] @@ -79,7 +79,7 @@ keywords: token: KEYW_BOOLEAN keyword: [ets] keyword_like: [js, ts] - flags: [reserved_type_name, definable_type_name] + flags: [reserved_type_name, predefined_type] - name: 'Boolean' token: KEYW_BUILTIN_BOOLEAN @@ -94,7 +94,7 @@ keywords: - name: 'byte' token: KEYW_BYTE keyword: [ets] - flags: [reserved_type_name, definable_type_name] + flags: [reserved_type_name, predefined_type] - name: 'Byte' token: KEYW_BUILTIN_BYTE @@ -114,7 +114,7 @@ keywords: - name: 'char' token: KEYW_CHAR keyword: [ets] - flags: [reserved_type_name, definable_type_name] + flags: [reserved_type_name, predefined_type] - name: 'Char' token: KEYW_BUILTIN_CHAR @@ -168,7 +168,7 @@ keywords: - name: 'double' token: KEYW_DOUBLE keyword: [ets] - flags: [reserved_type_name, definable_type_name] + flags: [reserved_type_name, predefined_type] - name: 'Double' token: KEYW_BUILTIN_DOUBLE @@ -229,7 +229,7 @@ keywords: - name: 'float' token: KEYW_FLOAT keyword: [ets] - flags: [reserved_type_name, definable_type_name] + flags: [reserved_type_name, predefined_type] - name: 'Float' token: KEYW_BUILTIN_FLOAT @@ -319,7 +319,7 @@ keywords: - name: 'int' token: KEYW_INT keyword: [ets] - flags: [reserved_type_name, definable_type_name] + flags: [reserved_type_name, predefined_type] - name: 'Int' token: KEYW_BUILTIN_INT @@ -350,7 +350,7 @@ keywords: - name: 'long' token: KEYW_LONG keyword: [ets] - flags: [reserved_type_name, definable_type_name] + flags: [reserved_type_name, predefined_type] - name: 'Long' token: KEYW_BUILTIN_LONG @@ -474,7 +474,7 @@ keywords: - name: 'short' token: KEYW_SHORT keyword: [ets] - flags: [reserved_type_name, definable_type_name] + flags: [reserved_type_name, predefined_type] - name: 'Short' token: KEYW_BUILTIN_SHORT @@ -488,7 +488,7 @@ keywords: - name: 'string' token: KEYW_STRING keyword_like: [ets, ts] - flags: [definable_type_name] + flags: [predefined_type] - name: 'String' token: KEYW_BUILTIN_STRING @@ -498,7 +498,7 @@ keywords: - name: 'struct' token: KEYW_STRUCT keyword_like: [ets] - flags: [definable_type_name] + flags: [reserved_type_name] - name: 'super' token: KEYW_SUPER @@ -584,7 +584,7 @@ keywords: - name: 'void' token: KEYW_VOID keyword: [as, ets, js, ts] - flags: [unary, reserved_type_name, definable_type_name] + flags: [unary, reserved_type_name, predefined_type] - name: 'while' token: KEYW_WHILE diff --git a/ets2panda/parser/ETSparser.cpp b/ets2panda/parser/ETSparser.cpp index d997007463..7847a5b899 100644 --- a/ets2panda/parser/ETSparser.cpp +++ b/ets2panda/parser/ETSparser.cpp @@ -99,6 +99,11 @@ bool ETSParser::IsETSParser() const noexcept return true; } +bool ETSParser::IsValidIdentifierName(const lexer::Token &token) const noexcept +{ + return !token.IsPredefinedType() || util::Helpers::IsStdLib(GetProgram()); +} + std::unique_ptr ETSParser::InitLexer(const SourceFile &sourceFile) { GetProgram()->SetSource(sourceFile); @@ -1078,7 +1083,7 @@ ir::TypeNode *ETSParser::ParseBaseTypeReference(TypeAnnotationParsingOptions *op ir::TypeNode *ETSParser::ParseLiteralIdent(TypeAnnotationParsingOptions *options) { - if (Lexer()->GetToken().IsDefinableTypeName()) { + if (Lexer()->GetToken().IsPredefinedType()) { return GetTypeAnnotationOfPrimitiveType(Lexer()->GetToken().KeywordType(), options); } diff --git a/ets2panda/parser/ETSparser.h b/ets2panda/parser/ETSparser.h index 4e528d725f..bd8fcb7b1c 100644 --- a/ets2panda/parser/ETSparser.h +++ b/ets2panda/parser/ETSparser.h @@ -66,6 +66,9 @@ public: } [[nodiscard]] bool IsETSParser() const noexcept override; + + [[nodiscard]] bool IsValidIdentifierName(const lexer::Token &token) const noexcept override; + void AddDirectImportsToDirectExternalSources(const ArenaVector &directImportsFromMainSource, parser::Program *newProg) const; bool CheckDupAndReplace(Program *&oldProg, Program *newProg) const; diff --git a/ets2panda/parser/parserImpl.cpp b/ets2panda/parser/parserImpl.cpp index 409e4ef4f6..b9be71ce60 100644 --- a/ets2panda/parser/parserImpl.cpp +++ b/ets2panda/parser/parserImpl.cpp @@ -1334,8 +1334,7 @@ ir::Identifier *ParserImpl::ExpectIdentifier([[maybe_unused]] bool isReference, } auto const &tokenStart = token.Start(); - if (token.IsPredefinedType() && !util::Helpers::IsStdLib(program_) && - ((options & TypeAnnotationParsingOptions::ADD_TYPE_PARAMETER_BINDING) == 0)) { + if (!IsValidIdentifierName(token) && ((options & TypeAnnotationParsingOptions::ADD_TYPE_PARAMETER_BINDING) == 0)) { LogError(diagnostic::PREDEFINED_TYPE_AS_IDENTIFIER, {token.Ident()}, tokenStart); lexer_->NextToken(); return AllocBrokenExpression(tokenStart); diff --git a/ets2panda/parser/parserImpl.h b/ets2panda/parser/parserImpl.h index ac2c58b686..83ee66ad7b 100644 --- a/ets2panda/parser/parserImpl.h +++ b/ets2panda/parser/parserImpl.h @@ -84,6 +84,11 @@ public: return false; } + [[nodiscard]] virtual bool IsValidIdentifierName([[maybe_unused]] const lexer::Token &token) const noexcept + { + return true; + } + ETSParser *AsETSParser() { ES2PANDA_ASSERT(IsETSParser()); diff --git a/ets2panda/test/ast/parser/ets/InvalidParserImpl.ets b/ets2panda/test/ast/parser/ets/InvalidParserImpl.ets index feca6d13ff..899de53972 100644 --- a/ets2panda/test/ast/parser/ets/InvalidParserImpl.ets +++ b/ets2panda/test/ast/parser/ets/InvalidParserImpl.ets @@ -25,6 +25,4 @@ class int {} /* @@? 17:12 Error TypeError: Getter must return a value */ /* @@? 18:5 Error SyntaxError: Getter must not have formal parameters. */ /* @@? 19:1 Error SyntaxError: Setter must have exactly one formal parameter. */ -/* @@? 23:7 Error SyntaxError: Cannot be used as user-defined type. */ -/* @@? 23:7 Error SyntaxError: Hard keyword 'int' cannot be used as identifier */ -/* @@? 23:7 Error SyntaxError: Identifier expected, got 'int'. */ +/* @@? 23:7 Error SyntaxError: int is a predefined type, cannot be used as an identifier */ diff --git a/ets2panda/test/ast/parser/ets/ambient_indexer_3.ets b/ets2panda/test/ast/parser/ets/ambient_indexer_3.ets index efd4f356c6..4f06b3693e 100644 --- a/ets2panda/test/ast/parser/ets/ambient_indexer_3.ets +++ b/ets2panda/test/ast/parser/ets/ambient_indexer_3.ets @@ -29,4 +29,4 @@ function main() { /* @@? 17:20 Error SyntaxError: Return type of index signature from exported class or interface need to be identifier. */ /* @@? 17:20 Error SyntaxError: Unexpected token ']'. */ /* @@? 17:22 Error SyntaxError: Unexpected token ':'. */ -/* @@? 17:30 Error SyntaxError: Field type annotation expected. */ +/* @@? 17:24 Error SyntaxError: string is a predefined type, cannot be used as an identifier */ diff --git a/ets2panda/test/ast/parser/ets/circular_type_in_alias.ets b/ets2panda/test/ast/parser/ets/circular_type_in_alias.ets index b951ba4ff5..09a0912afd 100644 --- a/ets2panda/test/ast/parser/ets/circular_type_in_alias.ets +++ b/ets2panda/test/ast/parser/ets/circular_type_in_alias.ets @@ -29,8 +29,8 @@ type Loop> = { /* @@? 17:23 Error TypeError: Indexed signatures are not allowed. Use arrays instead! */ /* @@? 17:24 Error SyntaxError: Unexpected token ']'. */ /* @@? 17:26 Error SyntaxError: Unexpected token 'extends'. */ -/* @@? 17:34 Error SyntaxError: Unexpected token 'boolean'. */ +/* @@? 17:34 Error SyntaxError: boolean is a predefined type, cannot be used as an identifier */ /* @@? 17:42 Error SyntaxError: Unexpected token '?'. */ /* @@? 17:44 Error SyntaxError: number is a predefined type, cannot be used as an identifier */ /* @@? 17:51 Error SyntaxError: Unexpected token ':'. */ -/* @@? 17:59 Error SyntaxError: Field type annotation expected. */ \ No newline at end of file +/* @@? 17:53 Error SyntaxError: string is a predefined type, cannot be used as an identifier */ diff --git a/ets2panda/test/ast/parser/ets/typenode_clone_comprehensive.ets b/ets2panda/test/ast/parser/ets/typenode_clone_comprehensive.ets index a741c2a82c..069c51fb2f 100644 --- a/ets2panda/test/ast/parser/ets/typenode_clone_comprehensive.ets +++ b/ets2panda/test/ast/parser/ets/typenode_clone_comprehensive.ets @@ -94,7 +94,7 @@ declare const test3: ComplexType<'b'>; /* @@? 41:43 Error SyntaxError: Unexpected token ']'. */ /* @@? 41:43 Error SyntaxError: Field type annotation expected. */ /* @@? 41:44 Error SyntaxError: Unexpected token ':'. */ -/* @@? 41:52 Error SyntaxError: Field type annotation expected. */ +/* @@? 41:46 Error SyntaxError: string is a predefined type, cannot be used as an identifier */ /* @@? 44:41 Error TypeError: The `keyof` keyword can only be used for class or interface type. */ /* @@? 44:60 Error SyntaxError: Unexpected token, expected ']'. */ /* @@? 54:34 Error TypeError: Cannot find type 'InvalidMap'. */ diff --git a/ets2panda/test/ast/parser/ets/user_defined_20.ets b/ets2panda/test/ast/parser/ets/user_defined_20.ets index 2826718e9b..11c00c085a 100644 --- a/ets2panda/test/ast/parser/ets/user_defined_20.ets +++ b/ets2panda/test/ast/parser/ets/user_defined_20.ets @@ -17,6 +17,5 @@ struct bigint{ a : string = "15"; } -/* @@? 16:8 Error SyntaxError: Cannot be used as user-defined type. */ +/* @@? 16:8 Error SyntaxError: bigint is a predefined type, cannot be used as an identifier */ /* @@? 16:1 Error TypeError: Structs are only used to define UI components, it should be translated at 'plugin after parser' phase. */ -/* @@? 1:3 Error TypeError: Variable 'bigint' is already defined with different type. */ diff --git a/ets2panda/test/ast/parser/ets/user_defined_21.ets b/ets2panda/test/ast/parser/ets/user_defined_21.ets index 6ed8097638..a7715989bf 100644 --- a/ets2panda/test/ast/parser/ets/user_defined_21.ets +++ b/ets2panda/test/ast/parser/ets/user_defined_21.ets @@ -17,5 +17,4 @@ class /* @@ label */bigint{ a : string = "15"; } -/* @@@ label Error SyntaxError: Cannot be used as user-defined type. */ -/* @@? 1:3 Error TypeError: Variable 'bigint' is already defined with different type. */ +/* @@@ label Error SyntaxError: bigint is a predefined type, cannot be used as an identifier */ diff --git a/ets2panda/test/ast/parser/ets/user_defined_5.ets b/ets2panda/test/ast/parser/ets/user_defined_5.ets index 5407609861..a20b8680d4 100644 --- a/ets2panda/test/ast/parser/ets/user_defined_5.ets +++ b/ets2panda/test/ast/parser/ets/user_defined_5.ets @@ -17,6 +17,4 @@ enum /* @@ label */double { A, B, C } -/* @@@ label Error SyntaxError: Cannot be used as user-defined type. */ -/* @@@ label Error SyntaxError: Identifier expected, got 'double'. */ -/* @@@ label Error SyntaxError: Hard keyword 'double' cannot be used as identifier */ +/* @@@ label Error SyntaxError: double is a predefined type, cannot be used as an identifier */ diff --git a/ets2panda/test/ast/parser/ets/user_defined_7.ets b/ets2panda/test/ast/parser/ets/user_defined_7.ets index 587457df03..5b9519508f 100644 --- a/ets2panda/test/ast/parser/ets/user_defined_7.ets +++ b/ets2panda/test/ast/parser/ets/user_defined_7.ets @@ -17,9 +17,7 @@ interface /* @@ label1 */double { name : string /* @@ label2 */= /* @@ label3 */"" /* @@ label4 */} -/* @@@ label1 Error SyntaxError: Cannot be used as user-defined type. */ -/* @@@ label1 Error SyntaxError: Identifier expected, got 'double'. */ -/* @@@ label1 Error SyntaxError: Hard keyword 'double' cannot be used as identifier */ +/* @@@ label1 Error SyntaxError: double is a predefined type, cannot be used as an identifier */ /* @@@ label2 Error SyntaxError: Interface member initialization is prohibited. */ /* @@@ label3 Error SyntaxError: Unexpected token, expected ','. */ /* @@? 17:51 Error SyntaxError: Unexpected token, expected 'private' or identifier. */ diff --git a/ets2panda/test/ast/parser/ets/user_defined_8.ets b/ets2panda/test/ast/parser/ets/user_defined_8.ets index 95556fc082..52278742dd 100644 --- a/ets2panda/test/ast/parser/ets/user_defined_8.ets +++ b/ets2panda/test/ast/parser/ets/user_defined_8.ets @@ -17,7 +17,5 @@ struct string{ a : string = "15"; } -/* @@? 16:8 Error SyntaxError: Cannot be used as user-defined type. */ +/* @@? 16:8 Error SyntaxError: string is a predefined type, cannot be used as an identifier */ /* @@? 16:1 Error TypeError: Structs are only used to define UI components, it should be translated at 'plugin after parser' phase. */ -/* @@? 1:3 Error TypeError: Variable 'string' is already defined with different type. */ -/* @@? 17:16 Error TypeError: Type '"15"' cannot be assigned to type 'string' */ diff --git a/ets2panda/test/ast/parser/ets/user_defined_9.ets b/ets2panda/test/ast/parser/ets/user_defined_9.ets index fecbee124f..1170c80f98 100644 --- a/ets2panda/test/ast/parser/ets/user_defined_9.ets +++ b/ets2panda/test/ast/parser/ets/user_defined_9.ets @@ -17,6 +17,4 @@ class /* @@ label */string{ a : string = "15"; } -/* @@@ label Error SyntaxError: Cannot be used as user-defined type. */ -/* @@? 1:3 Error TypeError: Variable 'string' is already defined with different type. */ -/* @@? 17:16 Error TypeError: Type '"15"' cannot be assigned to type 'string' */ +/* @@@ label Error SyntaxError: string is a predefined type, cannot be used as an identifier */ -- Gitee