From 5f77708df645a4121ddc0e487a98d5ffaf75a42f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=85=B6=E6=96=87?= Date: Sun, 1 Jun 2025 15:43:59 +0800 Subject: [PATCH] Revert "interface object literal lowering refactoring" Signed-off-by: DreamLoveJay This reverts commit 845be18a9c5f31e7ec2a42230547323f40eb2e57. Change-Id: Ib4babb8b819ae13833dff1f23f19aeaff3d59a3e --- ets2panda/checker/ets/dynamic.cpp | 6 +- .../ets/interfaceObjectLiteralLowering.cpp | 216 ++++++------------ .../ets/interfaceObjectLiteralLowering.h | 7 +- .../ets/interfacePropertyDeclarations.cpp | 4 +- .../lowering/ets/objectLiteralLowering.cpp | 2 +- ets2panda/compiler/lowering/phase.cpp | 4 +- .../annotations_for_functional_objects.cpp | 2 +- ets2panda/test/unit/lowerings/CMakeLists.txt | 4 - .../lowerings/interface_object_literal.cpp | 57 ----- 9 files changed, 75 insertions(+), 227 deletions(-) delete mode 100644 ets2panda/test/unit/lowerings/interface_object_literal.cpp diff --git a/ets2panda/checker/ets/dynamic.cpp b/ets2panda/checker/ets/dynamic.cpp index 90abef0f88..9fcfc1ce55 100644 --- a/ets2panda/checker/ets/dynamic.cpp +++ b/ets2panda/checker/ets/dynamic.cpp @@ -368,11 +368,7 @@ ir::ClassDeclaration *ETSChecker::BuildClass(util::StringView name, const ClassB VarBinder()->Program()->Ast()->Statements().push_back(classDecl); classDecl->SetParent(VarBinder()->Program()->Ast()); - auto varBinder = VarBinder()->AsETSBinder(); - bool isExternal = VarBinder()->Program() != varBinder->GetGlobalRecordTable()->Program(); - auto recordTable = isExternal ? varBinder->GetExternalRecordTable().at(varBinder->Program()) - : VarBinder()->AsETSBinder()->GetGlobalRecordTable(); - varbinder::BoundContext boundCtx(recordTable, classDef); + varbinder::BoundContext boundCtx(VarBinder()->AsETSBinder()->GetGlobalRecordTable(), classDef); ArenaVector classBody(ProgramAllocator()->Adapter()); diff --git a/ets2panda/compiler/lowering/ets/interfaceObjectLiteralLowering.cpp b/ets2panda/compiler/lowering/ets/interfaceObjectLiteralLowering.cpp index 7b00e071ae..f19178ec3e 100644 --- a/ets2panda/compiler/lowering/ets/interfaceObjectLiteralLowering.cpp +++ b/ets2panda/compiler/lowering/ets/interfaceObjectLiteralLowering.cpp @@ -23,7 +23,6 @@ namespace ark::es2panda::compiler { -static constexpr std::string_view OBJECT_LITERAL_SUFFIX = "$ObjectLiteral"; using ReadonlyFieldHolder = std::tuple; // anonClassFieldName, paramName, fieldType @@ -124,22 +123,23 @@ static ir::MethodDefinition *CreateAnonClassFieldGetterSetter(public_lib::Contex } static void FillClassBody(public_lib::Context *ctx, ArenaVector *classBody, - const ArenaVector &ifaceBody, ArenaVector &readonlyFields, + const ArenaVector &ifaceBody, ir::ObjectExpression *objExpr, + ArenaVector &readonlyFields, checker::ETSObjectType *currentType = nullptr) { + auto *checker = ctx->checker->AsETSChecker(); + for (auto *it : ifaceBody) { ES2PANDA_ASSERT(it->IsMethodDefinition()); auto *ifaceMethod = it->AsMethodDefinition(); - if (!ifaceMethod->Function()->IsGetter()) { - continue; + if (!ifaceMethod->Function()->IsGetter() && !ifaceMethod->Function()->IsSetter()) { + checker->LogError(diagnostic::INTERFACE_WITH_METHOD, {}, objExpr->Start()); + objExpr->SetTsType(checker->GlobalTypeError()); + return; } - auto iter = std::find_if(classBody->begin(), classBody->end(), [ifaceMethod](ir::AstNode *ast) -> bool { - return ast->IsMethodDefinition() && ast->AsMethodDefinition()->Function()->IsGetter() && - ast->AsMethodDefinition()->Id()->Name() == ifaceMethod->Id()->Name(); - }); - if (iter != classBody->end()) { + if (!ifaceMethod->Function()->IsGetter()) { continue; } @@ -183,24 +183,25 @@ static void FillClassBody(public_lib::Context *ctx, ArenaVector * // CC-OFFNXT(G.FUN.01-CPP) solid logic static void FillAnonClassBody(public_lib::Context *ctx, ArenaVector *classBody, - ir::TSInterfaceDeclaration *ifaceNode, ArenaVector &readonlyFields, + ir::TSInterfaceDeclaration *ifaceNode, ir::ObjectExpression *objExpr, + ArenaVector &readonlyFields, checker::ETSObjectType *interfaceType = nullptr) { - FillClassBody(ctx, classBody, ifaceNode->Body()->Body(), readonlyFields, interfaceType); for (auto *extendedIface : ifaceNode->TsType()->AsETSObjectType()->Interfaces()) { - FillAnonClassBody(ctx, classBody, extendedIface->GetDeclNode()->AsTSInterfaceDeclaration(), readonlyFields, - extendedIface); + FillAnonClassBody(ctx, classBody, extendedIface->GetDeclNode()->AsTSInterfaceDeclaration(), objExpr, + readonlyFields, extendedIface); } + + FillClassBody(ctx, classBody, ifaceNode->Body()->Body(), objExpr, readonlyFields, interfaceType); } // Annotate synthetic class so we can determite it's origin in a runtime // Now implemented for the anon class generated from an interface only static void AnnotateGeneratedAnonClass(checker::ETSChecker *checker, ir::ClassDefinition *classDef) { - auto *annoId = - checker->ProgramAllocNode(Signatures::INTERFACE_OBJ_LITERAL, checker->ProgramAllocator()); + auto *annoId = checker->AllocNode(Signatures::INTERFACE_OBJ_LITERAL, checker->Allocator()); annoId->SetAnnotationUsage(); - auto *annoUsage = checker->ProgramAllocNode(annoId, checker->ProgramAllocator()); + auto *annoUsage = checker->AllocNode(annoId, checker->Allocator()); annoUsage->AddModifier(ir::ModifierFlags::ANNOTATION_USAGE); annoUsage->SetParent(classDef); annoId->SetParent(annoUsage); @@ -209,28 +210,27 @@ static void AnnotateGeneratedAnonClass(checker::ETSChecker *checker, ir::ClassDe CheckLoweredNode(checker->VarBinder()->AsETSBinder(), checker, annoUsage); } -static void GenerateAnonClassTypeFromInterface(public_lib::Context *ctx, ir::TSInterfaceDeclaration *ifaceNode) +static checker::Type *GenerateAnonClassTypeFromInterface(public_lib::Context *ctx, + ir::TSInterfaceDeclaration *ifaceNode, + ir::ObjectExpression *objExpr) { auto *checker = ctx->checker->AsETSChecker(); if (ifaceNode->GetAnonClass() != nullptr) { - return; + return ifaceNode->GetAnonClass()->Definition()->TsType()->AsETSObjectType(); } - auto classBodyBuilder = [ctx, checker, ifaceNode](ArenaVector *classBody) { + auto classBodyBuilder = [ctx, checker, ifaceNode, objExpr](ArenaVector *classBody) { if (ifaceNode->TsType() == nullptr) { ifaceNode->Check(checker); } ArenaVector readonlyFields(ctx->Allocator()->Adapter()); - FillAnonClassBody(ctx, classBody, ifaceNode, readonlyFields); + FillAnonClassBody(ctx, classBody, ifaceNode, objExpr, readonlyFields); classBody->push_back(CreateAnonClassImplCtor(ctx, readonlyFields)); }; - auto originalName = std::string {ifaceNode->InternalName()}; - std::replace(originalName.begin(), originalName.end(), '.', '$'); - auto anonClassName = util::UString(originalName.append(OBJECT_LITERAL_SUFFIX), checker->ProgramAllocator()); + auto anonClassName = GenName(ctx->Allocator()); auto *classDecl = checker->BuildClass(anonClassName.View(), classBodyBuilder); - RefineSourceRanges(classDecl); auto *classDef = classDecl->Definition(); auto *classType = classDef->TsType()->AsETSObjectType(); classDef->SetAnonymousModifier(); @@ -260,17 +260,20 @@ static void GenerateAnonClassTypeFromInterface(public_lib::Context *ctx, ir::TSI checker->GetInterfacesOfClass(classType); ifaceNode->SetAnonClass(classDecl); + return classType; } -static void GenerateAnonClassTypeFromAbstractClass(public_lib::Context *ctx, ir::ClassDefinition *abstractClassNode) +static checker::Type *GenerateAnonClassTypeFromAbstractClass(public_lib::Context *ctx, + ir::ClassDefinition *abstractClassNode, + ir::ObjectExpression *objExpr) { auto *checker = ctx->checker->AsETSChecker(); if (abstractClassNode->GetAnonClass() != nullptr) { - return; + return abstractClassNode->GetAnonClass()->Definition()->TsType()->AsETSObjectType(); } - auto classBodyBuilder = [checker](ArenaVector *classBody) { + auto classBodyBuilder = [checker, abstractClassNode, objExpr](ArenaVector *classBody) { checker::ETSChecker::ClassInitializerBuilder initBuilder = [checker]([[maybe_unused]] ArenaVector *statements, [[maybe_unused]] ArenaVector *params) { @@ -279,13 +282,17 @@ static void GenerateAnonClassTypeFromAbstractClass(public_lib::Context *ctx, ir: auto ctor = checker->CreateClassInstanceInitializer(initBuilder); classBody->push_back(ctor); + + for (auto *it : abstractClassNode->Body()) { + if (it->IsMethodDefinition() && it->AsMethodDefinition()->IsAbstract()) { + checker->LogError(diagnostic::ABSTRACT_METH_IN_ABSTRACT_CLASS, {it->AsMethodDefinition()->Id()->Name()}, + objExpr->Start()); + } + } }; - auto originalName = std::string {abstractClassNode->InternalName()}; - std::replace(originalName.begin(), originalName.end(), '.', '$'); - auto anonClassName = util::UString(originalName.append(OBJECT_LITERAL_SUFFIX), checker->ProgramAllocator()); + auto anonClassName = GenName(ctx->Allocator()); auto *classDecl = checker->BuildClass(anonClassName.View(), classBodyBuilder); - RefineSourceRanges(classDecl); auto *classDef = classDecl->Definition(); auto *classType = classDef->TsType()->AsETSObjectType(); @@ -305,38 +312,8 @@ static void GenerateAnonClassTypeFromAbstractClass(public_lib::Context *ctx, ir: } abstractClassNode->SetAnonClass(classDecl); - classType->SetSuperType(abstractClassNode->TsType()->AsETSObjectType()); -} - -static checker::Type *ProcessDeclNode(checker::ETSChecker *checker, checker::ETSObjectType *targetType, - ir::ObjectExpression *objExpr) -{ - auto *declNode = targetType->GetDeclNode(); - - if (declNode->IsTSInterfaceDeclaration()) { - auto *ifaceNode = declNode->AsTSInterfaceDeclaration(); - if (ifaceNode->GetAnonClass() == nullptr) { - checker->LogError(diagnostic::INTERFACE_WITH_METHOD, {}, objExpr->Start()); - return checker->GlobalTypeError(); - } - return ifaceNode->GetAnonClass()->Definition()->TsType(); - } - - auto *classDef = declNode->AsClassDefinition(); - ES2PANDA_ASSERT(classDef->IsAbstract()); - - if (classDef->GetAnonClass() == nullptr) { - for (auto it : classDef->Body()) { - if (!it->IsMethodDefinition() || !it->AsMethodDefinition()->IsAbstract()) { - continue; - } - - checker->LogError(diagnostic::ABSTRACT_METH_IN_ABSTRACT_CLASS, {it->AsMethodDefinition()->Id()->Name()}, - objExpr->Start()); - return checker->GlobalTypeError(); - } - } - return classDef->GetAnonClass()->Definition()->TsType(); + classType->SetSuperType(objExpr->TsType()->AsETSObjectType()); + return classType; } static void HandleInterfaceLowering(public_lib::Context *ctx, ir::ObjectExpression *objExpr) @@ -344,21 +321,22 @@ static void HandleInterfaceLowering(public_lib::Context *ctx, ir::ObjectExpressi auto *checker = ctx->checker->AsETSChecker(); auto *targetType = objExpr->TsType(); checker->CheckObjectLiteralKeys(objExpr->Properties()); - - auto *etsTargetType = targetType->AsETSObjectType(); - checker::Type *resultType = ProcessDeclNode(checker, etsTargetType, objExpr); - - if (resultType->IsTypeError()) { - objExpr->SetTsType(resultType); - return; + checker::Type *resultType; + if (targetType->AsETSObjectType()->GetDeclNode()->IsTSInterfaceDeclaration()) { + auto *ifaceNode = targetType->AsETSObjectType()->GetDeclNode()->AsTSInterfaceDeclaration(); + resultType = GenerateAnonClassTypeFromInterface(ctx, ifaceNode, objExpr); + } else { + ES2PANDA_ASSERT(targetType->AsETSObjectType()->GetDeclNode()->AsClassDefinition()->IsAbstract()); + auto *abstractClassNode = targetType->AsETSObjectType()->GetDeclNode()->AsClassDefinition(); + resultType = GenerateAnonClassTypeFromAbstractClass(ctx, abstractClassNode, objExpr); } - if (etsTargetType->IsPartial()) { - resultType->AsETSObjectType()->SetBaseType(etsTargetType->GetBaseType()); + if (targetType->AsETSObjectType()->IsPartial()) { + resultType->AsETSObjectType()->SetBaseType(targetType->AsETSObjectType()->GetBaseType()); } - if (!etsTargetType->TypeArguments().empty()) { - ArenaVector typeArgTypes(etsTargetType->TypeArguments()); + if (!targetType->AsETSObjectType()->TypeArguments().empty()) { + ArenaVector typeArgTypes(targetType->AsETSObjectType()->TypeArguments()); checker::InstantiationContext instantiationCtx(checker, resultType->AsETSObjectType(), std::move(typeArgTypes), objExpr->Start()); resultType = instantiationCtx.Result(); @@ -366,58 +344,17 @@ static void HandleInterfaceLowering(public_lib::Context *ctx, ir::ObjectExpressi if (const auto *const parent = objExpr->Parent(); parent->IsArrayExpression()) { for (auto *elem : parent->AsArrayExpression()->Elements()) { - if (elem->IsObjectExpression()) { - elem->AsObjectExpression()->SetTsType(resultType); + if (!elem->IsObjectExpression()) { + continue; } + // Adjusting ts types of other object literals in array + elem->AsObjectExpression()->SetTsType(resultType); } } objExpr->SetTsType(resultType); } -static bool CheckInterfaceShouldGenerateAnonClass(ir::TSInterfaceDeclaration *interfaceDecl) -{ - for (auto it : interfaceDecl->Body()->Body()) { - ES2PANDA_ASSERT(it->IsMethodDefinition()); - auto methodDef = it->AsMethodDefinition(); - if (!methodDef->Function()->IsGetter() && !methodDef->Function()->IsSetter()) { - return false; - } - } - - return true; -} - -static bool CheckAbstractClassShouldGenerateAnonClass(ir::ClassDefinition *classDef) -{ - auto constructorSigs = classDef->TsType()->AsETSObjectType()->ConstructSignatures(); - if (auto res = std::find_if(constructorSigs.cbegin(), constructorSigs.cend(), - [](checker::Signature *sig) -> bool { return sig->MinArgCount() == 0; }); - res == constructorSigs.cend()) { - return false; - } - for (auto it : classDef->Body()) { - if (it->IsMethodDefinition() && it->AsMethodDefinition()->IsAbstract()) { - return false; - } - } - - return true; -} - -static void TransfromInterfaceDecl(public_lib::Context *ctx, parser::Program *program) -{ - program->Ast()->IterateRecursivelyPostorder([ctx, program](ir::AstNode *ast) -> void { - if (ast->IsTSInterfaceDeclaration() && CheckInterfaceShouldGenerateAnonClass(ast->AsTSInterfaceDeclaration())) { - GenerateAnonClassTypeFromInterface(ctx, ast->AsTSInterfaceDeclaration()); - } else if (ast->IsClassDefinition() && ast != program->GlobalClass() && - ast->AsClassDefinition()->IsAbstract() && - CheckAbstractClassShouldGenerateAnonClass(ast->AsClassDefinition())) { - GenerateAnonClassTypeFromAbstractClass(ctx, ast->AsClassDefinition()); - } - }); -} - -static void TransfromInterfaceLiteral(public_lib::Context *ctx, parser::Program *program) +bool InterfaceObjectLiteralLowering::PerformForModule(public_lib::Context *ctx, parser::Program *program) { program->Ast()->IterateRecursivelyPostorder([ctx](ir::AstNode *ast) -> void { if (ast->IsObjectExpression() && (IsInterfaceType(ast->AsObjectExpression()->TsType()) || @@ -425,39 +362,16 @@ static void TransfromInterfaceLiteral(public_lib::Context *ctx, parser::Program HandleInterfaceLowering(ctx, ast->AsObjectExpression()); } }); -} - -bool InterfaceObjectLiteralLowering::Perform(public_lib::Context *ctx, parser::Program *program) -{ - auto *varbinder = program->VarBinder()->AsETSBinder(); - for (auto &[_, extPrograms] : program->ExternalSources()) { - (void)_; - for (auto *extProg : extPrograms) { - auto *savedProgram = varbinder->Program(); - auto *savedRecordTable = varbinder->GetRecordTable(); - auto *savedTopScope = varbinder->TopScope(); - varbinder->ResetTopScope(extProg->GlobalScope()); - varbinder->SetRecordTable(varbinder->GetExternalRecordTable().at(extProg)); - varbinder->SetProgram(extProg); - TransfromInterfaceDecl(ctx, extProg); - varbinder->SetProgram(savedProgram); - varbinder->SetRecordTable(savedRecordTable); - varbinder->ResetTopScope(savedTopScope); - } - } - - TransfromInterfaceDecl(ctx, program); - - for (auto &[_, extPrograms] : program->ExternalSources()) { - (void)_; - for (auto *extProg : extPrograms) { - TransfromInterfaceLiteral(ctx, extProg); - } - } - - TransfromInterfaceLiteral(ctx, program); return true; } +bool InterfaceObjectLiteralLowering::PostconditionForModule([[maybe_unused]] public_lib::Context *ctx, + const parser::Program *program) +{ + return !program->Ast()->IsAnyChild([](const ir::AstNode *ast) -> bool { + return ast->IsObjectExpression() && (IsInterfaceType(ast->AsObjectExpression()->TsType()) || + IsAbstractClassType(ast->AsObjectExpression()->TsType())); + }); +} } // namespace ark::es2panda::compiler diff --git a/ets2panda/compiler/lowering/ets/interfaceObjectLiteralLowering.h b/ets2panda/compiler/lowering/ets/interfaceObjectLiteralLowering.h index 055e3a64b3..b784b365c5 100644 --- a/ets2panda/compiler/lowering/ets/interfaceObjectLiteralLowering.h +++ b/ets2panda/compiler/lowering/ets/interfaceObjectLiteralLowering.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024-2025 Huawei Device Co., Ltd. + * Copyright (c) 2024 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 @@ -20,10 +20,11 @@ namespace ark::es2panda::compiler { -class InterfaceObjectLiteralLowering : public Phase { +class InterfaceObjectLiteralLowering : public PhaseForDeclarations { public: std::string_view Name() const override; - bool Perform(public_lib::Context *ctx, parser::Program *program) override; + bool PerformForModule(public_lib::Context *ctx, parser::Program *program) override; + bool PostconditionForModule(public_lib::Context *ctx, const parser::Program *program) override; }; } // namespace ark::es2panda::compiler diff --git a/ets2panda/compiler/lowering/ets/interfacePropertyDeclarations.cpp b/ets2panda/compiler/lowering/ets/interfacePropertyDeclarations.cpp index c997421bf4..e2ab2434ff 100644 --- a/ets2panda/compiler/lowering/ets/interfacePropertyDeclarations.cpp +++ b/ets2panda/compiler/lowering/ets/interfacePropertyDeclarations.cpp @@ -287,9 +287,7 @@ void InterfacePropertyDeclarationsPhase::UpdateClassProperties(public_lib::Conte GetPropCollector().InitVisitedInterfaces(); for (const auto &implement : klass->Implements()) { - std::string interId = implement->Expr()->IsOpaqueTypeNode() - ? implement->Expr()->TsType()->AsETSObjectType()->Name().Mutf8() - : implement->Expr()->AsETSTypeReference()->Part()->Name()->ToString(); + std::string interId = implement->Expr()->AsETSTypeReference()->Part()->Name()->ToString(); CollectSuperInterfaceProperties(implInterfaceProperties, interId); } diff --git a/ets2panda/compiler/lowering/ets/objectLiteralLowering.cpp b/ets2panda/compiler/lowering/ets/objectLiteralLowering.cpp index e24fe2ea47..03f853cf44 100644 --- a/ets2panda/compiler/lowering/ets/objectLiteralLowering.cpp +++ b/ets2panda/compiler/lowering/ets/objectLiteralLowering.cpp @@ -314,7 +314,7 @@ bool ObjectLiteralLowering::PostconditionForModule([[maybe_unused]] public_lib:: { // In all object literal contexts (except dynamic) a substitution should take place return !program->Ast()->IsAnyChild([](const ir::AstNode *ast) -> bool { - return ast->IsObjectExpression() && ast->AsObjectExpression()->TsType()->IsETSObjectType() && + return ast->IsObjectExpression() && !ast->AsObjectExpression()->TsType()->AsETSObjectType()->HasObjectFlag(checker::ETSObjectFlags::DYNAMIC); }); } diff --git a/ets2panda/compiler/lowering/phase.cpp b/ets2panda/compiler/lowering/phase.cpp index 41cf70c6af..5d76f8b5f8 100644 --- a/ets2panda/compiler/lowering/phase.cpp +++ b/ets2panda/compiler/lowering/phase.cpp @@ -191,11 +191,11 @@ std::vector GetETSPhaseList() &g_unionLowering, &g_expandBracketsPhase, &g_localClassLowering, - &g_partialExportClassGen, - &g_interfaceObjectLiteralLowering, // this lowering should be put after all classs generated. + &g_interfaceObjectLiteralLowering, &g_objectLiteralLowering, &g_stringConstructorLowering, &g_stringComparisonLowering, + &g_partialExportClassGen, &g_optionalArgumentsLowering, // #22952 could be moved to earlier phase &g_genericBridgesLowering, &g_typeFromLowering, diff --git a/ets2panda/test/unit/annotations/annotations_for_functional_objects.cpp b/ets2panda/test/unit/annotations/annotations_for_functional_objects.cpp index 49fb6a853f..c1acdc863e 100644 --- a/ets2panda/test/unit/annotations/annotations_for_functional_objects.cpp +++ b/ets2panda/test/unit/annotations/annotations_for_functional_objects.cpp @@ -45,7 +45,7 @@ public: void CheckClassAnnotations(pandasm::Program *program) { - const std::string recordName = "Iface$ObjectLiteral"; + const std::string recordName = "gensym%%_55"; const AnnotationMap expectedClassAnnotations = { {"std.annotations.InterfaceObjectLiteral", {}}, }; diff --git a/ets2panda/test/unit/lowerings/CMakeLists.txt b/ets2panda/test/unit/lowerings/CMakeLists.txt index c63c1298fa..64567a9c94 100644 --- a/ets2panda/test/unit/lowerings/CMakeLists.txt +++ b/ets2panda/test/unit/lowerings/CMakeLists.txt @@ -34,7 +34,3 @@ ets2panda_add_gtest(node_history_test ets2panda_add_gtest(convert_primitive_cast_method_call CPP_SOURCES convert_primitive_cast_method_call.cpp ) - -ets2panda_add_gtest(interface_object_literal_test - CPP_SOURCES interface_object_literal.cpp -) diff --git a/ets2panda/test/unit/lowerings/interface_object_literal.cpp b/ets2panda/test/unit/lowerings/interface_object_literal.cpp deleted file mode 100644 index 1f7700eacf..0000000000 --- a/ets2panda/test/unit/lowerings/interface_object_literal.cpp +++ /dev/null @@ -1,57 +0,0 @@ -/** - * 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. - */ - -#include -#include "lowering_test.h" -#include "compiler/lowering/ets/topLevelStmts/topLevelStmts.h" - -namespace ark::es2panda { - -TEST_F(LoweringTest, TestInterfaceObjectLiteral) -{ - char const *text = R"( - interface I1 { - a: number - } - - interface I2 { - a: string - } - - function foo1(a: I1) { } - function foo2(a: I2) { } - - function main() { - foo1({ a: 1 }) - foo2({ a: "2" }) - })"; - - CONTEXT(ES2PANDA_STATE_LOWERED, text) - { - const auto *const ast = GetAst(); - [[maybe_unused]] auto *classDef1 = ast->FindChild([](ir::AstNode *child) { - return child->IsClassDefinition() && - (child->AsClassDefinition()->InternalName().Mutf8() == "dummy.dummy$I1$ObjectLiteral"); - }); - ASSERT_TRUE(classDef1 != nullptr); - [[maybe_unused]] auto *classDef2 = ast->FindChild([](ir::AstNode *child) { - return child->IsClassDefinition() && - (child->AsClassDefinition()->InternalName().Mutf8() == "dummy.dummy$I2$ObjectLiteral"); - }); - ASSERT_TRUE(classDef1 != nullptr); - } -} - -} // namespace ark::es2panda -- Gitee