diff --git a/ets2panda/bindings/test/expected/getCodeFixesAtPosition.json b/ets2panda/bindings/test/expected/getCodeFixesAtPosition.json index 24c432fbfca3cfd9de77d8e8451b6af27c19ed96..abf60a0510ca79043cae08d531616b631125f128 100644 --- a/ets2panda/bindings/test/expected/getCodeFixesAtPosition.json +++ b/ets2panda/bindings/test/expected/getCodeFixesAtPosition.json @@ -13,7 +13,15 @@ "newText": "" } ] - }, + } + ], + "description": "Fix Description", + "fixName": "Fix", + "fixId_": "UI_PLUGIN_SUGGEST", + "fixAllDescription_": "Fix All Description" + }, + { + "changes": [ { "fileName": "getCodeFixesAtPosition1.ets", "textChanges": [] diff --git a/ets2panda/lsp/include/internal_api.h b/ets2panda/lsp/include/internal_api.h index e52b422cc87bf62f3793a741a10e806750af16d7..84eebcc952f3b6e61317ca5393a11e921d0e2e7c 100644 --- a/ets2panda/lsp/include/internal_api.h +++ b/ets2panda/lsp/include/internal_api.h @@ -60,9 +60,9 @@ public: es2panda_SuggestionInfo *CreateSuggestionInfo(es2panda_Context *context, const es2panda_DiagnosticKind *kind, const char **args, size_t argc, const char *substitutionCode, - es2panda_SourceRange *range) + const char *title, es2panda_SourceRange *range) { - return impl_->CreateSuggestionInfo(context, kind, args, argc, substitutionCode, range); + return impl_->CreateSuggestionInfo(context, kind, args, argc, substitutionCode, title, range); } es2panda_DiagnosticInfo *CreateDiagnosticInfo(es2panda_Context *context, const es2panda_DiagnosticKind *kind, diff --git a/ets2panda/lsp/include/register_code_fix/ui_plugin_suggest.h b/ets2panda/lsp/include/register_code_fix/ui_plugin_suggest.h index 31ebf572bb7c9c9d18933a8f0926435567fedfa0..7cfdb4b76e1eb682ff590f251ab5bc62af16bae4 100644 --- a/ets2panda/lsp/include/register_code_fix/ui_plugin_suggest.h +++ b/ets2panda/lsp/include/register_code_fix/ui_plugin_suggest.h @@ -28,7 +28,8 @@ class UIPluginSuggest : public CodeFixRegistration { public: UIPluginSuggest(); - static std::vector GetUIPluginCodeFixes(es2panda_Context *context, size_t pos, bool isAll); + static std::tuple, std::vector> GetUIPluginCodeFixes( + es2panda_Context *context, size_t pos, bool isAll); std::vector GetCodeActions(const CodeFixContext &context) override; diff --git a/ets2panda/lsp/src/register_code_fix/ui_plugin_suggest.cpp b/ets2panda/lsp/src/register_code_fix/ui_plugin_suggest.cpp index ecfecd3991a3e6d7b35bb0d5566d82a04c05d3cd..f17f91e05411a283c56aa2f34fd0d7a6a0cfb3ec 100644 --- a/ets2panda/lsp/src/register_code_fix/ui_plugin_suggest.cpp +++ b/ets2panda/lsp/src/register_code_fix/ui_plugin_suggest.cpp @@ -21,12 +21,30 @@ namespace ark::es2panda::lsp { const int G_UI_PLUGIN_SUGGEST_CODE = 4000; // change this to the error code you want to handle +constexpr const char* G_UI_PLUGIN_SUGGEST_ID = "UIPluginSuggest"; UIPluginSuggest::UIPluginSuggest() { - const char *uiPluginSuggestId = "UIPluginSuggest"; SetErrorCodes({G_UI_PLUGIN_SUGGEST_CODE}); - SetFixIds({uiPluginSuggestId}); + SetFixIds({G_UI_PLUGIN_SUGGEST_ID}); +} + +CodeFixAction CreateCodeFixAction(const ark::es2panda::util::Diagnostic *diag, std::vector &changes) +{ + CodeFixAction codeAction; + codeAction.fixName = "Fix"; + codeAction.description = + diag->HasSuggestions() && !diag->Suggestion().empty() + ? !diag->Suggestion().at(0)->Title().empty() ? diag->Suggestion().at(0)->Title() : "Fix Description" + : "Fix Description"; + codeAction.changes = std::move(changes); + codeAction.fixId = "UI_PLUGIN_SUGGEST"; + codeAction.fixAllDescription = "Fix All Description"; + InstallPackageAction codeActionCommand; + codeActionCommand.file = diag->File(); + codeActionCommand.packageName = ""; + codeAction.commands.push_back(codeActionCommand); + return codeAction; } std::vector GetTextChangesFromSuggestions(const ark::es2panda::util::Diagnostic *diag, size_t pos, @@ -58,61 +76,49 @@ std::vector GetTextChangesFromSuggestions(const ark::es2panda::util: return textChanges; } -std::vector GetUIPluginCodeFixesByDiagType(es2panda_Context *context, size_t pos, - util::DiagnosticType type, bool isAll) +std::vector GetUIPluginCodeFixesByDiagType(es2panda_Context *context, size_t pos, bool isAll, + std::vector &actions, + util::DiagnosticType type) { auto ctx = reinterpret_cast(context); - auto filename = ctx->sourceFileName; - std::vector res; const auto &diagnostics = ctx->diagnosticEngine->GetDiagnosticStorage(type); - auto diagnosticStorage = reinterpret_cast(&diagnostics); - // NOLINTNEXTLINE(modernize-loop-convert,-warnings-as-errors) - for (size_t i = 0; i < diagnosticStorage->size(); ++i) { - auto diag = reinterpret_cast(&(*(*diagnosticStorage)[i])); + std::vector changes; + for (const auto &diagnostic : diagnostics) { + std::vector fileChanges; + auto diag = reinterpret_cast(&(*diagnostic)); auto textChanges = GetTextChangesFromSuggestions(diag, pos, isAll, context); - FileTextChanges fileTextChanges(filename, textChanges); - res.emplace_back(fileTextChanges); + FileTextChanges fileTextChanges(ctx->sourceFileName, textChanges); + fileChanges.emplace_back(fileTextChanges); + changes.emplace_back(fileTextChanges); + actions.push_back(CreateCodeFixAction(diag, fileChanges)); } - return res; + return changes; } -std::vector UIPluginSuggest::GetUIPluginCodeFixes(es2panda_Context *context, size_t pos, bool isAll) +auto UIPluginSuggest::GetUIPluginCodeFixes(es2panda_Context *context, size_t pos, bool isAll) + -> std::tuple, std::vector> { - if (context == nullptr) { - return {}; + std::vector types = {util::DiagnosticType::PLUGIN_ERROR, + util::DiagnosticType::PLUGIN_WARNING}; + std::vector changes; + std::vector returnedActions; + for (const auto &type : types) { + auto typeChanges = GetUIPluginCodeFixesByDiagType(context, pos, isAll, returnedActions, type); + changes.insert(changes.end(), typeChanges.begin(), typeChanges.end()); } - std::vector res; - auto errorFixes = GetUIPluginCodeFixesByDiagType(context, pos, util::DiagnosticType::PLUGIN_ERROR, isAll); - res.insert(res.end(), errorFixes.begin(), errorFixes.end()); - auto warningFixes = GetUIPluginCodeFixesByDiagType(context, pos, util::DiagnosticType::PLUGIN_WARNING, isAll); - res.insert(res.end(), warningFixes.begin(), warningFixes.end()); - return res; + return std::make_tuple(returnedActions, changes); } std::vector UIPluginSuggest::GetCodeActions(const CodeFixContext &context) { - std::vector returnedActions; - auto changes = GetUIPluginCodeFixes(context.context, context.span.start, false); - if (!changes.empty()) { - CodeFixAction codeAction; - codeAction.fixName = "Fix"; - codeAction.description = "Fix Description"; - codeAction.changes = changes; - codeAction.fixId = "UI_PLUGIN_SUGGEST"; - codeAction.fixAllDescription = "Fix All Description"; - InstallPackageAction codeActionCommand; - codeActionCommand.file = reinterpret_cast(context.context)->sourceFileName; - codeActionCommand.packageName = ""; - codeAction.commands.push_back(codeActionCommand); - returnedActions.push_back(codeAction); - } + auto [returnedActions, _] = GetUIPluginCodeFixes(context.context, context.span.start, false); return returnedActions; } CombinedCodeActions UIPluginSuggest::GetAllCodeActions(const CodeFixAllContext &codeFixAll) { CombinedCodeActions combinedCodeActions; - auto changes = GetUIPluginCodeFixes(codeFixAll.context, 0, true); + auto [_, changes] = GetUIPluginCodeFixes(codeFixAll.context, 0, true); combinedCodeActions.changes = changes; InstallPackageAction codeActionCommand; codeActionCommand.file = reinterpret_cast(codeFixAll.context)->sourceFileName; @@ -122,5 +128,5 @@ CombinedCodeActions UIPluginSuggest::GetAllCodeActions(const CodeFixAllContext & return combinedCodeActions; } // NOLINTNEXTLINE(fuchsia-statically-constructed-objects, cert-err58-cpp) -AutoCodeFixRegister g_uiPluginSuggest("UIPluginSuggest"); +AutoCodeFixRegister g_uiPluginSuggest(G_UI_PLUGIN_SUGGEST_ID); } // namespace ark::es2panda::lsp diff --git a/ets2panda/public/es2panda_lib.cpp b/ets2panda/public/es2panda_lib.cpp index f9295c138b39925fae9abee5f58d562e4e0266a8..70d24b28653d95d3ecd18576945ab0385626617d 100644 --- a/ets2panda/public/es2panda_lib.cpp +++ b/ets2panda/public/es2panda_lib.cpp @@ -926,7 +926,7 @@ extern "C" es2panda_DiagnosticInfo *CreateDiagnosticInfo(es2panda_Context *conte extern "C" es2panda_SuggestionInfo *CreateSuggestionInfo(es2panda_Context *context, const es2panda_DiagnosticKind *kind, const char **args, size_t argc, const char *substitutionCode, - es2panda_SourceRange *range) + const char *title, es2panda_SourceRange *range) { auto *allocator = reinterpret_cast(context)->allocator; auto suggestionInfo = allocator->New(); @@ -934,6 +934,7 @@ extern "C" es2panda_SuggestionInfo *CreateSuggestionInfo(es2panda_Context *conte suggestionInfo->args = args; suggestionInfo->argc = argc; suggestionInfo->substitutionCode = substitutionCode; + suggestionInfo->title = title; suggestionInfo->range = range; return suggestionInfo; } @@ -957,8 +958,8 @@ extern "C" void LogDiagnosticWithSuggestion(es2panda_Context *context, const es2 auto E2pRange = reinterpret_cast(suggestionInfo->range); auto posE2p = reinterpret_cast(diagnosticInfo->pos); - auto suggestion = ctx->diagnosticEngine->CreateSuggestion(suggestionkind, suggestionParams, - suggestionInfo->substitutionCode, E2pRange); + auto suggestion = ctx->diagnosticEngine->CreateSuggestion( + suggestionkind, suggestionParams, suggestionInfo->substitutionCode, suggestionInfo->title, E2pRange); ctx->diagnosticEngine->LogDiagnostic(*diagnostickind, diagnosticParams, *posE2p, suggestion); } diff --git a/ets2panda/public/es2panda_lib.h b/ets2panda/public/es2panda_lib.h index 945578067875d79516a713f9166df6d4274a5089..a1562a4fd690c3c9a576037d2ff968a103a2f1f3 100644 --- a/ets2panda/public/es2panda_lib.h +++ b/ets2panda/public/es2panda_lib.h @@ -146,6 +146,7 @@ typedef struct es2panda_SuggestionInfo { const char **args; size_t argc; const char *substitutionCode; + const char *title; es2panda_SourceRange *range; } es2panda_SuggestionInfo; @@ -243,7 +244,7 @@ struct CAPI_EXPORT es2panda_Impl { 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, - es2panda_SourceRange *range); + const char *title, es2panda_SourceRange *range); void (*LogDiagnosticWithSuggestion)(es2panda_Context *context, const es2panda_DiagnosticInfo *diagnosticInfo, const es2panda_SuggestionInfo *suggestionInfo); void (*LogDiagnostic)(es2panda_Context *context, const es2panda_DiagnosticKind *kind, const char **args, diff --git a/ets2panda/public/es2panda_lib.idl.erb b/ets2panda/public/es2panda_lib.idl.erb index c52ea85899a6d4b5c5aebd2566bc44369e42243e..2bb478611f309ff537a23586756385d6f24b0365 100644 --- a/ets2panda/public/es2panda_lib.idl.erb +++ b/ets2panda/public/es2panda_lib.idl.erb @@ -131,6 +131,7 @@ interface es2panda_SuggestionInfo { attribute sequence args; attribute u32 argc; attribute String substitutionCode; + attribute String message; attribute es2panda_SourceRange range; }; @@ -205,8 +206,9 @@ interface es2panda_Impl { es2panda_SourcePosition SourceRangeEnd(es2panda_Context context, es2panda_SourceRange range); es2panda_DiagnosticInfo CreateDiagnosticInfo(es2panda_Context context, es2panda_DiagnosticKind kind, sequence args, u32 argc, es2panda_SourcePosition position); - es2panda_SuggestionInfo CreateDiagnosticInfo(es2panda_Context context, es2panda_DiagnosticKind kind, - sequence args, u32 argc, String substitutionCode, es2panda_SourceRange range); + es2panda_SuggestionInfo CreateSuggestionInfo(es2panda_Context context, es2panda_DiagnosticKind kind, + sequence args, u32 argc, String substitutionCode, + String message, es2panda_SourceRange range); void LogDiagnosticWithSuggestion(es2panda_Context context, es2panda_DiagnosticInfo diagnosticInfo, es2panda_SuggestionInfo suggestionInfo); void LogTypeError(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 f03f8e4ac5d5375ea5364cf24ffb4e5a8f83517b..94821614b18f5fbe56418f0734d74b47b9534493 100644 --- a/ets2panda/test/unit/lsp/code_fix/ui_plugin_suggest.cpp +++ b/ets2panda/test/unit/lsp/code_fix/ui_plugin_suggest.cpp @@ -17,11 +17,9 @@ #include -#include "ir/astNode.h" #include "lsp/include/register_code_fix/ui_plugin_suggest.h" #include "lsp/include/internal_api.h" #include "public/es2panda_lib.h" -#include "public/public.h" namespace { @@ -44,8 +42,6 @@ void AssertDiagnosticContainsCodeAndMessage(const DiagnosticReferences &suggest, TEST_F(LspUISuggestionTests, UIPluginsErrorTest1) { - using ark::es2panda::ir::AstNode; - using ark::es2panda::public_lib::Context; Initializer initializer = Initializer(); std::vector files = {"ui_error1.ets"}; std::vector texts = {R"delimiter(function main() {})delimiter"}; @@ -60,6 +56,7 @@ TEST_F(LspUISuggestionTests, UIPluginsErrorTest1) const char *dmessage1 = "origin {}"; const size_t argc1 = 1; const char *substitutionCode = "replace b"; + const char *title = "Title:"; const char *dmessage2 = "error"; const size_t argc0 = 0; const size_t index1 = 1; @@ -72,13 +69,14 @@ TEST_F(LspUISuggestionTests, UIPluginsErrorTest1) es2panda_SourcePosition *left = initializer.CreateSourcePosition(ctx, index1, line1); es2panda_SourcePosition *right = initializer.CreateSourcePosition(ctx, index2, line2); es2panda_SourceRange *range = initializer.CreateSourceRange(ctx, left, right); - auto suggestionInfo = initializer.CreateSuggestionInfo(ctx, suggestionkind, params, argc1, substitutionCode, range); + auto suggestionInfo = + initializer.CreateSuggestionInfo(ctx, suggestionkind, params, argc1, substitutionCode, title, 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); - ASSERT_EQ(result.at(0).textChanges.at(0).newText, substitutionCode); + auto [result, _] = ark::es2panda::lsp::UIPluginSuggest::GetUIPluginCodeFixes(ctx, offset, false); + ASSERT_EQ(result.at(0).changes.at(0).textChanges.at(0).newText, substitutionCode); std::vector codes; codes.emplace_back(code); CodeFixOptions emptyOptions; @@ -91,8 +89,6 @@ TEST_F(LspUISuggestionTests, UIPluginsErrorTest1) TEST_F(LspUISuggestionTests, UIPluginsErrorTest2) { - using ark::es2panda::ir::AstNode; - using ark::es2panda::public_lib::Context; Initializer initializer = Initializer(); std::vector files = {"ui_error2.ets"}; std::vector texts = {R"delimiter(function main() {})delimiter"}; @@ -126,15 +122,13 @@ TEST_F(LspUISuggestionTests, UIPluginsErrorTest2) TEST_F(LspUISuggestionTests, UIPluginsErrorTest3) { - using ark::es2panda::ir::AstNode; - using ark::es2panda::public_lib::Context; Initializer initializer = Initializer(); - std::vector files = {"ui_error3.ets"}; - std::vector texts = {R"delimiter(function main() {})delimiter"}; - auto ctx = initializer.CreateContext(CreateTempFile(files, texts)[0].c_str(), ES2PANDA_STATE_CHECKED); + auto ctx = + initializer.CreateContext("ui_error3.ets", ES2PANDA_STATE_CHECKED, R"delimiter(function main() {})delimiter"); LSPAPI const *lspApi = GetImpl(); const char *dmessage1 = "origin a"; const char *substitutionCode = "replace b"; + const char *title1 = "Title1:"; const char *dmessage2 = "error"; const size_t argc0 = 0; const size_t index1 = 0; @@ -148,18 +142,19 @@ TEST_F(LspUISuggestionTests, UIPluginsErrorTest3) es2panda_SourcePosition *right = initializer.CreateSourcePosition(ctx, index2, line2); es2panda_SourceRange *range = initializer.CreateSourceRange(ctx, left, right); auto suggestionInfo = - initializer.CreateSuggestionInfo(ctx, suggestionkind, nullptr, argc0, substitutionCode, range); + initializer.CreateSuggestionInfo(ctx, suggestionkind, nullptr, argc0, substitutionCode, title1, range); auto diagnosticInfo = initializer.CreateDiagnosticInfo(ctx, diagnostikind, nullptr, argc0, left); initializer.LogDiagnosticWithSuggestion(ctx, diagnosticInfo, suggestionInfo); const char *substitutionCode2 = "replace c"; + const char *title2 = "Title2:"; auto suggestionkind2 = initializer.CreateDiagnosticKind(ctx, dmessage1, ES2PANDA_PLUGIN_SUGGESTION); auto diagnostikind2 = initializer.CreateDiagnosticKind(ctx, dmessage2, ES2PANDA_PLUGIN_ERROR); es2panda_SourcePosition *left2 = initializer.CreateSourcePosition(ctx, index1, line1); es2panda_SourcePosition *right2 = initializer.CreateSourcePosition(ctx, index2, line2); es2panda_SourceRange *range2 = initializer.CreateSourceRange(ctx, left2, right2); auto suggestionInfo2 = - initializer.CreateSuggestionInfo(ctx, suggestionkind2, nullptr, argc0, substitutionCode2, range2); + initializer.CreateSuggestionInfo(ctx, suggestionkind2, nullptr, argc0, substitutionCode2, title2, range2); auto diagnosticInfo2 = initializer.CreateDiagnosticInfo(ctx, diagnostikind2, nullptr, argc0, left2); initializer.LogDiagnosticWithSuggestion(ctx, diagnosticInfo2, suggestionInfo2); @@ -181,8 +176,6 @@ TEST_F(LspUISuggestionTests, UIPluginsErrorTest3) TEST_F(LspUISuggestionTests, UIPluginsErrorTest4) { - using ark::es2panda::ir::AstNode; - using ark::es2panda::public_lib::Context; Initializer initializer = Initializer(); std::vector files = {"ui_error1.ets"}; std::vector texts = {R"delimiter(function main() { return 1 })delimiter"}; @@ -197,6 +190,7 @@ TEST_F(LspUISuggestionTests, UIPluginsErrorTest4) const char *dmessage1 = "origin {}"; const size_t argc1 = 1; const char *substitutionCode = "replace b"; + const char *title = "Title:"; const char *dmessage2 = "error"; const size_t argc0 = 0; const size_t index1 = 16; // suggestion left @@ -213,13 +207,14 @@ TEST_F(LspUISuggestionTests, UIPluginsErrorTest4) es2panda_SourcePosition *right = initializer.CreateSourcePosition(ctx, index2, line2); es2panda_SourcePosition *diagPos = initializer.CreateSourcePosition(ctx, index3, line3); es2panda_SourceRange *range = initializer.CreateSourceRange(ctx, left, right); - auto suggestionInfo = initializer.CreateSuggestionInfo(ctx, suggestionkind, params, argc1, substitutionCode, range); + auto suggestionInfo = + initializer.CreateSuggestionInfo(ctx, suggestionkind, params, argc1, substitutionCode, title, range); auto diagnosticInfo = initializer.CreateDiagnosticInfo(ctx, diagnostikind, nullptr, argc0, diagPos); initializer.LogDiagnosticWithSuggestion(ctx, diagnosticInfo, suggestionInfo); auto suggest = lspApi->getSyntacticDiagnostics(ctx); AssertDiagnosticContainsCodeAndMessage(suggest, code, dmessage2); - auto result = ark::es2panda::lsp::UIPluginSuggest::GetUIPluginCodeFixes(ctx, offset, false); - ASSERT_EQ(result.at(0).textChanges.at(0).newText, substitutionCode); + auto [result, _] = ark::es2panda::lsp::UIPluginSuggest::GetUIPluginCodeFixes(ctx, offset, false); + ASSERT_EQ(result.at(0).changes.at(0).textChanges.at(0).newText, substitutionCode); std::vector codes; codes.emplace_back(code); CodeFixOptions emptyOptions; 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 a281b97c67a4f26f59e77afaf60ddd2b0f48f9ae..6a43e6c6a23c67136e271d59f568f97fd9d5080d 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 @@ -59,7 +59,7 @@ int main(int argc, char **argv) es2panda_SourcePosition *right = g_impl->CreateSourcePosition(g_ctx, 7, 0); es2panda_SourceRange *range = g_impl->CreateSourceRange(g_ctx, left, right); - auto suggestionInfo = g_impl->CreateSuggestionInfo(g_ctx, suggestionkind, params, 1, "replace b", range); + auto suggestionInfo = g_impl->CreateSuggestionInfo(g_ctx, suggestionkind, params, 1, "replace b", "Title:", range); auto diagnosticInfo = g_impl->CreateDiagnosticInfo(g_ctx, diagnostikind, nullptr, 0, left); g_impl->LogDiagnosticWithSuggestion(g_ctx, diagnosticInfo, suggestionInfo); @@ -77,9 +77,9 @@ int main(int argc, char **argv) auto diagnostic = reinterpret_cast(&(*(*diagnosticStorage)[0])); auto suggestion = (diagnostic->Suggestion())[0]; if (strcmp(suggestion->SubstitutionCode().data(), "replace b") != 0 || - strcmp(suggestion->Message().data(), "origin a") != 0 || suggestion->SourceRange()->start.line != startLine || - suggestion->SourceRange()->end.line != endLine || suggestion->SourceRange()->start.index != startIndex || - suggestion->SourceRange()->end.index != endIndex) { + strcmp(suggestion->Title().data(), "Title:") != 0 || strcmp(suggestion->Message().data(), "origin a") != 0 || + suggestion->SourceRange()->start.line != startLine || suggestion->SourceRange()->end.line != endLine || + suggestion->SourceRange()->start.index != startIndex || suggestion->SourceRange()->end.index != endIndex) { return TEST_ERROR_CODE; } diff --git a/ets2panda/util/diagnostic.cpp b/ets2panda/util/diagnostic.cpp index 4ca94c5c81dfbf2c42beff1ea36be3794247ed42..1f3f8e079072085e18157f76b227b7c711db97f1 100644 --- a/ets2panda/util/diagnostic.cpp +++ b/ets2panda/util/diagnostic.cpp @@ -227,8 +227,12 @@ ThrowableDiagnostic::ThrowableDiagnostic(const DiagnosticType type, const diagno } Suggestion::Suggestion(const diagnostic::DiagnosticKind *kind, std::vector ¶ms, - const char *substitutionCode, const lexer::SourceRange *range) - : kind_(kind), substitutionCode_(substitutionCode), message_(Format(kind->Message(), params)), range_(range) + const char *substitutionCode, const char *title, const lexer::SourceRange *range) + : kind_(kind), + substitutionCode_(substitutionCode), + title_(title), + message_(Format(kind->Message(), params)), + range_(range) { } diff --git a/ets2panda/util/diagnostic.h b/ets2panda/util/diagnostic.h index 3c82dc536ab2faccd4a5359c1f2c7db4387a9764..fafbd060751628dfc277531c464eee7ea21cbd46 100644 --- a/ets2panda/util/diagnostic.h +++ b/ets2panda/util/diagnostic.h @@ -180,7 +180,7 @@ private: class Suggestion : public DiagnosticBase { public: explicit Suggestion(const diagnostic::DiagnosticKind *kind, std::vector ¶ms, - const char *substitutionCode, const lexer::SourceRange *range); + const char *substitutionCode, const char *title, const lexer::SourceRange *range); const lexer::SourceRange *SourceRange() const { @@ -192,6 +192,11 @@ public: return substitutionCode_; } + std::string Title() const + { + return title_; + } + std::string Message() const override { return message_; @@ -204,6 +209,7 @@ public: private: const diagnostic::DiagnosticKind *kind_; const std::string substitutionCode_; + const std::string title_; const std::string message_; const lexer::SourceRange *range_; };