From c005b95bda3ecec4acd5f4117d9bd5899c833cce Mon Sep 17 00:00:00 2001 From: leo9001 Date: Thu, 19 Jun 2025 11:27:39 +0800 Subject: [PATCH] support getApplicableRefactors chain support getApplicableRefactors chain Issue:https://gitee.com/openharmony/arkcompiler_ets_frontend/issues/ICG9YO Signed-off-by: leo9001 --- ets2panda/lsp/src/refactors/convert_chain.cpp | 51 +++++++++++-------- .../unit/lsp/refactors_convert_chain_test.cpp | 4 +- 2 files changed, 32 insertions(+), 23 deletions(-) diff --git a/ets2panda/lsp/src/refactors/convert_chain.cpp b/ets2panda/lsp/src/refactors/convert_chain.cpp index 1d76ecaee2..acec520490 100644 --- a/ets2panda/lsp/src/refactors/convert_chain.cpp +++ b/ets2panda/lsp/src/refactors/convert_chain.cpp @@ -17,27 +17,26 @@ #include "refactors/convert_chain.h" #include "refactor_provider.h" #include "internal_api.h" +#include "public/public.h" namespace ark::es2panda::lsp { - -ark::es2panda::ir::AstNode *FindType(ark::es2panda::ir::AstNode *node); - ConvertChainRefactor::ConvertChainRefactor() { AddKind(std::string(TO_NAMED_CHAIN_ACTION.kind)); } -ark::es2panda::ir::AstNode *FindType(ark::es2panda::ir::AstNode *node) +ark::es2panda::ir::AstNode *FindETSNullType(ark::es2panda::ir::AstNode *node, es2panda_Context *context) { - if ((node != nullptr) && (node->Parent() != nullptr)) { - if (node->Parent()->IsExpression()) { - return node; - } - auto cb = [](ir::AstNode *ancestorNode) { return ancestorNode->IsConditionalExpression(); }; - node = FindAncestor(node, cb); - return node; - } - return node; + auto consequent = node->AsConditionalExpression()->Consequent(); + auto nodeproperty = consequent->AsMemberExpression()->Property(); + auto ctx = reinterpret_cast(context); + auto targetNode = ctx->parserProgram->Ast()->FindChild([&nodeproperty](ir::AstNode *childNode) { + return childNode->IsScriptFunction() && + childNode->AsScriptFunction()->Id()->AsIdentifier()->Name() == nodeproperty->AsIdentifier()->Name(); + }); + auto etc = targetNode->FindChild([](ir::AstNode *childNode) { return childNode->IsETSNullType(); }); + + return etc; } ApplicableRefactorInfo ConvertChainRefactor::GetAvailableActions(const RefactorContext &refContext) const @@ -55,13 +54,25 @@ ApplicableRefactorInfo ConvertChainRefactor::GetAvailableActions(const RefactorC return res; } - auto nodedec1 = FindType(node); - if (nodedec1 != nullptr && (nodedec1->IsConditionalExpression() || nodedec1->IsExpression())) { - res.name = refactor_name::CONVERT_CHAIN_REFACTOR_NAME; - res.description = refactor_description::CONVERT_CHAIN_REFACTOR_DESC; - res.action.kind = std::string(TO_NAMED_CHAIN_ACTION.kind); - res.action.name = std::string(TO_NAMED_CHAIN_ACTION.name); - res.action.description = std::string(TO_NAMED_CHAIN_ACTION.description); + auto parent = node->Parent(); + if (parent != nullptr && parent->IsExpression()) { + if (parent->IsConditionalExpression()) { + auto etc = FindETSNullType(parent, context); + if (etc != nullptr) { + return res; + } + res.name = refactor_name::CONVERT_CHAIN_REFACTOR_NAME; + res.description = refactor_description::CONVERT_CHAIN_REFACTOR_DESC; + res.action.kind = std::string(TO_NAMED_CHAIN_ACTION.kind); + res.action.name = std::string(TO_NAMED_CHAIN_ACTION.name); + res.action.description = std::string(TO_NAMED_CHAIN_ACTION.description); + } else { + res.name = refactor_name::CONVERT_CHAIN_REFACTOR_NAME; + res.description = refactor_description::CONVERT_CHAIN_REFACTOR_DESC; + res.action.kind = std::string(TO_NAMED_CHAIN_ACTION.kind); + res.action.name = std::string(TO_NAMED_CHAIN_ACTION.name); + res.action.description = std::string(TO_NAMED_CHAIN_ACTION.description); + } } return res; } diff --git a/ets2panda/test/unit/lsp/refactors_convert_chain_test.cpp b/ets2panda/test/unit/lsp/refactors_convert_chain_test.cpp index 67e51357ec..514202b21a 100644 --- a/ets2panda/test/unit/lsp/refactors_convert_chain_test.cpp +++ b/ets2panda/test/unit/lsp/refactors_convert_chain_test.cpp @@ -80,10 +80,8 @@ foo.bar.baz : "whenFalse";/*2*/ refactorContext.kind = std::string(TO_NAMED_CHAIN_KIND); refactorContext.span.pos = pos + REFACTOR_CHAIN_POSITION_OFFSET; auto result = GetApplicableRefactorsImpl(&refactorContext); - initializer.DestroyContext(ctx); - ASSERT_EQ(1, result.size()); - ASSERT_EQ(std::string(TO_NAMED_CHAIN_NAME), result[0].action.name); + ASSERT_EQ(0, result.size()); } TEST_F(LspChainRefTests, ConvertChainRefactor3) -- Gitee