From 50202119dd74902c7072ecfb8e6b574b9d97d7f6 Mon Sep 17 00:00:00 2001 From: anjiaqi Date: Thu, 26 Jun 2025 14:06:28 +0800 Subject: [PATCH] Modify logDiagnosticWithSuggestion API Issue: https://gitee.com/openharmony/arkcompiler_ets_frontend/issues/ICHWZ1 Reason: Currently, the source range of diagnostic and suggestion share the same source range, but in some cases, they should be different. Description: We delete the range param in logDiagnosticWithSuggestion API, while adding range field into es2panda_SuggestionInfo and adding pos field into es2panda_DiagnosticInfo. Test: pass Signed-off-by: anjiaqi --- ets2panda/lsp/include/internal_api.h | 13 ++++++----- ets2panda/public/es2panda_lib.cpp | 14 ++++++----- ets2panda/public/es2panda_lib.h | 9 +++++--- ets2panda/public/es2panda_lib.idl.erb | 8 ++++--- .../unit/lsp/code_fix/ui_plugin_suggest.cpp | 23 ++++++++++--------- ...o_state_log_diagnostic_with_suggestion.cpp | 6 ++--- 6 files changed, 41 insertions(+), 32 deletions(-) diff --git a/ets2panda/lsp/include/internal_api.h b/ets2panda/lsp/include/internal_api.h index 91cd095e6a6..1ff06ecb996 100644 --- a/ets2panda/lsp/include/internal_api.h +++ b/ets2panda/lsp/include/internal_api.h @@ -59,15 +59,16 @@ public: } es2panda_SuggestionInfo *CreateSuggestionInfo(es2panda_Context *context, const es2panda_DiagnosticKind *kind, - const char **args, size_t argc, const char *substitutionCode) + const char **args, size_t argc, const char *substitutionCode, + es2panda_SourceRange *range) { - return impl_->CreateSuggestionInfo(context, kind, args, argc, substitutionCode); + return impl_->CreateSuggestionInfo(context, kind, args, argc, substitutionCode, range); } es2panda_DiagnosticInfo *CreateDiagnosticInfo(es2panda_Context *context, const es2panda_DiagnosticKind *kind, - const char **args, size_t argc) + const char **args, size_t argc, es2panda_SourcePosition *pos) { - return impl_->CreateDiagnosticInfo(context, kind, args, argc); + return impl_->CreateDiagnosticInfo(context, kind, args, argc, pos); } es2panda_SourcePosition *CreateSourcePosition(es2panda_Context *context, size_t index, size_t line) @@ -82,9 +83,9 @@ public: } void LogDiagnosticWithSuggestion(es2panda_Context *context, const es2panda_DiagnosticInfo *diagnosticInfo, - const es2panda_SuggestionInfo *suggestionInfo, es2panda_SourceRange *range) + const es2panda_SuggestionInfo *suggestionInfo) { - return impl_->LogDiagnosticWithSuggestion(context, diagnosticInfo, suggestionInfo, range); + return impl_->LogDiagnosticWithSuggestion(context, diagnosticInfo, suggestionInfo); } void LogDiagnostic(es2panda_Context *context, const es2panda_DiagnosticKind *ekind, const char **args, size_t argc, diff --git a/ets2panda/public/es2panda_lib.cpp b/ets2panda/public/es2panda_lib.cpp index 22757da1054..cbc46ea28ab 100644 --- a/ets2panda/public/es2panda_lib.cpp +++ b/ets2panda/public/es2panda_lib.cpp @@ -915,18 +915,20 @@ extern "C" const es2panda_DiagnosticKind *CreateDiagnosticKind(es2panda_Context } extern "C" es2panda_DiagnosticInfo *CreateDiagnosticInfo(es2panda_Context *context, const es2panda_DiagnosticKind *kind, - const char **args, size_t argc) + const char **args, size_t argc, es2panda_SourcePosition *pos) { auto *allocator = reinterpret_cast(context)->allocator; auto diagnosticInfo = allocator->New(); diagnosticInfo->kind = kind; diagnosticInfo->args = args; diagnosticInfo->argc = argc; + diagnosticInfo->pos = pos; return diagnosticInfo; } extern "C" es2panda_SuggestionInfo *CreateSuggestionInfo(es2panda_Context *context, const es2panda_DiagnosticKind *kind, - const char **args, size_t argc, const char *substitutionCode) + const char **args, size_t argc, const char *substitutionCode, + es2panda_SourceRange *range) { auto *allocator = reinterpret_cast(context)->allocator; auto suggestionInfo = allocator->New(); @@ -934,11 +936,12 @@ extern "C" es2panda_SuggestionInfo *CreateSuggestionInfo(es2panda_Context *conte suggestionInfo->args = args; suggestionInfo->argc = argc; suggestionInfo->substitutionCode = substitutionCode; + suggestionInfo->range = range; return suggestionInfo; } extern "C" void LogDiagnosticWithSuggestion(es2panda_Context *context, const es2panda_DiagnosticInfo *diagnosticInfo, - const es2panda_SuggestionInfo *suggestionInfo, es2panda_SourceRange *range) + const es2panda_SuggestionInfo *suggestionInfo) { auto ctx = reinterpret_cast(context); auto diagnostickind = reinterpret_cast(diagnosticInfo->kind); @@ -954,9 +957,8 @@ extern "C" void LogDiagnosticWithSuggestion(es2panda_Context *context, const es2 suggestionParams.push_back(suggestionInfo->args[i]); } - auto *allocator = reinterpret_cast(context)->allocator; - auto E2pRange = reinterpret_cast(range); - auto posE2p = allocator->New(E2pRange->start); + auto E2pRange = reinterpret_cast(suggestionInfo->range); + auto posE2p = reinterpret_cast(diagnosticInfo->pos); auto suggestion = ctx->diagnosticEngine->CreateSuggestion(suggestionkind, suggestionParams, suggestionInfo->substitutionCode, E2pRange); ctx->diagnosticEngine->LogDiagnostic(*diagnostickind, diagnosticParams, *posE2p, suggestion); diff --git a/ets2panda/public/es2panda_lib.h b/ets2panda/public/es2panda_lib.h index cb861ee1db2..08179bdb0ca 100644 --- a/ets2panda/public/es2panda_lib.h +++ b/ets2panda/public/es2panda_lib.h @@ -158,12 +158,14 @@ typedef struct es2panda_SuggestionInfo { const char **args; size_t argc; const char *substitutionCode; + es2panda_SourceRange *range; } es2panda_SuggestionInfo; typedef struct es2panda_DiagnosticInfo { const es2panda_DiagnosticKind *kind; const char **args; size_t argc; + es2panda_SourcePosition *pos; } es2panda_DiagnosticInfo; enum es2panda_PluginDiagnosticType { ES2PANDA_PLUGIN_WARNING, ES2PANDA_PLUGIN_ERROR, ES2PANDA_PLUGIN_SUGGESTION }; @@ -239,11 +241,12 @@ struct CAPI_EXPORT es2panda_Impl { const es2panda_DiagnosticKind *(*CreateDiagnosticKind)(es2panda_Context *context, const char *dmessage, es2panda_PluginDiagnosticType etype); es2panda_DiagnosticInfo *(*CreateDiagnosticInfo)(es2panda_Context *context, const es2panda_DiagnosticKind *kind, - const char **args, size_t argc); + const char **args, size_t argc, es2panda_SourcePosition *position); es2panda_SuggestionInfo *(*CreateSuggestionInfo)(es2panda_Context *context, const es2panda_DiagnosticKind *kind, - const char **args, size_t argc, const char *substitutionCode); + const char **args, size_t argc, const char *substitutionCode, + es2panda_SourceRange *range); void (*LogDiagnosticWithSuggestion)(es2panda_Context *context, const es2panda_DiagnosticInfo *diagnosticInfo, - const es2panda_SuggestionInfo *suggestionInfo, es2panda_SourceRange *range); + const es2panda_SuggestionInfo *suggestionInfo); void (*LogDiagnostic)(es2panda_Context *context, const es2panda_DiagnosticKind *kind, const char **args, size_t argc, es2panda_SourcePosition *pos); const es2panda_DiagnosticStorage *(*GetSemanticErrors)(es2panda_Context *context); diff --git a/ets2panda/public/es2panda_lib.idl.erb b/ets2panda/public/es2panda_lib.idl.erb index dcff86fb9eb..62e1c0cef05 100644 --- a/ets2panda/public/es2panda_lib.idl.erb +++ b/ets2panda/public/es2panda_lib.idl.erb @@ -131,12 +131,14 @@ interface es2panda_SuggestionInfo { attribute sequence args; attribute u32 argc; attribute String substitutionCode; + attribute es2panda_SourceRange range; }; interface es2panda_DiagnosticInfo { attribute es2panda_DiagnosticKind kind; attribute sequence args; attribute u32 argc; + attribute es2panda_SourcePosition pos; }; dictionary es2panda_PluginDiagnosticType { @@ -200,11 +202,11 @@ interface es2panda_Impl { es2panda_SourcePosition SourceRangeStart(es2panda_Context context, es2panda_SourceRange range); es2panda_SourcePosition SourceRangeEnd(es2panda_Context context, es2panda_SourceRange range); es2panda_DiagnosticInfo CreateDiagnosticInfo(es2panda_Context context, es2panda_DiagnosticKind kind, - sequence args, u32 argc); + sequence args, u32 argc, es2panda_SourcePosition position); es2panda_SuggestionInfo CreateDiagnosticInfo(es2panda_Context context, es2panda_DiagnosticKind kind, - sequence args, u32 argc, String substitutionCode); + sequence args, u32 argc, String substitutionCode, es2panda_SourceRange range); void LogDiagnosticWithSuggestion(es2panda_Context context, es2panda_DiagnosticInfo diagnosticInfo, - es2panda_SuggestionInfo suggestionInfo, es2panda_SourceRange range); + es2panda_SuggestionInfo suggestionInfo); void LogTypeError(es2panda_Context context, String errorMsg, es2panda_SourcePosition pos); void LogWarning(es2panda_Context context, String warnMsg, es2panda_SourcePosition pos); void LogSyntaxError(es2panda_Context context, String errorMsg, es2panda_SourcePosition pos); diff --git a/ets2panda/test/unit/lsp/code_fix/ui_plugin_suggest.cpp b/ets2panda/test/unit/lsp/code_fix/ui_plugin_suggest.cpp index e880bebb1db..c049aa00f9b 100644 --- a/ets2panda/test/unit/lsp/code_fix/ui_plugin_suggest.cpp +++ b/ets2panda/test/unit/lsp/code_fix/ui_plugin_suggest.cpp @@ -68,13 +68,13 @@ TEST_F(LspUISuggestionTests, UIPluginsErrorTest1) const size_t line2 = 0; const int code = 4000; auto suggestionkind = initializer.CreateDiagnosticKind(ctx, dmessage1, ES2PANDA_PLUGIN_SUGGESTION); - auto suggestionInfo = initializer.CreateSuggestionInfo(ctx, suggestionkind, params, argc1, substitutionCode); auto diagnostikind = initializer.CreateDiagnosticKind(ctx, dmessage2, ES2PANDA_PLUGIN_ERROR); - auto diagnosticInfo = initializer.CreateDiagnosticInfo(ctx, diagnostikind, nullptr, argc0); es2panda_SourcePosition *left = initializer.CreateSourcePosition(ctx, index1, line1); es2panda_SourcePosition *right = initializer.CreateSourcePosition(ctx, index2, line2); es2panda_SourceRange *range = initializer.CreateSourceRange(ctx, left, right); - initializer.LogDiagnosticWithSuggestion(ctx, diagnosticInfo, suggestionInfo, range); + auto suggestionInfo = initializer.CreateSuggestionInfo(ctx, suggestionkind, params, argc1, substitutionCode, range); + auto diagnosticInfo = initializer.CreateDiagnosticInfo(ctx, diagnostikind, nullptr, argc0, left); + initializer.LogDiagnosticWithSuggestion(ctx, diagnosticInfo, suggestionInfo); auto suggest = lspApi->getSyntacticDiagnostics(ctx); AssertDiagnosticContainsCodeAndMessage(suggest, code, dmessage2); auto result = ark::es2panda::lsp::UIPluginSuggest::GetUIPluginCodeFixes(ctx, offset, false); @@ -131,8 +131,7 @@ TEST_F(LspUISuggestionTests, UIPluginsErrorTest3) Initializer initializer = Initializer(); std::vector files = {"ui_error3.ets"}; std::vector texts = {R"delimiter(function main() {})delimiter"}; - auto filePaths = CreateTempFile(files, texts); - auto ctx = initializer.CreateContext(filePaths[0].c_str(), ES2PANDA_STATE_CHECKED); + auto ctx = initializer.CreateContext(CreateTempFile(files, texts)[0].c_str(), ES2PANDA_STATE_CHECKED); LSPAPI const *lspApi = GetImpl(); const char *dmessage1 = "origin a"; const char *substitutionCode = "replace b"; @@ -144,23 +143,25 @@ TEST_F(LspUISuggestionTests, UIPluginsErrorTest3) const size_t line2 = 0; const int code = 4000; auto suggestionkind = initializer.CreateDiagnosticKind(ctx, dmessage1, ES2PANDA_PLUGIN_SUGGESTION); - auto suggestionInfo = initializer.CreateSuggestionInfo(ctx, suggestionkind, nullptr, argc0, substitutionCode); auto diagnostikind = initializer.CreateDiagnosticKind(ctx, dmessage2, ES2PANDA_PLUGIN_ERROR); - auto diagnosticInfo = initializer.CreateDiagnosticInfo(ctx, diagnostikind, nullptr, argc0); es2panda_SourcePosition *left = initializer.CreateSourcePosition(ctx, index1, line1); es2panda_SourcePosition *right = initializer.CreateSourcePosition(ctx, index2, line2); es2panda_SourceRange *range = initializer.CreateSourceRange(ctx, left, right); - initializer.LogDiagnosticWithSuggestion(ctx, diagnosticInfo, suggestionInfo, range); + auto suggestionInfo = + initializer.CreateSuggestionInfo(ctx, suggestionkind, nullptr, argc0, substitutionCode, range); + auto diagnosticInfo = initializer.CreateDiagnosticInfo(ctx, diagnostikind, nullptr, argc0, left); + initializer.LogDiagnosticWithSuggestion(ctx, diagnosticInfo, suggestionInfo); const char *substitutionCode2 = "replace c"; auto suggestionkind2 = initializer.CreateDiagnosticKind(ctx, dmessage1, ES2PANDA_PLUGIN_SUGGESTION); - auto suggestionInfo2 = initializer.CreateSuggestionInfo(ctx, suggestionkind2, nullptr, argc0, substitutionCode2); auto diagnostikind2 = initializer.CreateDiagnosticKind(ctx, dmessage2, ES2PANDA_PLUGIN_ERROR); - auto diagnosticInfo2 = initializer.CreateDiagnosticInfo(ctx, diagnostikind2, nullptr, argc0); es2panda_SourcePosition *left2 = initializer.CreateSourcePosition(ctx, index1, line1); es2panda_SourcePosition *right2 = initializer.CreateSourcePosition(ctx, index2, line2); es2panda_SourceRange *range2 = initializer.CreateSourceRange(ctx, left2, right2); - initializer.LogDiagnosticWithSuggestion(ctx, diagnosticInfo2, suggestionInfo2, range2); + auto suggestionInfo2 = + initializer.CreateSuggestionInfo(ctx, suggestionkind2, nullptr, argc0, substitutionCode2, range2); + auto diagnosticInfo2 = initializer.CreateDiagnosticInfo(ctx, diagnostikind2, nullptr, argc0, left2); + initializer.LogDiagnosticWithSuggestion(ctx, diagnosticInfo2, suggestionInfo2); auto suggest = lspApi->getSyntacticDiagnostics(ctx); AssertDiagnosticContainsCodeAndMessage(suggest, code, dmessage2); diff --git a/ets2panda/test/unit/plugin/plugin_proceed_to_state_log_diagnostic_with_suggestion.cpp b/ets2panda/test/unit/plugin/plugin_proceed_to_state_log_diagnostic_with_suggestion.cpp index 246373f2dfe..a281b97c67a 100644 --- a/ets2panda/test/unit/plugin/plugin_proceed_to_state_log_diagnostic_with_suggestion.cpp +++ b/ets2panda/test/unit/plugin/plugin_proceed_to_state_log_diagnostic_with_suggestion.cpp @@ -53,15 +53,15 @@ int main(int argc, char **argv) const char *params[] = { "a", }; - auto suggestionInfo = g_impl->CreateSuggestionInfo(g_ctx, suggestionkind, params, 1, "replace b"); auto diagnostikind = g_impl->CreateDiagnosticKind(g_ctx, "error", ES2PANDA_PLUGIN_ERROR); - auto diagnosticInfo = g_impl->CreateDiagnosticInfo(g_ctx, diagnostikind, nullptr, 0); es2panda_SourcePosition *left = g_impl->CreateSourcePosition(g_ctx, 0, 0); es2panda_SourcePosition *right = g_impl->CreateSourcePosition(g_ctx, 7, 0); es2panda_SourceRange *range = g_impl->CreateSourceRange(g_ctx, left, right); - g_impl->LogDiagnosticWithSuggestion(g_ctx, diagnosticInfo, suggestionInfo, range); + auto suggestionInfo = g_impl->CreateSuggestionInfo(g_ctx, suggestionkind, params, 1, "replace b", range); + auto diagnosticInfo = g_impl->CreateDiagnosticInfo(g_ctx, diagnostikind, nullptr, 0, left); + g_impl->LogDiagnosticWithSuggestion(g_ctx, diagnosticInfo, suggestionInfo); auto errors = g_impl->GetPluginErrors(g_ctx); auto diagnosticStorage = reinterpret_cast(errors); -- Gitee