From a1c37a36397be237521cf18c775280ba9ee7142a Mon Sep 17 00:00:00 2001 From: Peter Pronai Date: Mon, 22 Jul 2024 16:48:49 +0200 Subject: [PATCH] Fix auto getter/setter for external interface Adds tracking in ETSchecker for external modules and uses it to determine whether generated setters and getters should be external. Fixes #17905 internal issue. Issue: https://gitee.com/openharmony/arkcompiler_ets_frontend/issues/IADGF9 Change-Id: I6718552cab887a7f8a421f97d85cbddff54db3e5 Signed-off-by: Peter Pronai --- ets2panda/checker/ETSchecker.cpp | 2 ++ ets2panda/checker/checkerContext.h | 1 + ets2panda/checker/ets/helpers.cpp | 6 +++--- ets2panda/checker/ets/object.cpp | 4 ---- ets2panda/ir/astNodeFlags.h | 1 - 5 files changed, 6 insertions(+), 8 deletions(-) diff --git a/ets2panda/checker/ETSchecker.cpp b/ets2panda/checker/ETSchecker.cpp index 8556428fab..e3668a1298 100644 --- a/ets2panda/checker/ETSchecker.cpp +++ b/ets2panda/checker/ETSchecker.cpp @@ -196,6 +196,8 @@ void ETSChecker::CheckProgram(parser::Program *program, bool runAnalysis) for (auto &[_, extPrograms] : program->ExternalSources()) { (void)_; for (auto *extProg : extPrograms) { + checker::SavedCheckerContext savedContext(this, Context().Status(), Context().ContainingClass()); + AddStatus(checker::CheckerStatus::IN_EXTERNAL); CheckProgram(extProg, VarBinder()->IsGenStdLib()); } } diff --git a/ets2panda/checker/checkerContext.h b/ets2panda/checker/checkerContext.h index f50d37811a..67d2a0cf5c 100644 --- a/ets2panda/checker/checkerContext.h +++ b/ets2panda/checker/checkerContext.h @@ -53,6 +53,7 @@ enum class CheckerStatus : uint32_t { MEET_BREAK = 1U << 21U, MEET_CONTINUE = 1U << 22U, MEET_THROW = 1U << 23U, + IN_EXTERNAL = 1U << 24U, }; } // namespace ark::es2panda::checker diff --git a/ets2panda/checker/ets/helpers.cpp b/ets2panda/checker/ets/helpers.cpp index 6fde4aa632..3da03cd7b5 100644 --- a/ets2panda/checker/ets/helpers.cpp +++ b/ets2panda/checker/ets/helpers.cpp @@ -2334,7 +2334,7 @@ void ETSChecker::GenerateGetterSetterPropertyAndMethod(ir::ClassProperty *origin { auto *const classDef = classType->GetDeclNode()->AsClassDefinition(); auto *interfaceProp = originalProp->Clone(Allocator(), originalProp->Parent()); - interfaceProp->ClearModifier(ir::ModifierFlags::GETTER_SETTER | ir::ModifierFlags::EXTERNAL); + interfaceProp->ClearModifier(ir::ModifierFlags::GETTER_SETTER); ASSERT(Scope()->IsClassScope()); auto *const scope = Scope()->AsClassScope(); @@ -2369,7 +2369,7 @@ void ETSChecker::GenerateGetterSetterPropertyAndMethod(ir::ClassProperty *origin var = methodScope->FindLocal(name, varbinder::ResolveBindingOptions::BINDINGS); } - if ((originalProp->Modifiers() & ir::ModifierFlags::EXTERNAL) != 0U) { + if (HasStatus(CheckerStatus::IN_EXTERNAL)) { getter->Function()->AddFlag(ir::ScriptFunctionFlags::EXTERNAL); } @@ -2388,7 +2388,7 @@ ir::MethodDefinition *ETSChecker::GenerateSetterForProperty(ir::ClassProperty *o setter->Function()->AddModifier(ir::ModifierFlags::OVERRIDE); } - if ((originalProp->Modifiers() & ir::ModifierFlags::EXTERNAL) != 0U) { + if (HasStatus(CheckerStatus::IN_EXTERNAL)) { setter->Function()->AddFlag(ir::ScriptFunctionFlags::EXTERNAL); } diff --git a/ets2panda/checker/ets/object.cpp b/ets2panda/checker/ets/object.cpp index a9b6d01793..1e6e3c8b60 100644 --- a/ets2panda/checker/ets/object.cpp +++ b/ets2panda/checker/ets/object.cpp @@ -850,10 +850,6 @@ void ETSChecker::ApplyModifiersAndRemoveImplementedAbstracts(ArenaVectorFields()) { if (field->Name() == (*it)->Name()) { - if (isGetSetExternal.isExternal) { - field->Declaration()->Node()->AddModifier(ir::ModifierFlags::EXTERNAL); - } - field->Declaration()->Node()->AddModifier(isGetSetExternal.isGetter && isGetSetExternal.isSetter ? ir::ModifierFlags::GETTER_SETTER : isGetSetExternal.isGetter ? ir::ModifierFlags::GETTER diff --git a/ets2panda/ir/astNodeFlags.h b/ets2panda/ir/astNodeFlags.h index 6ccc32303b..4ed01c98f0 100644 --- a/ets2panda/ir/astNodeFlags.h +++ b/ets2panda/ir/astNodeFlags.h @@ -60,7 +60,6 @@ enum class ModifierFlags : uint32_t { SETTER = 1U << 22U, DEFAULT_EXPORT = 1U << 23U, EXPORT_TYPE = 1U << 24U, - EXTERNAL = 1U << 25U, SUPER_OWNER = 1U << 26U, ACCESS = PUBLIC | PROTECTED | PRIVATE | INTERNAL, ALL = STATIC | ASYNC | ACCESS | DECLARE | READONLY | ABSTRACT, -- Gitee