Пользовательское расширение для JSON Завершение не работает в двойных кавычках - PullRequest
1 голос
/ 31 января 2020

Я разрабатываю расширение VSCode, которое должно улучшить JSON редактирование с дополнительным дополнением кода. Поэтому я добавил четыре фиктивных предложения (foo, foo1, foo2, foo3), чтобы начать тестирование. При вводе двоеточия после клавиши JSON она работает должным образом:

expected behavior

Также, когда я запускаю завершение в пустом объекте, он работает так, как я хочу это (включая предложения из других расширений):

enter image description here

Однако, когда я запускаю завершение в двойных кавычках (независимо от того, содержат ли они текст или нет), мои предложения отсутствуют:

enter image description here enter image description here

Когда я устанавливаю точку останова в моих CompletionItemProvider паузах выполнения, как и ожидалось в обоих случаях , Так что он называется правильно, и он точно возвращает мои предложения. Я посмотрел в существующих JSON расширениях редактора (даже VSCodes по умолчанию), чтобы получить совет, как правильно его реализовать и посмотреть, может ли расширение JSON по умолчанию перезаписать все предложения в двойных кавычках (даже если это нарушит всю идею расширяемости). по моему мнению) но ничего не смог найти.

Для воспроизведения достаточно создать пустое расширение, как описано здесь .

Вот мой extension.ts:

// The module 'vscode' contains the VS Code extensibility API
// Import the module and reference it with the alias vscode in your code below
import * as vscode from 'vscode';

class OpenApiCompletionItemProvider implements vscode.CompletionItemProvider {
    public provideCompletionItems(
        document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken):
        Thenable<vscode.CompletionItem[]> {
        return Promise.resolve([
            new vscode.CompletionItem('foo', vscode.CompletionItemKind.Class),
            new vscode.CompletionItem('foo1', vscode.CompletionItemKind.Property),
            new vscode.CompletionItem('foo2', vscode.CompletionItemKind.Interface),
            new vscode.CompletionItem('foo3', vscode.CompletionItemKind.Class),
        ]);
    }
}

export function activate(ctx: vscode.ExtensionContext): void {
    ctx.subscriptions.push(
        vscode.languages.registerCompletionItemProvider(
            { pattern: '**/*.openapi.json' },
            new OpenApiCompletionItemProvider(),
            ':',
            '"'
        )
    );
}

// this method is called when your extension is deactivated
export function deactivate() { }

1 Ответ

1 голос
/ 31 января 2020

Начальная кавычка " является частью того, что VSCode считает текущим «словом». Следовательно, возвращаемые элементы завершения не соответствуют текущей строке фильтра " и не отображаются.

Это можно исправить, включив полное слово (с кавычками) в текст вставки:

new vscode.CompletionItem('"foo"', vscode.CompletionItemKind.Class)

(оставьте строку label такой же и используйте insertText, если вы не хотите, чтобы кавычки отображались во всплывающем окне завершения)

В качестве альтернативы, вы можете настроить range соответственно:

var item = new vscode.CompletionItem('foo', vscode.CompletionItemKind.Class);
item.range = new vscode.Range(position, position);

Примечание: вы можете найти document.getWordRangeAtPosition() полезным. Вы можете найти определение слова в JSON здесь .

...