diff --git a/ets2panda/compiler/lowering/ets/ambientLowering.cpp b/ets2panda/compiler/lowering/ets/ambientLowering.cpp index 7f7f319086e441ddfa8a95676507aa067a4583db..e0651fcbfd2b634f0bbdc14aee4c7e0205fc2ce8 100644 --- a/ets2panda/compiler/lowering/ets/ambientLowering.cpp +++ b/ets2panda/compiler/lowering/ets/ambientLowering.cpp @@ -58,8 +58,7 @@ ir::MethodDefinition *CreateMethodFunctionDefinition(ir::DummyNode *node, public auto parser = ctx->parser->AsETSParser(); auto indexName = node->GetIndexName(); - auto const returnType = node->GetReturnTypeLiteral()->AsETSTypeReferencePart()->GetIdent(); - if (returnType->IsErrorPlaceHolder()) { + if (node->IsBrokenStatement()) { return nullptr; } if (indexName == ERROR_LITERAL) { @@ -67,10 +66,11 @@ ir::MethodDefinition *CreateMethodFunctionDefinition(ir::DummyNode *node, public } std::string sourceCode; if (funcKind == ir::MethodDefinitionKind::GET) { - sourceCode = "$_get(" + std::string(indexName) + " : number) : " + std::string(returnType->Name()); + sourceCode = "$_get(" + std::string(indexName) + + " : number) : " + std::string(node->GetReturnTypeLiteral()->DumpEtsSrc()); } else if (funcKind == ir::MethodDefinitionKind::SET) { - sourceCode = "$_set(" + std::string(indexName) + " : number, " + "value : " + std::string(returnType->Name()) + - " ) : void"; + sourceCode = "$_set(" + std::string(indexName) + " : number, " + + "value : " + std::string(node->GetReturnTypeLiteral()->DumpEtsSrc()) + " ) : void"; } else { ES2PANDA_UNREACHABLE(); } diff --git a/ets2panda/ir/expressions/dummyNode.cpp b/ets2panda/ir/expressions/dummyNode.cpp index 1f608b2f6fa9599c1d78a6c837b04f605df293e6..bf4b171b8f3b7acb2549a0dd8e722d4bfcdc2d9d 100644 --- a/ets2panda/ir/expressions/dummyNode.cpp +++ b/ets2panda/ir/expressions/dummyNode.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2024-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -35,7 +35,7 @@ void DummyNode::Dump(ir::AstDumper *dumper) const dumper->Add({{"type", "DummyNode"}, {"name", name_}, {"indexName", indexName_}, - {"returnType", returnType_->AsETSTypeReferencePart()->Name()->AsIdentifier()->Name()}}); + {"returnType", AstDumper::Optional(GetReturnTypeLiteral())}}); } void DummyNode::Dump(ir::SrcDumper *dumper) const diff --git a/ets2panda/parser/ETSparser.cpp b/ets2panda/parser/ETSparser.cpp index 57c3bc99f6d3944fd1bfac3fa060f4408f4824b2..2383013aee71bd80403901bd4190c35e3d79e780 100644 --- a/ets2panda/parser/ETSparser.cpp +++ b/ets2panda/parser/ETSparser.cpp @@ -2034,22 +2034,19 @@ ir::AstNode *ETSParser::ParseAmbientSignature(const lexer::SourcePosition &start Lexer()->GetToken().SetTokenType(lexer::TokenType::PUNCTUATOR_COLON); } - // eat ":" - if (Lexer()->NextToken(); Lexer()->GetToken().Type() != lexer::TokenType::LITERAL_IDENT) { - // ambient_indexer_5.ets - LogError(diagnostic::INDEX_MISSING_IDENTIFIER); + Lexer()->TryEatTokenType(lexer::TokenType::PUNCTUATOR_COLON); - Lexer()->GetToken().SetTokenType(lexer::TokenType::LITERAL_IDENT); - Lexer()->GetToken().SetTokenStr(ERROR_LITERAL); + TypeAnnotationParsingOptions options = TypeAnnotationParsingOptions::RETURN_TYPE; + auto *returnType = ParseTypeAnnotation(&options); + if (returnType->IsBrokenTypeNode()) { + LogError(diagnostic::INDEX_MISSING_IDENTIFIER); + return AllocBrokenStatement({startPos, Lexer()->GetToken().End()}); } - auto const returnType = AllocNode( - AllocNode(Lexer()->GetToken().Ident(), Allocator()), Allocator()); auto dummyNode = AllocNode(compiler::Signatures::AMBIENT_INDEXER, indexName, returnType, ir::DummyNodeFlag::INDEXER); ES2PANDA_ASSERT(dummyNode != nullptr); dummyNode->SetRange({startPos, Lexer()->GetToken().End()}); - Lexer()->NextToken(); // eat return type return dummyNode; } diff --git a/ets2panda/test/ast/parser/ets/ambient_indexer_11.ets b/ets2panda/test/ast/parser/ets/ambient_indexer_11.ets new file mode 100644 index 0000000000000000000000000000000000000000..b12c0c7f6655b79cfdcacd55f39ef44b55e57745 --- /dev/null +++ b/ets2panda/test/ast/parser/ets/ambient_indexer_11.ets @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +declare interface I{ + [index:number]:long; +} + +declare class C{ + [index:number]:long; +} diff --git a/ets2panda/test/ast/parser/ets/ambient_indexer_4.ets b/ets2panda/test/ast/parser/ets/ambient_indexer_4.ets index 7f0b37538a5524649eb0a6a217402813a7afa477..c5b0f4fbdbc1367fba64ef2e346f4e414e936a80 100644 --- a/ets2panda/test/ast/parser/ets/ambient_indexer_4.ets +++ b/ets2panda/test/ast/parser/ets/ambient_indexer_4.ets @@ -23,6 +23,7 @@ declare class A { /* @@@ label Error SyntaxError: An index signature must have a type annotation. */ /* @@@ label1 Error SyntaxError: Return type of index signature from exported class or interface need to be identifier. */ +/* @@@ label1 Error SyntaxError: Unexpected token 'function'. */ /* @@@ label3 Error TypeError: Native and Declare methods should have explicit return type. */ /* @@@ label2 Error SyntaxError: Expected '}', got 'end of stream'. */ /* @@ label2 */ \ No newline at end of file diff --git a/ets2panda/test/ast/parser/ets/ambient_indexer_5.ets b/ets2panda/test/ast/parser/ets/ambient_indexer_5.ets index 0319741534bdaff23b2d7436e57906189b3b7cae..06b6d193448008c014108de6f58d671c24da66a5 100644 --- a/ets2panda/test/ast/parser/ets/ambient_indexer_5.ets +++ b/ets2panda/test/ast/parser/ets/ambient_indexer_5.ets @@ -22,3 +22,4 @@ function main() { } /* @@@ label Error SyntaxError: Return type of index signature from exported class or interface need to be identifier. */ +/* @@@ label Error SyntaxError: Unexpected token '?'. */ diff --git a/ets2panda/test/ast/parser/ets/ambient_indexer_7.ets b/ets2panda/test/ast/parser/ets/ambient_indexer_7.ets index e387d2b7d7ab0be06ff4bc541ab4b772a01cb384..8cc8664c93cfed0a0ccb4d2ab7fbe5d49f1a5b59 100644 --- a/ets2panda/test/ast/parser/ets/ambient_indexer_7.ets +++ b/ets2panda/test/ast/parser/ets/ambient_indexer_7.ets @@ -17,14 +17,10 @@ declare class A { [index : number /* @@ label */: /* @@ label1 */string /* @@ label2 */} -/* @@ label3 */function main/* @@ label5 */() { +function main() { let a : A = new A(); } /* @@@ label Error SyntaxError: ] expected in index signature. */ /* @@@ label1 Error SyntaxError: An index signature must have a type annotation. */ /* @@@ label2 Error SyntaxError: Return type of index signature from exported class or interface need to be identifier. */ -/* @@@ label3 Error SyntaxError: Unexpected token 'function'. */ -/* @@@ label5 Error TypeError: Native and Declare methods should have explicit return type. */ -/* @@@ label4 Error SyntaxError: Expected '}', got 'end of stream'. */ -/* @@ label4 */ \ No newline at end of file diff --git a/ets2panda/test/ast/parser/ets/ambient_indexer_8.ets b/ets2panda/test/ast/parser/ets/ambient_indexer_8.ets index 4afa270c8c14ed1ff5dd66fca45e968926dea725..c104045ac33adf0ac906bf81a992e67bd5efa798 100644 --- a/ets2panda/test/ast/parser/ets/ambient_indexer_8.ets +++ b/ets2panda/test/ast/parser/ets/ambient_indexer_8.ets @@ -26,6 +26,7 @@ declare class A { /* @@@ label2 Error SyntaxError: ] expected in index signature. */ /* @@@ label3 Error SyntaxError: An index signature must have a type annotation. */ /* @@@ label4 Error SyntaxError: Return type of index signature from exported class or interface need to be identifier. */ +/* @@@ label4 Error SyntaxError: Unexpected token 'function'. */ /* @@@ label6 Error TypeError: Native and Declare methods should have explicit return type. */ /* @@@ label5 Error SyntaxError: Expected '}', got 'end of stream'. */ /* @@ label5 */ \ No newline at end of file diff --git a/ets2panda/test/parser/ets/ambient_indexer_1-expected.txt b/ets2panda/test/parser/ets/ambient_indexer_1-expected.txt index a53827c724929652947533cab579d6374f4192b9..7623ed36644013922aaae34d28d0b7374d236687 100644 --- a/ets2panda/test/parser/ets/ambient_indexer_1-expected.txt +++ b/ets2panda/test/parser/ets/ambient_indexer_1-expected.txt @@ -142,8 +142,8 @@ "program": "ambient_indexer_1.ets" }, "end": { - "line": 17, - "column": 30, + "line": 18, + "column": 2, "program": "ambient_indexer_1.ets" } } @@ -168,8 +168,8 @@ "program": "ambient_indexer_1.ets" }, "end": { - "line": 17, - "column": 30, + "line": 18, + "column": 2, "program": "ambient_indexer_1.ets" } } @@ -198,8 +198,8 @@ "program": "ambient_indexer_1.ets" }, "end": { - "line": 17, - "column": 30, + "line": 18, + "column": 2, "program": "ambient_indexer_1.ets" } } @@ -211,8 +211,8 @@ "program": "ambient_indexer_1.ets" }, "end": { - "line": 17, - "column": 30, + "line": 18, + "column": 2, "program": "ambient_indexer_1.ets" } } @@ -224,8 +224,8 @@ "program": "ambient_indexer_1.ets" }, "end": { - "line": 17, - "column": 30, + "line": 18, + "column": 2, "program": "ambient_indexer_1.ets" } } @@ -238,8 +238,8 @@ "program": "ambient_indexer_1.ets" }, "end": { - "line": 17, - "column": 30, + "line": 18, + "column": 2, "program": "ambient_indexer_1.ets" } } @@ -251,8 +251,8 @@ "program": "ambient_indexer_1.ets" }, "end": { - "line": 17, - "column": 30, + "line": 18, + "column": 2, "program": "ambient_indexer_1.ets" } } @@ -273,8 +273,8 @@ "program": "ambient_indexer_1.ets" }, "end": { - "line": 17, - "column": 30, + "line": 18, + "column": 2, "program": "ambient_indexer_1.ets" } } @@ -286,8 +286,8 @@ "program": "ambient_indexer_1.ets" }, "end": { - "line": 17, - "column": 30, + "line": 18, + "column": 2, "program": "ambient_indexer_1.ets" } } @@ -299,8 +299,8 @@ "program": "ambient_indexer_1.ets" }, "end": { - "line": 17, - "column": 30, + "line": 18, + "column": 2, "program": "ambient_indexer_1.ets" } } @@ -313,8 +313,8 @@ "program": "ambient_indexer_1.ets" }, "end": { - "line": 17, - "column": 30, + "line": 18, + "column": 2, "program": "ambient_indexer_1.ets" } } @@ -326,8 +326,8 @@ "program": "ambient_indexer_1.ets" }, "end": { - "line": 17, - "column": 30, + "line": 18, + "column": 2, "program": "ambient_indexer_1.ets" } } @@ -341,8 +341,8 @@ "program": "ambient_indexer_1.ets" }, "end": { - "line": 17, - "column": 30, + "line": 18, + "column": 2, "program": "ambient_indexer_1.ets" } } @@ -360,8 +360,8 @@ "program": "ambient_indexer_1.ets" }, "end": { - "line": 17, - "column": 30, + "line": 18, + "column": 2, "program": "ambient_indexer_1.ets" } } @@ -386,8 +386,8 @@ "program": "ambient_indexer_1.ets" }, "end": { - "line": 17, - "column": 30, + "line": 18, + "column": 2, "program": "ambient_indexer_1.ets" } } @@ -416,8 +416,8 @@ "program": "ambient_indexer_1.ets" }, "end": { - "line": 17, - "column": 30, + "line": 18, + "column": 2, "program": "ambient_indexer_1.ets" } } @@ -429,8 +429,8 @@ "program": "ambient_indexer_1.ets" }, "end": { - "line": 17, - "column": 30, + "line": 18, + "column": 2, "program": "ambient_indexer_1.ets" } } @@ -442,8 +442,8 @@ "program": "ambient_indexer_1.ets" }, "end": { - "line": 17, - "column": 30, + "line": 18, + "column": 2, "program": "ambient_indexer_1.ets" } } @@ -456,8 +456,8 @@ "program": "ambient_indexer_1.ets" }, "end": { - "line": 17, - "column": 30, + "line": 18, + "column": 2, "program": "ambient_indexer_1.ets" } } @@ -469,8 +469,8 @@ "program": "ambient_indexer_1.ets" }, "end": { - "line": 17, - "column": 30, + "line": 18, + "column": 2, "program": "ambient_indexer_1.ets" } } @@ -495,8 +495,8 @@ "program": "ambient_indexer_1.ets" }, "end": { - "line": 17, - "column": 30, + "line": 18, + "column": 2, "program": "ambient_indexer_1.ets" } } @@ -508,8 +508,8 @@ "program": "ambient_indexer_1.ets" }, "end": { - "line": 17, - "column": 30, + "line": 18, + "column": 2, "program": "ambient_indexer_1.ets" } } @@ -521,8 +521,8 @@ "program": "ambient_indexer_1.ets" }, "end": { - "line": 17, - "column": 30, + "line": 18, + "column": 2, "program": "ambient_indexer_1.ets" } } @@ -535,8 +535,8 @@ "program": "ambient_indexer_1.ets" }, "end": { - "line": 17, - "column": 30, + "line": 18, + "column": 2, "program": "ambient_indexer_1.ets" } } @@ -548,8 +548,8 @@ "program": "ambient_indexer_1.ets" }, "end": { - "line": 17, - "column": 30, + "line": 18, + "column": 2, "program": "ambient_indexer_1.ets" } } @@ -564,8 +564,8 @@ "program": "ambient_indexer_1.ets" }, "end": { - "line": 17, - "column": 30, + "line": 18, + "column": 2, "program": "ambient_indexer_1.ets" } } @@ -578,8 +578,8 @@ "program": "ambient_indexer_1.ets" }, "end": { - "line": 17, - "column": 30, + "line": 18, + "column": 2, "program": "ambient_indexer_1.ets" } } @@ -591,8 +591,8 @@ "program": "ambient_indexer_1.ets" }, "end": { - "line": 17, - "column": 30, + "line": 18, + "column": 2, "program": "ambient_indexer_1.ets" } } @@ -606,8 +606,8 @@ "program": "ambient_indexer_1.ets" }, "end": { - "line": 17, - "column": 30, + "line": 18, + "column": 2, "program": "ambient_indexer_1.ets" } } diff --git a/ets2panda/test/parser/ets/ambient_indexer_6-expected.txt b/ets2panda/test/parser/ets/ambient_indexer_6-expected.txt index 030e8a45840971a37d742dcd5929751af2bfa4ac..c572e1dad66beccc44837daedb6f1b1bf7213f01 100644 --- a/ets2panda/test/parser/ets/ambient_indexer_6-expected.txt +++ b/ets2panda/test/parser/ets/ambient_indexer_6-expected.txt @@ -142,8 +142,8 @@ "program": "ambient_indexer_6.ets" }, "end": { - "line": 17, - "column": 29, + "line": 18, + "column": 2, "program": "ambient_indexer_6.ets" } } @@ -168,8 +168,8 @@ "program": "ambient_indexer_6.ets" }, "end": { - "line": 17, - "column": 29, + "line": 18, + "column": 2, "program": "ambient_indexer_6.ets" } } @@ -198,8 +198,8 @@ "program": "ambient_indexer_6.ets" }, "end": { - "line": 17, - "column": 29, + "line": 18, + "column": 2, "program": "ambient_indexer_6.ets" } } @@ -211,8 +211,8 @@ "program": "ambient_indexer_6.ets" }, "end": { - "line": 17, - "column": 29, + "line": 18, + "column": 2, "program": "ambient_indexer_6.ets" } } @@ -224,8 +224,8 @@ "program": "ambient_indexer_6.ets" }, "end": { - "line": 17, - "column": 29, + "line": 18, + "column": 2, "program": "ambient_indexer_6.ets" } } @@ -238,8 +238,8 @@ "program": "ambient_indexer_6.ets" }, "end": { - "line": 17, - "column": 29, + "line": 18, + "column": 2, "program": "ambient_indexer_6.ets" } } @@ -251,8 +251,8 @@ "program": "ambient_indexer_6.ets" }, "end": { - "line": 17, - "column": 29, + "line": 18, + "column": 2, "program": "ambient_indexer_6.ets" } } @@ -273,8 +273,8 @@ "program": "ambient_indexer_6.ets" }, "end": { - "line": 17, - "column": 29, + "line": 18, + "column": 2, "program": "ambient_indexer_6.ets" } } @@ -286,8 +286,8 @@ "program": "ambient_indexer_6.ets" }, "end": { - "line": 17, - "column": 29, + "line": 18, + "column": 2, "program": "ambient_indexer_6.ets" } } @@ -299,8 +299,8 @@ "program": "ambient_indexer_6.ets" }, "end": { - "line": 17, - "column": 29, + "line": 18, + "column": 2, "program": "ambient_indexer_6.ets" } } @@ -313,8 +313,8 @@ "program": "ambient_indexer_6.ets" }, "end": { - "line": 17, - "column": 29, + "line": 18, + "column": 2, "program": "ambient_indexer_6.ets" } } @@ -326,8 +326,8 @@ "program": "ambient_indexer_6.ets" }, "end": { - "line": 17, - "column": 29, + "line": 18, + "column": 2, "program": "ambient_indexer_6.ets" } } @@ -341,8 +341,8 @@ "program": "ambient_indexer_6.ets" }, "end": { - "line": 17, - "column": 29, + "line": 18, + "column": 2, "program": "ambient_indexer_6.ets" } } @@ -360,8 +360,8 @@ "program": "ambient_indexer_6.ets" }, "end": { - "line": 17, - "column": 29, + "line": 18, + "column": 2, "program": "ambient_indexer_6.ets" } } @@ -386,8 +386,8 @@ "program": "ambient_indexer_6.ets" }, "end": { - "line": 17, - "column": 29, + "line": 18, + "column": 2, "program": "ambient_indexer_6.ets" } } @@ -416,8 +416,8 @@ "program": "ambient_indexer_6.ets" }, "end": { - "line": 17, - "column": 29, + "line": 18, + "column": 2, "program": "ambient_indexer_6.ets" } } @@ -429,8 +429,8 @@ "program": "ambient_indexer_6.ets" }, "end": { - "line": 17, - "column": 29, + "line": 18, + "column": 2, "program": "ambient_indexer_6.ets" } } @@ -442,8 +442,8 @@ "program": "ambient_indexer_6.ets" }, "end": { - "line": 17, - "column": 29, + "line": 18, + "column": 2, "program": "ambient_indexer_6.ets" } } @@ -456,8 +456,8 @@ "program": "ambient_indexer_6.ets" }, "end": { - "line": 17, - "column": 29, + "line": 18, + "column": 2, "program": "ambient_indexer_6.ets" } } @@ -469,8 +469,8 @@ "program": "ambient_indexer_6.ets" }, "end": { - "line": 17, - "column": 29, + "line": 18, + "column": 2, "program": "ambient_indexer_6.ets" } } @@ -495,8 +495,8 @@ "program": "ambient_indexer_6.ets" }, "end": { - "line": 17, - "column": 29, + "line": 18, + "column": 2, "program": "ambient_indexer_6.ets" } } @@ -508,8 +508,8 @@ "program": "ambient_indexer_6.ets" }, "end": { - "line": 17, - "column": 29, + "line": 18, + "column": 2, "program": "ambient_indexer_6.ets" } } @@ -521,8 +521,8 @@ "program": "ambient_indexer_6.ets" }, "end": { - "line": 17, - "column": 29, + "line": 18, + "column": 2, "program": "ambient_indexer_6.ets" } } @@ -535,8 +535,8 @@ "program": "ambient_indexer_6.ets" }, "end": { - "line": 17, - "column": 29, + "line": 18, + "column": 2, "program": "ambient_indexer_6.ets" } } @@ -548,8 +548,8 @@ "program": "ambient_indexer_6.ets" }, "end": { - "line": 17, - "column": 29, + "line": 18, + "column": 2, "program": "ambient_indexer_6.ets" } } @@ -564,8 +564,8 @@ "program": "ambient_indexer_6.ets" }, "end": { - "line": 17, - "column": 29, + "line": 18, + "column": 2, "program": "ambient_indexer_6.ets" } } @@ -578,8 +578,8 @@ "program": "ambient_indexer_6.ets" }, "end": { - "line": 17, - "column": 29, + "line": 18, + "column": 2, "program": "ambient_indexer_6.ets" } } @@ -591,8 +591,8 @@ "program": "ambient_indexer_6.ets" }, "end": { - "line": 17, - "column": 29, + "line": 18, + "column": 2, "program": "ambient_indexer_6.ets" } } @@ -606,8 +606,8 @@ "program": "ambient_indexer_6.ets" }, "end": { - "line": 17, - "column": 29, + "line": 18, + "column": 2, "program": "ambient_indexer_6.ets" } } diff --git a/ets2panda/test/test-lists/srcdumper/srcdumper-ets-ignored.txt b/ets2panda/test/test-lists/srcdumper/srcdumper-ets-ignored.txt index b5733b79245a75b90880d400b1c4bbc49b5c8586..eac94736cff69627dbcb2929876740f7a8e0b632 100644 --- a/ets2panda/test/test-lists/srcdumper/srcdumper-ets-ignored.txt +++ b/ets2panda/test/test-lists/srcdumper/srcdumper-ets-ignored.txt @@ -63,6 +63,7 @@ ast/parser/ets/re_export/re_export_15.ets ast/parser/ets/re_export/re_export_16.ets parser/ets/ambient_indexer_1.ets parser/ets/ambient_indexer_6.ets +ast/parser/ets/ambient_indexer_11.ets parser/ets/conversions.ets parser/ets/declare_namespace.ets runtime/ets/namespace_tests/namespace_import_type_test/namespace_export.ets