From 884b01274cd2aa501b2ff45d6e4c8eb6ffeabe77 Mon Sep 17 00:00:00 2001 From: lixl9 Date: Sat, 5 Jul 2025 21:59:58 +0800 Subject: [PATCH] Fix the default keyword generic issue Issue: https://gitee.com/openharmony/arkcompiler_ets_frontend/issues/ICK8MI Signed-off-by: lixinglong --- .../lowering/ets/genericBridgesLowering.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/ets2panda/compiler/lowering/ets/genericBridgesLowering.cpp b/ets2panda/compiler/lowering/ets/genericBridgesLowering.cpp index 7ec0e78cdb..29df4c1d56 100644 --- a/ets2panda/compiler/lowering/ets/genericBridgesLowering.cpp +++ b/ets2panda/compiler/lowering/ets/genericBridgesLowering.cpp @@ -152,12 +152,14 @@ void GenericBridgesPhase::ProcessScriptFunction(ir::ClassDefinition const *const // or have type parameters that are not modified in the derived class ES2PANDA_ASSERT(baseFunction); auto const *baseSignature1 = baseFunction->Signature()->Substitute(relation, &substitutions.baseConstraints); - if (baseSignature1 == baseFunction->Signature()) { + if (baseSignature1 == baseFunction->Signature() && + !baseSignature1->HasSignatureFlag(checker::SignatureFlags::DEFAULT)) { return; } auto *baseSignature2 = baseFunction->Signature()->Substitute(relation, &substitutions.derivedSubstitutions); - if (baseSignature2 == baseFunction->Signature()) { + if (baseSignature2 == baseFunction->Signature() && + !baseSignature2->HasSignatureFlag(checker::SignatureFlags::DEFAULT)) { return; } baseSignature2 = baseSignature2->Substitute(relation, &substitutions.derivedConstraints); @@ -178,8 +180,8 @@ void GenericBridgesPhase::ProcessScriptFunction(ir::ClassDefinition const *const // This derived overload already handles the base union signature. return; } - - if (derivedFunction == nullptr && overrides(signature, baseSignature2)) { + if ((derivedFunction == nullptr && overrides(signature, baseSignature2)) || + (baseSignature1 == baseSignature2 && baseSignature1->HasSignatureFlag(checker::SignatureFlags::DEFAULT))) { // NOTE: we don't care the possible case of mapping several derived function to the same bridge // signature. Probably sometimes we will process it correctly or issue warning notification here... derivedFunction = signature->Function(); @@ -338,6 +340,14 @@ ir::ClassDefinition *GenericBridgesPhase::ProcessClassDefinition(ir::ClassDefini auto const &superClassBody = classDefinition->Super()->TsType()->AsETSObjectType()->GetDeclNode()->AsClassDefinition()->Body(); CreateGenericBridges(classDefinition, substitutions, superClassBody); + ArenaVector interfaces = + classDefinition->Super()->TsType()->AsETSObjectType()->Interfaces(); + if (!interfaces.empty()) { + for (checker::ETSObjectType *interface : interfaces) { + auto &interfaceBody = interface->GetDeclNode()->AsTSInterfaceDeclaration()->Body()->Body(); + CreateGenericBridges(classDefinition, substitutions, interfaceBody); + } + } } return classDefinition; -- Gitee