VSCode Cucumber语言服务扩展:光标在行中时自动补全失效
Cucumber Language Server VSCode扩展自动补全异常问题
开发Cucumber Language Server的VSCode扩展分支时遇到异常:
- 光标右侧无内容时,自动补全(
onCompletion)功能正常 - 光标右侧有内容时,调试器显示
allCompletionItems已返回正确结果,但VSCode实际无补全结果返回,疑似被VSCode语言服务框架删除或覆盖
server.ts关键代码片段
connection.onInitialize((params): InitializeResult => { workspaceRoot = params.rootPath; return { capabilities: { // Full text sync mode textDocumentSync: documents.syncKind, //Completion will be triggered after every character pressing completionProvider: { resolveProvider: true, triggerCharacters: [' ', '.'] }, definitionProvider: true, documentFormattingProvider: true, documentRangeFormattingProvider: true, documentOnTypeFormattingProvider: { firstTriggerCharacter: ' ', moreTriggerCharacter: ['@', '#', ':'] } } }; }); ... connection.onCompletion((position: TextDocumentPositionParams): CompletionItem[] => { const text = documents.get(position.textDocument.uri).getText(); const lines = text.split(/\r?\n/g); const line = lines[position.position.line]; const lineUntilCursor = line.slice(0, position.position.character); const char = position.position.character; const wordBeforeCursor = getWordBeforeCursor(line, char); const caseHandlers = findCaseHandlers(text, position.position.line); let allCompletionItems: CompletionItem[] = []; if (wordBeforeCursor === "case" || wordBeforeCursor === "field" || wordBeforeCursor === "enum") { allCompletionItems = addCaseHandlersToCompletionItems(lineUntilCursor, caseHandlers, allCompletionItems); } allCompletionItems = extractFieldsForCaseHandlerIfPossible(caseHandlers, wordBeforeCursor, allCompletionItems); if (pagesPosition(line, char) && pagesHandler) { allCompletionItems = allCompletionItems.concat(pagesHandler.getCompletion(line, position.position)); } if (handleSteps() && stepsHandler) { allCompletionItems = allCompletionItems.concat(stepsHandler.getCompletion(line, position.position.line, text)); } return allCompletionItems; });
Cucumber代码示例
注:
_代表光标位置,此时无法返回正确补全结果;删除光标右侧的"is 50"后,补全功能完全正常
Scenario: Update original case, aswell as new case variable Given case case3 is case1.caseField Given field case3.intField is 100 Given field case2.intField is 50 Given field _ is 50
已尝试的排查手段
- 使用调试器确认
allCompletionItems结果正确 - 修改逻辑让
addCaseHandlersToCompletionItems始终执行 - 检查
getWordBeforeCursor方法
内容的提问来源于stack exchange,提问作者Lasse Klausen
相关产品推荐
相关产品推荐

