diff --git a/ets2panda/lsp/src/internal_api.cpp b/ets2panda/lsp/src/internal_api.cpp index 8d5460b2c4da430af9d147c8ebdb4af9b48922fc..c6aca73739270820fedc82e835d69337932a980f 100644 --- a/ets2panda/lsp/src/internal_api.cpp +++ b/ets2panda/lsp/src/internal_api.cpp @@ -118,27 +118,31 @@ std::string FormatStringFromArgs(const std::string &textStr, return ss.str(); } -FileDiagnostic CreateFileDiagnostic(es2panda_AstNode *node, lexer::SourceRange span, Diagnostic diagnostic, +FileDiagnostic CreateFileDiagnostic(es2panda_AstNode *node, Range span, Diagnostic diagnostic, const std::vector &args = std::vector()) { if (!args.empty()) { std::string newMessageStr = FormatStringFromArgs(diagnostic.message_, args); diagnostic.message_ = newMessageStr; } - FileDiagnostic fileDiagnostic(node, diagnostic, TransSourcePositionToPosition(span.start), - TransSourcePositionToPosition(span.end)); + FileDiagnostic fileDiagnostic(node, diagnostic, span.start, span.end); return fileDiagnostic; } -lexer::SourceRange GetErrorRangeForNode(ir::AstNode *node) +Range GetErrorRangeForNode(ir::AstNode *node) { - return lexer::SourceRange(node->Start(), node->End()); + auto start = Position(node->Start().line + 1, node->Start().index + 1); + auto end = Position(node->End().line + 1, node->End().index + 1); + return Range(start, end); } FileDiagnostic CreateDiagnosticForNode(es2panda_AstNode *node, Diagnostic diagnostic, const std::vector &args) { - auto span = GetErrorRangeForNode(reinterpret_cast(node)); + auto span = diagnostic.range_; + if (span.start.character_ == 0 || span.end.character_ == 0 || span.start.line_ == 0 || span.end.line_ == 0) { + span = GetErrorRangeForNode(reinterpret_cast(node)); + } auto res = CreateFileDiagnostic(node, span, std::move(diagnostic), args); return res; } diff --git a/ets2panda/lsp/src/suggestion_diagnostics.cpp b/ets2panda/lsp/src/suggestion_diagnostics.cpp index ae94deae2ec25755f8b6ded790026c46a1549fa3..1359d6e2a4294c4bb2d2d88dca1484dbe4a2043d 100644 --- a/ets2panda/lsp/src/suggestion_diagnostics.cpp +++ b/ets2panda/lsp/src/suggestion_diagnostics.cpp @@ -44,8 +44,11 @@ void Check(ir::AstNode *node, std::vector &diag, std::unordered_ AddConvertToAsyncFunctionDiagnostics(node, diag, visitedFunc); } - node->FindChild([&diag, &visitedFunc](ir::AstNode *childNode) { - Check(childNode, diag, visitedFunc); + node->FindChild([&diag, &visitedFunc, &node](ir::AstNode *childNode) { + // It should only Check direct child node istead of all child and grandchild node, according to tsc + if (childNode->Parent() == node) { + Check(childNode, diag, visitedFunc); + } return false; }); } @@ -63,8 +66,8 @@ void AddConvertToAsyncFunctionDiagnostics(ir::AstNode *node, std::vector &visitedFunc) { if (IsConvertibleFunction(node, visitedFunc) && (visitedFunc.count(GetKeyFromNode(node)) == 0)) { - Position posStart(node->Range().start.line, node->Range().start.index); - Position posEnd(node->Range().end.line, node->Range().end.index); + Position posStart(node->Range().start.line + 1, node->Range().start.index + 1); + Position posEnd(node->Range().end.line + 1, node->Range().end.index + 1); Range range(posStart, posEnd); const std::string message = "This_may_be_converted_to_an_async_function"; Diagnostic diagnostic(range, {}, {}, DiagnosticSeverity::Hint, 0, message, {}, {}, {}); diff --git a/ets2panda/test/unit/lsp/suggestion_diagnostics_test.cpp b/ets2panda/test/unit/lsp/suggestion_diagnostics_test.cpp index 64ab05a210706776b656d0bf2aa9fef7db1ef866..ff311bf817b16523361c4432ed12da704fcbd747 100644 --- a/ets2panda/test/unit/lsp/suggestion_diagnostics_test.cpp +++ b/ets2panda/test/unit/lsp/suggestion_diagnostics_test.cpp @@ -137,10 +137,10 @@ TEST_F(LspSuggestionTests, GetSuggestionDiagnostics) auto diag = ark::es2panda::lsp::GetSuggestionDiagnosticsImpl(ast); const auto message = "This_may_be_converted_to_an_async_function"; auto severity = DiagnosticSeverity::Hint; - int const startLine = 0; - int const endLine = 2; - int const startChar = 9; - int const endChar = 52; + int const startLine = 1; + int const endLine = 3; + int const startChar = 1; + int const endChar = 53; ASSERT_EQ(diag.at(0).diagnostic.range_.start.line_, startLine); ASSERT_EQ(diag.at(0).diagnostic.range_.end.line_, endLine); ASSERT_EQ(diag.at(0).diagnostic.range_.start.character_, startChar); @@ -162,10 +162,10 @@ TEST_F(LspSuggestionTests, GetSuggestionDiagnostics2) initializer.DestroyContext(ctx); const auto msg = "This_may_be_converted_to_an_async_function"; auto severity = DiagnosticSeverity::Hint; - int const startLine = 0; - int const endLine = 2; - int const startChar = 9; - int const endChar = 52; + int const startLine = 1; + int const endLine = 3; + int const startChar = 1; + int const endChar = 53; ASSERT_EQ(diag.diagnostic.at(0).range_.start.line_, startLine); ASSERT_EQ(diag.diagnostic.at(0).range_.end.line_, endLine); ASSERT_EQ(diag.diagnostic.at(0).range_.start.character_, startChar); @@ -174,6 +174,39 @@ TEST_F(LspSuggestionTests, GetSuggestionDiagnostics2) ASSERT_EQ(diag.diagnostic.at(0).severity_, severity); } +TEST_F(LspSuggestionTests, GetSuggestionDiagnosticsFixCrash1) +{ + Initializer initializer = Initializer(); + std::vector files = {"GetSuggestionDiagnosticsFixCrash1.ets"}; + std::vector texts = {R"delimiter( +build() { + Column() { + ForEach( + (item: image.PixelMap, index?: number) => { + ListItem() { + Column() { + Text('image' + index) + } + .margin(15) + } + .width('100%') + } + ) + } +} +)delimiter"}; + auto filePaths = CreateTempFile(files, texts); + + int const expectedFileCount = 1; + ASSERT_EQ(filePaths.size(), expectedFileCount); + LSPAPI const *lspApi = GetImpl(); + auto ctx = initializer.CreateContext(filePaths[0].c_str(), ES2PANDA_STATE_CHECKED); + auto diag = lspApi->getSuggestionDiagnostics(ctx); + initializer.DestroyContext(ctx); + int const expectSize = 0; + ASSERT_EQ(diag.diagnostic.size(), expectSize); +} + TEST_F(LspSuggestionTests, isPromiseHandler) { const char *source =