You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 10:41:09