已合并
fix(lsp): support modified multi-import completion #1276
fix(lsp): support modified multi-import completion #1276
已合并
Cangjie-Chenminglei创建于 9月8日
共 7 个文件变更+58-15
@@ -38,14 +38,16 @@ bool IsMultiImport(const std::vector<Cangjie::Token> &inputTokens)
38 if (inputTokens.empty()) {38 if (inputTokens.empty()) {
39 return false;39 return false;
40 }40 }
41- if (inputTokens.front().kind == Cangjie::TokenKind::IMPORT) {41+ bool hasImport = false;
42- auto preTokenKind = Cangjie::TokenKind::INIT;42+ auto preTokenKind = Cangjie::TokenKind::INIT;
43- for (auto &token : inputTokens) {43+ for (auto &token : inputTokens) {
44- if (token.kind == Cangjie::TokenKind::LCURL && preTokenKind == Cangjie::TokenKind::DOT) {44+ if (token.kind == Cangjie::TokenKind::IMPORT) {
45- return true;45+ hasImport = true;
46- }
47- preTokenKind = token.kind;
48 }46 }
47+ if (hasImport && token.kind == Cangjie::TokenKind::LCURL && preTokenKind == Cangjie::TokenKind::DOT) {
48+ return true;
49+ }
50+ preTokenKind = token.kind;
49 }51 }
50 return false;52 return false;
51}53}
@@ -55,7 +57,9 @@ std::string GetMultiImportPrefix(const std::vector<Cangjie::Token> &inputTokens)
55 std::string prefix;57 std::string prefix;
56 std::vector<std::string> items;58 std::vector<std::string> items;
57 for (size_t i = 0; inputTokens[i].kind != Cangjie::TokenKind::LCURL; ++i) {59 for (size_t i = 0; inputTokens[i].kind != Cangjie::TokenKind::LCURL; ++i) {
58- if (inputTokens[i].kind == Cangjie::TokenKind::IMPORT) {60+ if (inputTokens[i].kind == Cangjie::TokenKind::IMPORT ||
61+ Utils::In(inputTokens[i].kind, {Cangjie::TokenKind::PUBLIC, Cangjie::TokenKind::PRIVATE,
62+ Cangjie::TokenKind::PROTECTED, Cangjie::TokenKind::INTERNAL})) {
59 continue;63 continue;
60 }64 }
61 if (inputTokens[i].kind == Cangjie::TokenKind::IDENTIFIER) {65 if (inputTokens[i].kind == Cangjie::TokenKind::IDENTIFIER) {
@@ -956,14 +960,22 @@ bool CompletionImpl::IsPreambleComplete(const ArkAST &input,
956 const TokenKind firstTokenKind,960 const TokenKind firstTokenKind,
957 const int firstTokenIndexOnLine)961 const int firstTokenIndexOnLine)
958{962{
959- bool keywordFlag = firstTokenKind == TokenKind::IMPORT || firstTokenKind == TokenKind::PACKAGE;963+ if (firstTokenKind == TokenKind::PACKAGE) {
960- if (keywordFlag) {
961 return true;964 return true;
962 }965 }
963- if (firstTokenKind == TokenKind::PUBLIC &&966+ 
964- static_cast<unsigned int>(firstTokenIndexOnLine + 1) < input.tokens.size() &&967+ if (firstTokenIndexOnLine < 0 || static_cast<size_t>(firstTokenIndexOnLine) >= input.tokens.size()) {
965- input.tokens[firstTokenIndexOnLine + 1].kind == TokenKind::IMPORT) {968+ return false;
966- return true;969+ }
970+ const auto line = input.tokens[static_cast<size_t>(firstTokenIndexOnLine)].Begin().line;
971+ for (size_t index = static_cast<size_t>(firstTokenIndexOnLine); index < input.tokens.size(); ++index) {
972+ const auto &token = input.tokens[index];
973+ if (token.Begin().line != line) {
974+ break;
975+ }
976+ if (token.kind == TokenKind::IMPORT) {
977+ return true;
978+ }
967 }979 }
968 return false;980 return false;
969}981}
@@ -1 +1 @@
1-{"id":8,"jsonrpc":"2.0","result":[{"deprecated":false,"detail":"packageName","documentation":"","filterText":"argopt","insertText":"argopt","insertTextFormat":1,"kind":9,"label":"argopt","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"ast","insertText":"ast","insertTextFormat":1,"kind":9,"label":"ast","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"binary","insertText":"binary","insertTextFormat":1,"kind":9,"label":"binary","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"collection","insertText":"collection","insertTextFormat":1,"kind":9,"label":"collection","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"console","insertText":"console","insertTextFormat":1,"kind":9,"label":"console","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"convert","insertText":"convert","insertTextFormat":1,"kind":9,"label":"convert","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"core","insertText":"core","insertTextFormat":1,"kind":9,"label":"core","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"crypto","insertText":"crypto","insertTextFormat":1,"kind":9,"label":"crypto","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"database","insertText":"database","insertTextFormat":1,"kind":9,"label":"database","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"deriving","insertText":"deriving","insertTextFormat":1,"kind":9,"label":"deriving","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"env","insertText":"env","insertTextFormat":1,"kind":9,"label":"env","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"fs","insertText":"fs","insertTextFormat":1,"kind":9,"label":"fs","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"interop","insertText":"interop","insertTextFormat":1,"kind":9,"label":"interop","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"io","insertText":"io","insertTextFormat":1,"kind":9,"label":"io","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"math","insertText":"math","insertTextFormat":1,"kind":9,"label":"math","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"net","insertText":"net","insertTextFormat":1,"kind":9,"label":"net","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"objectpool","insertText":"objectpool","insertTextFormat":1,"kind":9,"label":"objectpool","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"overflow","insertText":"overflow","insertTextFormat":1,"kind":9,"label":"overflow","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"posix","insertText":"posix","insertTextFormat":1,"kind":9,"label":"posix","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"process","insertText":"process","insertTextFormat":1,"kind":9,"label":"process","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"random","insertText":"random","insertTextFormat":1,"kind":9,"label":"random","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"ref","insertText":"ref","insertTextFormat":1,"kind":9,"label":"ref","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"reflect","insertText":"reflect","insertTextFormat":1,"kind":9,"label":"reflect","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"regex","insertText":"regex","insertTextFormat":1,"kind":9,"label":"regex","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"runtime","insertText":"runtime","insertTextFormat":1,"kind":9,"label":"runtime","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"sort","insertText":"sort","insertTextFormat":1,"kind":9,"label":"sort","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"sync","insertText":"sync","insertTextFormat":1,"kind":9,"label":"sync","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"time","insertText":"time","insertTextFormat":1,"kind":9,"label":"time","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"unicode","insertText":"unicode","insertTextFormat":1,"kind":9,"label":"unicode","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"unittest","insertText":"unittest","insertTextFormat":1,"kind":9,"label":"unittest","sortText":""}]}1+{"id":8,"jsonrpc":"2.0","result":[{"deprecated":false,"detail":"packageName","documentation":"","filterText":"argopt","insertText":"argopt","insertTextFormat":1,"kind":9,"label":"argopt","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"ast","insertText":"ast","insertTextFormat":1,"kind":9,"label":"ast","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"binary","insertText":"binary","insertTextFormat":1,"kind":9,"label":"binary","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"collection","insertText":"collection","insertTextFormat":1,"kind":9,"label":"collection","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"console","insertText":"console","insertTextFormat":1,"kind":9,"label":"console","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"convert","insertText":"convert","insertTextFormat":1,"kind":9,"label":"convert","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"core","insertText":"core","insertTextFormat":1,"kind":9,"label":"core","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"crypto","insertText":"crypto","insertTextFormat":1,"kind":9,"label":"crypto","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"database","insertText":"database","insertTextFormat":1,"kind":9,"label":"database","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"deriving","insertText":"deriving","insertTextFormat":1,"kind":9,"label":"deriving","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"env","insertText":"env","insertTextFormat":1,"kind":9,"label":"env","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"fs","insertText":"fs","insertTextFormat":1,"kind":9,"label":"fs","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"interop","insertText":"interop","insertTextFormat":1,"kind":9,"label":"interop","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"io","insertText":"io","insertTextFormat":1,"kind":9,"label":"io","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"math","insertText":"math","insertTextFormat":1,"kind":9,"label":"math","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"net","insertText":"net","insertTextFormat":1,"kind":9,"label":"net","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"objectpool","insertText":"objectpool","insertTextFormat":1,"kind":9,"label":"objectpool","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"overflow","insertText":"overflow","insertTextFormat":1,"kind":9,"label":"overflow","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"posix","insertText":"posix","insertTextFormat":1,"kind":9,"label":"posix","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"process","insertText":"process","insertTextFormat":1,"kind":9,"label":"process","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"random","insertText":"random","insertTextFormat":1,"kind":9,"label":"random","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"ref","insertText":"ref","insertTextFormat":1,"kind":9,"label":"ref","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"reflect","insertText":"reflect","insertTextFormat":1,"kind":9,"label":"reflect","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"regex","insertText":"regex","insertTextFormat":1,"kind":9,"label":"regex","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"runtime","insertText":"runtime","insertTextFormat":1,"kind":9,"label":"runtime","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"sort","insertText":"sort","insertTextFormat":1,"kind":9,"label":"sort","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"sync","insertText":"sync","insertTextFormat":1,"kind":9,"label":"sync","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"time","insertText":"time","insertTextFormat":1,"kind":9,"label":"time","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"unicode","insertText":"unicode","insertTextFormat":1,"kind":9,"label":"unicode","sortText":""},{"deprecated":false,"detail":"packageName","documentation":"","filterText":"unittest","insertText":"unittest","insertTextFormat":1,"kind":9,"label":"unittest","sortText":""}]}
@@ -0,0 +1 @@
1+{"id":"9","jsonrpc":"2.0","result":[{"deprecated":false,"detail":"public func A1(): Unit","documentation":"","filterText":"A1","insertText":"A1","insertTextFormat":1,"kind":2,"label":"A1","sortText":""},{"deprecated":false,"detail":"public class classC","documentation":"","filterText":"classC","insertText":"classC","insertTextFormat":1,"kind":7,"label":"classC","sortText":""},{"deprecated":false,"detail":"public interface interfaceC","documentation":"","filterText":"interfaceC","insertText":"interfaceC","insertTextFormat":1,"kind":8,"label":"interfaceC","sortText":""},{"deprecated":false,"detail":"public var varC: Int64","documentation":"","filterText":"varC","insertText":"varC","insertTextFormat":1,"kind":6,"label":"varC","sortText":""}]}
@@ -0,0 +1,7 @@
1+{"caseFolder":"normalTest//ModifiedImportPkg", "id":"9"}
2+{"jsonrpc":"2.0","id":"0","method":"initialize","params":{"processId":null,"rootPath":"C:/Users/code_project/DevEcoStudioProjects/MyApplication3","rootUri":"file:///c%3A/Users/code_project/DevEcoStudioProjects/MyApplication3/","capabilities":{"workspace":{"applyEdit":true,"workspaceEdit":{},"didChangeWatchedFiles":{},"symbol":{},"executeCommand":{},"workspaceFolders":false,"configuration":false},"textDocument":{"synchronization":{"willSave":true,"willSaveWaitUntil":true,"didSave":true},"completion":{"completionItem":{"snippetSupport":true}},"hover":{},"signatureHelp":{},"references":{},"documentHighlight":{"dynamicRegistration":true},"formatting":{},"rangeFormatting":{},"onTypeFormatting":{},"definition":{},"codeAction":{},"documentLink":{},"rename":{"prepareSupport":true},"semanticHighlightingCapabilities":{"semanticHighlighting":true},"callHierarchy":{},"semanticTokens":{"tokenTypes":["namespace","type","class","enum","interface","struct","typeParameter","parameter","variable","property","enumMember","event","function","method","macro","keyword","modifier","comment","string","number","regexp","operator","member","label"],"tokenModifiers":["declaration","definition","readonly","static","deprecated","abstract","async","modification","documentation","defaultLibrary"],"dynamicRegistration":true}}}}}
3+{"jsonrpc":"2.0","method":"initialized","params":{}}
4+{"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"uri":"file:///d:/test_char/src/aaa.cj","languageId":"Cangjie","version":0,"text":"// Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\n// This source file is part of the Cangjie project, licensed under Apache-2.0\n// with Runtime Library Exception.\n//\n// See https://cangjie-lang.cn/pages/LICENSE for license information.\n\npublic import default.{pkgA.A1}"}}}
5+{"jsonrpc":"2.0","id":"9","method":"textDocument/completion","params":{"textDocument":{"uri":"file:///d:/test_char/src/aaa.cj"},"position":{"line":6,"character":29}}}
6+{"jsonrpc":"2.0","id":"4","method":"shutdown","params":{}}
7+{"jsonrpc":"2.0","method":"exit","params":{}}
@@ -268,6 +268,7 @@
268{"completion":{"testFile":"LSP_Completion_ReExport_Alias_001.test","id":"9"}}268{"completion":{"testFile":"LSP_Completion_ReExport_Alias_001.test","id":"9"}}
269{"completion":{"testFile":"LSP_Completion_OrgAutoComplete_001.test","id":"6"}}269{"completion":{"testFile":"LSP_Completion_OrgAutoComplete_001.test","id":"6"}}
270{"completion":{"testFile":"LSP_Completion_MultiImport_001.test","id":"9"}}270{"completion":{"testFile":"LSP_Completion_MultiImport_001.test","id":"9"}}
271+{"completion":{"testFile":"LSP_Completion_ModifiedMultiImport_001.test","id":"9"}}
271{"completion":{"testFile":"LSP_Completion_script_dependencies_build_only_001.test","id":"9"}}272{"completion":{"testFile":"LSP_Completion_script_dependencies_build_only_001.test","id":"9"}}
272 273 
273{"diagnostic":{"testFile":"LSP_Diagnostic_Tuple_001.test"}}274{"diagnostic":{"testFile":"LSP_Diagnostic_Tuple_001.test"}}
@@ -0,0 +1,7 @@
1+// Copyright (c) Huawei Technologies Co., Ltd. 2026. All rights reserved.
2+// This source file is part of the Cangjie project, licensed under Apache-2.0
3+// with Runtime Library Exception.
4+//
5+// See https://cangjie-lang.cn/pages/LICENSE for license information.
6+ 
7+public import default.{pkgA.A1}
@@ -0,0 +1,15 @@
1+// Copyright (c) Huawei Technologies Co., Ltd. 2026. All rights reserved.
2+// This source file is part of the Cangjie project, licensed under Apache-2.0
3+// with Runtime Library Exception.
4+//
5+// See https://cangjie-lang.cn/pages/LICENSE for license information.
6+ 
7+package default.pkgA
8+public var varC = 1
9+public let letC = 1
10+public class classC{func classTest(){}}
11+public enum enumC{|d|a|y}
12+public struct structC{}
13+public interface interfaceC{}
14+public func A1(){}
15+let cccc= 11