From cfb580bac9c94b935fbd88e09bec65f471704e84 Mon Sep 17 00:00:00 2001 From: zengzengran Date: Fri, 11 Jul 2025 09:33:07 +0800 Subject: [PATCH] Fixing local interface crash Issue: https://gitee.com/openharmony/arkcompiler_ets_frontend/issues/ICLL3J Description: Referencing the local class, parse the local interface as allobrokenstatement. Tested-by: ninja tests (passed) ets_testrunner (passed) Signed-off-by: zengzengran # --- ets2panda/parser/ETSparser.h | 2 + ets2panda/parser/ETSparserStatements.cpp | 9 + ets2panda/parser/parserImpl.h | 2 + ets2panda/parser/statementParser.cpp | 11 +- .../ets/external_local_interface_decl.ets | 5 +- .../test/ast/parser/ets/InvalidClasses.ets | 3 +- .../annotationDecl_with_access_modifier03.ets | 1 + .../parser/ets/interface_parser_error_1.ets | 7 +- ...erface-member-access-modifier-private1.ets | 7 +- ...erface-member-access-modifier-private2.ets | 10 +- ...face-member-access-modifier-protected1.ets | 7 +- .../ets/local_class_already_interface.ets | 1 + .../ets/local_interface.ets} | 9 +- .../ets/local_interface_already_class.ets | 1 + .../ets/local_interface_already_interface.ets | 4 +- .../ets/local_interface_already_variable..ets | 3 +- ...terface_enum_only_top_level_4-expected.txt | 195 +----------------- .../parser/ets/local-interface-expected.txt | 39 +--- 18 files changed, 67 insertions(+), 249 deletions(-) rename ets2panda/test/ast/{compiler/ets/external_local_interface.ets => parser/ets/local_interface.ets} (73%) diff --git a/ets2panda/parser/ETSparser.h b/ets2panda/parser/ETSparser.h index 37b3d195b3..af11e5ec64 100644 --- a/ets2panda/parser/ETSparser.h +++ b/ets2panda/parser/ETSparser.h @@ -338,6 +338,8 @@ private: // NOLINTNEXTLINE(google-default-arguments) ir::Statement *ParseStructStatement(StatementParsingFlags flags, ir::ClassDefinitionModifiers modifiers, ir::ModifierFlags modFlags = ir::ModifierFlags::NONE) override; + // NOLINTNEXTLINE(google-default-arguments) + ir::Statement *ParseInterfaceStatement(StatementParsingFlags flags) override; ir::AstNode *ParseClassElementHelper( const ArenaVector &properties, std::tuple modifierInfo, diff --git a/ets2panda/parser/ETSparserStatements.cpp b/ets2panda/parser/ETSparserStatements.cpp index c38ad1ef3a..d466aa3aaf 100644 --- a/ets2panda/parser/ETSparserStatements.cpp +++ b/ets2panda/parser/ETSparserStatements.cpp @@ -374,4 +374,13 @@ ir::Statement *ETSParser::ParseStructStatement([[maybe_unused]] StatementParsing return AllocBrokenStatement(rangeStruct); } +// NOLINTNEXTLINE(google-default-arguments) +ir::Statement *ETSParser::ParseInterfaceStatement([[maybe_unused]] StatementParsingFlags flags) +{ + auto &rangeClass = Lexer()->GetToken().Loc(); + LogError(diagnostic::ILLEGAL_START_STRUCT_CLASS, {"INTERFACE"}, Lexer()->GetToken().Start()); + ParseInterfaceDeclaration(false); + return AllocBrokenStatement(rangeClass); +} + } // namespace ark::es2panda::parser diff --git a/ets2panda/parser/parserImpl.h b/ets2panda/parser/parserImpl.h index c71ad06628..dedba93ceb 100644 --- a/ets2panda/parser/parserImpl.h +++ b/ets2panda/parser/parserImpl.h @@ -305,6 +305,8 @@ protected: // NOLINTNEXTLINE(google-default-arguments) virtual ir::Statement *ParseStructStatement(StatementParsingFlags flags, ir::ClassDefinitionModifiers modifiers, ir::ModifierFlags modFlags = ir::ModifierFlags::NONE); + // NOLINTNEXTLINE(google-default-arguments) + virtual ir::Statement *ParseInterfaceStatement(StatementParsingFlags flags); ir::Statement *ParseStatementBasedOnTokenType(StatementParsingFlags flags); ir::Statement *ParseVarStatement(); ir::Statement *ParseLetStatement(StatementParsingFlags flags); diff --git a/ets2panda/parser/statementParser.cpp b/ets2panda/parser/statementParser.cpp index a866581e20..8cbab67f45 100644 --- a/ets2panda/parser/statementParser.cpp +++ b/ets2panda/parser/statementParser.cpp @@ -195,7 +195,7 @@ ir::Statement *ParserImpl::ParseStatementBasedOnTokenType(StatementParsingFlags case lexer::TokenType::KEYW_ENUM: return ParseEnumDeclaration(); case lexer::TokenType::KEYW_INTERFACE: - return ParseInterfaceDeclaration(false); + return ParseInterfaceStatement(flags); case lexer::TokenType::PUNCTUATOR_AT: if (IsETSParser()) { return ParseAnnotationsInStatement(flags); @@ -317,6 +317,15 @@ ir::Statement *ParserImpl::ParseClassStatement(StatementParsingFlags flags, ir:: return ParseClassDeclaration(modifiers, modFlags); } +ir::Statement *ParserImpl::ParseInterfaceStatement(StatementParsingFlags flags) +{ + if ((flags & StatementParsingFlags::ALLOW_LEXICAL) == 0) { + LogError(diagnostic::LEXICAL_DEC_NOT_ALLOWED_IN_SINGLE_STATEMENT_CONTEXT); + } + + return ParseInterfaceDeclaration(false); +} + ir::Statement *ParserImpl::ParseStructDeclaration(ir::ClassDefinitionModifiers modifiers, ir::ModifierFlags flags) { const lexer::SourcePosition startLoc = lexer_->GetToken().Start(); diff --git a/ets2panda/test/ast/compiler/ets/external_local_interface_decl.ets b/ets2panda/test/ast/compiler/ets/external_local_interface_decl.ets index 891e84f1a8..89ab183d9f 100644 --- a/ets2panda/test/ast/compiler/ets/external_local_interface_decl.ets +++ b/ets2panda/test/ast/compiler/ets/external_local_interface_decl.ets @@ -19,4 +19,7 @@ export function foo() { } let a:A = {s:""} -} \ No newline at end of file +} + +/* @@? 17:5 Error SyntaxError: Illegal start of INTERFACE expression. */ +/* @@? 21:11 Error TypeError: Cannot find type 'A'. */ diff --git a/ets2panda/test/ast/parser/ets/InvalidClasses.ets b/ets2panda/test/ast/parser/ets/InvalidClasses.ets index b73dc9af4c..44236605f8 100644 --- a/ets2panda/test/ast/parser/ets/InvalidClasses.ets +++ b/ets2panda/test/ast/parser/ets/InvalidClasses.ets @@ -114,11 +114,12 @@ interface I1 { /* @@? 58:25 Error SyntaxError: Unexpected token '}'. */ /* @@? 61:5 Error SyntaxError: Illegal start of CLASS expression. */ /* @@? 62:9 Error SyntaxError: Local class or interface declaration members can not have access modifies. */ +/* @@? 65:5 Error SyntaxError: Illegal start of INTERFACE expression. */ /* @@? 66:9 Error SyntaxError: Local class or interface declaration members can not have access modifies. */ /* @@? 66:18 Error SyntaxError: Private interface methods must have body. */ /* @@? 67:9 Error SyntaxError: Unexpected token, expected 'private' or identifier. */ -/* @@? 67:16 Error SyntaxError: Unexpected token, expected ','. */ /* @@? 67:16 Error SyntaxError: Unexpected token, expected 'private' or identifier. */ +/* @@? 67:16 Error SyntaxError: Unexpected token, expected ','. */ /* @@? 67:16 Error SyntaxError: Identifier expected. */ /* @@? 67:24 Error SyntaxError: Private interface methods must have body. */ /* @@? 72:5 Error SyntaxError: Unexpected token, expected 'private' or identifier. */ diff --git a/ets2panda/test/ast/parser/ets/annotations_tests/annotationDecl_with_access_modifier03.ets b/ets2panda/test/ast/parser/ets/annotations_tests/annotationDecl_with_access_modifier03.ets index c6d1285bf8..5d02e26982 100644 --- a/ets2panda/test/ast/parser/ets/annotations_tests/annotationDecl_with_access_modifier03.ets +++ b/ets2panda/test/ast/parser/ets/annotations_tests/annotationDecl_with_access_modifier03.ets @@ -20,3 +20,4 @@ /* @@@ label Error SyntaxError: Unexpected token 'static'. */ /* @@@ label1 Error SyntaxError: Unexpected token '@'. */ /* @@? 15:38 Error SyntaxError: Annotations can only be declared at the top level. */ +/* @@? 15:38 Error SyntaxError: Illegal start of INTERFACE expression. */ diff --git a/ets2panda/test/ast/parser/ets/interface_parser_error_1.ets b/ets2panda/test/ast/parser/ets/interface_parser_error_1.ets index afa196d8f3..387343669d 100644 --- a/ets2panda/test/ast/parser/ets/interface_parser_error_1.ets +++ b/ets2panda/test/ast/parser/ets/interface_parser_error_1.ets @@ -39,6 +39,7 @@ function mdin() { let a = new A(); /* @@? 17:4 Error SyntaxError: Unexpected token '{'. */ /* @@? 17:5 Error TypeError: Unresolved reference name */ /* @@? 17:11 Error SyntaxError: Unexpected token ':'. */ +/* @@? 19:1 Error SyntaxError: Illegal start of INTERFACE expression. */ /* @@? 20:5 Error SyntaxError: Identifier expected. */ /* @@? 20:14 Error SyntaxError: Unexpected token, expected ','. */ /* @@? 20:14 Error SyntaxError: Unexpected token, expected 'private' or identifier. */ @@ -52,11 +53,11 @@ function mdin() { let a = new A(); /* @@? 24:7 Error TypeError: Unresolved reference A */ /* @@? 24:9 Error SyntaxError: Unexpected token 'implements'. */ /* @@? 24:20 Error SyntaxError: Unexpected token 'I'. */ -/* @@? 24:20 Error TypeError: Interface name 'I' used in the wrong context */ +/* @@? 24:20 Error TypeError: Unresolved reference I */ /* @@? 24:22 Error SyntaxError: Unexpected token '{'. */ /* @@? 25:4 Error TypeError: Unresolved reference reanstructor */ -/* @@? 26:19 Error SyntaxError: Unexpected token '�ls'. */ /* @@? 26:19 Error SyntaxError: Unexpected token, expected an identifier. */ +/* @@? 26:19 Error SyntaxError: Unexpected token '�ls'. */ /* @@? 27:5 Error SyntaxError: Unexpected token 'A'. */ /* @@? 27:7 Error SyntaxError: Unexpected token '{'. */ /* @@? 28:5 Error SyntaxError: Identifier expected, got 'constructor'. */ @@ -64,4 +65,4 @@ function mdin() { let a = new A(); /* @@? 29:18 Error SyntaxError: Unexpected token, expected an identifier. */ /* @@? 31:2 Error SyntaxError: Unexpected token '*'. */ /* @@? 32:1 Error SyntaxError: Nested functions are not allowed. */ -/* @@? 68:1 Error SyntaxError: Expected '}', got 'end of stream'. */ +/* @@? 69:1 Error SyntaxError: Expected '}', got 'end of stream'. */ diff --git a/ets2panda/test/ast/parser/ets/local-interface-member-access-modifier-private1.ets b/ets2panda/test/ast/parser/ets/local-interface-member-access-modifier-private1.ets index 6a6186266b..490354a619 100644 --- a/ets2panda/test/ast/parser/ets/local-interface-member-access-modifier-private1.ets +++ b/ets2panda/test/ast/parser/ets/local-interface-member-access-modifier-private1.ets @@ -15,10 +15,11 @@ function foo() { - interface LocalInterface + /* @@ label1 */interface LocalInterface { - /* @@ label */private property : int; + /* @@ label2 */private property : int; } } -/* @@@ label Error SyntaxError: Local class or interface declaration members can not have access modifies. */ +/* @@@ label1 Error SyntaxError: Illegal start of INTERFACE expression. */ +/* @@@ label2 Error SyntaxError: Local class or interface declaration members can not have access modifies. */ diff --git a/ets2panda/test/ast/parser/ets/local-interface-member-access-modifier-private2.ets b/ets2panda/test/ast/parser/ets/local-interface-member-access-modifier-private2.ets index 1083684e90..7f76e7b990 100644 --- a/ets2panda/test/ast/parser/ets/local-interface-member-access-modifier-private2.ets +++ b/ets2panda/test/ast/parser/ets/local-interface-member-access-modifier-private2.ets @@ -15,10 +15,12 @@ function foo() { - interface LocalInterface + /* @@ label1 */interface LocalInterface { - /* @@ label */private method/* @@ label1 */() : void; + /* @@ label2 */private method/* @@ label3 */() : void; } } -/* @@@ label Error SyntaxError: Local class or interface declaration members can not have access modifies. */ -/* @@@ label1 Error SyntaxError: Private interface methods must have body. */ + +/* @@@ label1 Error SyntaxError: Illegal start of INTERFACE expression. */ +/* @@@ label2 Error SyntaxError: Local class or interface declaration members can not have access modifies. */ +/* @@@ label3 Error SyntaxError: Private interface methods must have body. */ diff --git a/ets2panda/test/ast/parser/ets/local-interface-member-access-modifier-protected1.ets b/ets2panda/test/ast/parser/ets/local-interface-member-access-modifier-protected1.ets index 915df139ae..af6da8fe3b 100644 --- a/ets2panda/test/ast/parser/ets/local-interface-member-access-modifier-protected1.ets +++ b/ets2panda/test/ast/parser/ets/local-interface-member-access-modifier-protected1.ets @@ -15,10 +15,11 @@ function foo() { - interface LocalInterface + /* @@ label1 */interface LocalInterface { - /* @@ label */protected property : int; + /* @@ label2 */protected property : int; } } -/* @@@ label Error SyntaxError: Unexpected token, expected 'private' or identifier. */ +/* @@@ label1 Error SyntaxError: Illegal start of INTERFACE expression. */ +/* @@@ label2 Error SyntaxError: Unexpected token, expected 'private' or identifier. */ diff --git a/ets2panda/test/ast/parser/ets/local_class_already_interface.ets b/ets2panda/test/ast/parser/ets/local_class_already_interface.ets index e9fea16e52..64e86ea35f 100644 --- a/ets2panda/test/ast/parser/ets/local_class_already_interface.ets +++ b/ets2panda/test/ast/parser/ets/local_class_already_interface.ets @@ -22,4 +22,5 @@ function bar(): void { } } +/* @@? 17:3 Error SyntaxError: Illegal start of INTERFACE expression. */ /* @@? 20:3 Error SyntaxError: Illegal start of CLASS expression. */ diff --git a/ets2panda/test/ast/compiler/ets/external_local_interface.ets b/ets2panda/test/ast/parser/ets/local_interface.ets similarity index 73% rename from ets2panda/test/ast/compiler/ets/external_local_interface.ets rename to ets2panda/test/ast/parser/ets/local_interface.ets index b17d69c20e..df40da6561 100644 --- a/ets2panda/test/ast/compiler/ets/external_local_interface.ets +++ b/ets2panda/test/ast/parser/ets/local_interface.ets @@ -13,6 +13,11 @@ * limitations under the License. */ -import {foo} from "./external_local_interface_decl" - +let myAssertEqual = (actualValue: boolean, expectValue: boolean) => { + /* @@ label */interface R { + pass: boolean, + message: string + } +} +/* @@@ label Error SyntaxError: Illegal start of INTERFACE expression. */ diff --git a/ets2panda/test/ast/parser/ets/local_interface_already_class.ets b/ets2panda/test/ast/parser/ets/local_interface_already_class.ets index a1458dd771..df8b96452f 100644 --- a/ets2panda/test/ast/parser/ets/local_interface_already_class.ets +++ b/ets2panda/test/ast/parser/ets/local_interface_already_class.ets @@ -23,3 +23,4 @@ function bar(): void { } /* @@? 17:3 Error SyntaxError: Illegal start of CLASS expression. */ +/* @@? 20:3 Error SyntaxError: Illegal start of INTERFACE expression. */ \ No newline at end of file diff --git a/ets2panda/test/ast/parser/ets/local_interface_already_interface.ets b/ets2panda/test/ast/parser/ets/local_interface_already_interface.ets index ad3bd01bac..67952a2acf 100644 --- a/ets2panda/test/ast/parser/ets/local_interface_already_interface.ets +++ b/ets2panda/test/ast/parser/ets/local_interface_already_interface.ets @@ -22,5 +22,5 @@ function bar(): void { } } -/* @@? 20:3 Error TypeError: Variable 'BC' has already been declared. */ -/* @@? 20:3 Error TypeError: Merging declarations is not supported, please keep all definitions of classes, interfaces and enums compact in the codebase! */ +/* @@? 17:3 Error SyntaxError: Illegal start of INTERFACE expression. */ +/* @@? 20:3 Error SyntaxError: Illegal start of INTERFACE expression. */ diff --git a/ets2panda/test/ast/parser/ets/local_interface_already_variable..ets b/ets2panda/test/ast/parser/ets/local_interface_already_variable..ets index 0c4c33dce6..0660c505d4 100644 --- a/ets2panda/test/ast/parser/ets/local_interface_already_variable..ets +++ b/ets2panda/test/ast/parser/ets/local_interface_already_variable..ets @@ -20,5 +20,4 @@ function bar(): void { } } -/* @@? 18:3 Error TypeError: Variable 'BC' has already been declared. */ -/* @@? 18:3 Error TypeError: Merging declarations is not supported, please keep all definitions of classes, interfaces and enums compact in the codebase! */ +/* @@? 18:3 Error SyntaxError: Illegal start of INTERFACE expression. */ diff --git a/ets2panda/test/parser/ets/class_interface_enum_only_top_level_4-expected.txt b/ets2panda/test/parser/ets/class_interface_enum_only_top_level_4-expected.txt index 877b11b3cb..bb83536a22 100644 --- a/ets2panda/test/parser/ets/class_interface_enum_only_top_level_4-expected.txt +++ b/ets2panda/test/parser/ets/class_interface_enum_only_top_level_4-expected.txt @@ -198,199 +198,11 @@ "type": "BlockStatement", "statements": [ { - "type": "TSInterfaceDeclaration", - "body": { - "type": "TSInterfaceBody", - "body": [ - { - "type": "MethodDefinition", - "key": { - "type": "Identifier", - "name": "foo", - "decorators": [], - "loc": { - "start": { - "line": 19, - "column": 5, - "program": "class_interface_enum_only_top_level_4.ets" - }, - "end": { - "line": 19, - "column": 8, - "program": "class_interface_enum_only_top_level_4.ets" - } - } - }, - "kind": "method", - "accessibility": "public", - "static": false, - "optional": false, - "computed": false, - "value": { - "type": "FunctionExpression", - "function": { - "type": "ScriptFunction", - "id": { - "type": "Identifier", - "name": "foo", - "decorators": [], - "loc": { - "start": { - "line": 19, - "column": 5, - "program": "class_interface_enum_only_top_level_4.ets" - }, - "end": { - "line": 19, - "column": 8, - "program": "class_interface_enum_only_top_level_4.ets" - } - } - }, - "generator": false, - "async": false, - "expression": false, - "params": [ - { - "type": "ETSParameterExpression", - "name": { - "type": "Identifier", - "name": "a", - "typeAnnotation": { - "type": "ETSPrimitiveType", - "loc": { - "start": { - "line": 19, - "column": 12, - "program": "class_interface_enum_only_top_level_4.ets" - }, - "end": { - "line": 19, - "column": 15, - "program": "class_interface_enum_only_top_level_4.ets" - } - } - }, - "decorators": [], - "loc": { - "start": { - "line": 19, - "column": 9, - "program": "class_interface_enum_only_top_level_4.ets" - }, - "end": { - "line": 19, - "column": 15, - "program": "class_interface_enum_only_top_level_4.ets" - } - } - }, - "loc": { - "start": { - "line": 19, - "column": 9, - "program": "class_interface_enum_only_top_level_4.ets" - }, - "end": { - "line": 19, - "column": 15, - "program": "class_interface_enum_only_top_level_4.ets" - } - } - } - ], - "returnType": { - "type": "ETSPrimitiveType", - "loc": { - "start": { - "line": 19, - "column": 18, - "program": "class_interface_enum_only_top_level_4.ets" - }, - "end": { - "line": 19, - "column": 21, - "program": "class_interface_enum_only_top_level_4.ets" - } - } - }, - "loc": { - "start": { - "line": 19, - "column": 8, - "program": "class_interface_enum_only_top_level_4.ets" - }, - "end": { - "line": 19, - "column": 21, - "program": "class_interface_enum_only_top_level_4.ets" - } - } - }, - "loc": { - "start": { - "line": 19, - "column": 8, - "program": "class_interface_enum_only_top_level_4.ets" - }, - "end": { - "line": 19, - "column": 21, - "program": "class_interface_enum_only_top_level_4.ets" - } - } - }, - "overloads": [], - "decorators": [], - "loc": { - "start": { - "line": 19, - "column": 5, - "program": "class_interface_enum_only_top_level_4.ets" - }, - "end": { - "line": 19, - "column": 22, - "program": "class_interface_enum_only_top_level_4.ets" - } - } - } - ], - "loc": { - "start": { - "line": 18, - "column": 15, - "program": "class_interface_enum_only_top_level_4.ets" - }, - "end": { - "line": 20, - "column": 4, - "program": "class_interface_enum_only_top_level_4.ets" - } - } - }, - "id": { - "type": "Identifier", - "name": "C", - "decorators": [], - "loc": { - "start": { - "line": 18, - "column": 13, - "program": "class_interface_enum_only_top_level_4.ets" - }, - "end": { - "line": 18, - "column": 14, - "program": "class_interface_enum_only_top_level_4.ets" - } - } - }, - "extends": [], + "type": "EmptyStatement", "loc": { "start": { - "line": 18, - "column": 3, + "line": 21, + "column": 1, "program": "class_interface_enum_only_top_level_4.ets" }, "end": { @@ -496,3 +308,4 @@ } } } +SyntaxError: Illegal start of INTERFACE expression. [class_interface_enum_only_top_level_4.ets:18:3] diff --git a/ets2panda/test/parser/ets/local-interface-expected.txt b/ets2panda/test/parser/ets/local-interface-expected.txt index 0644552646..fbabe9545c 100644 --- a/ets2panda/test/parser/ets/local-interface-expected.txt +++ b/ets2panda/test/parser/ets/local-interface-expected.txt @@ -198,44 +198,10 @@ "type": "BlockStatement", "statements": [ { - "type": "TSInterfaceDeclaration", - "body": { - "type": "TSInterfaceBody", - "body": [], - "loc": { - "start": { - "line": 18, - "column": 30, - "program": "local-interface.ets" - }, - "end": { - "line": 18, - "column": 33, - "program": "local-interface.ets" - } - } - }, - "id": { - "type": "Identifier", - "name": "LocalInterface", - "decorators": [], - "loc": { - "start": { - "line": 18, - "column": 15, - "program": "local-interface.ets" - }, - "end": { - "line": 18, - "column": 29, - "program": "local-interface.ets" - } - } - }, - "extends": [], + "type": "EmptyStatement", "loc": { "start": { - "line": 18, + "line": 19, "column": 5, "program": "local-interface.ets" }, @@ -373,3 +339,4 @@ } } } +SyntaxError: Illegal start of INTERFACE expression. [local-interface.ets:18:5] -- Gitee