Семантическая подсветка не работает в моем расширении VS-кода

#typescript #visual-studio-code #vscode-extensions

Вопрос:

Я следовал приведенным здесь инструкциям по реализации семантической подсветки в моем расширении VS Code. Это код, который я написал:

MySemanticTokenProvider.ts

 import * as vscode from 'vscode';

const tokenTypes = ['variable'];
const tokenModifiers = ['declaration'];
export const legend = new vscode.SemanticTokensLegend(tokenTypes, tokenModifiers);

export const provider: vscode.DocumentSemanticTokensProvider = {
    provideDocumentSemanticTokens(document: vscode.TextDocument): vscode.ProviderResult<vscode.SemanticTokens> {
      // analyze the document and return semantic tokens 
      const tokensBuilder = new vscode.SemanticTokensBuilder(legend);
      // highlight the characters from position 1, 1 to position 1, 5
      tokensBuilder.push(
        new vscode.Range(new vscode.Position(1, 1), new vscode.Position(1, 5)),
        'variable',
        ['declaration']
      );
      return tokensBuilder.build();
    }
};

export const documentSelector = { language: 'mylanguage', scheme: 'file' };
 

settings.json

 {
    "editor.semanticHighlighting.enabled": "configuredByTheme"
}
 

mylanguagetheme.json

 {
    "name": "mylanguage",
    "type": "light",
    ...
    "semanticHighlighting": true,
    "semanticTokenColors": {
        "variable.declaration:mylanguage": {
            "foreground": "#0f8f90"
    }
}
 

extension.ts

 import * as vscode from 'vscode';
import {legend, provider, documentSelector} from './MySemanticTokenProvider';
...
context.subscriptions.push(
    vscode.languages.registerDocumentSemanticTokensProvider(documentSelector, provider, legend)
);
 

Основываясь на моем коде, я ожидал бы, что символы из позиции (1, 1) в позицию (1, 5) в редакторе будут выделены; однако семантическая подсветка не работает. Как я могу решить эту проблему?

Комментарии:

1. Работает ли вообще провайдер? Что произойдет, если вы добавите точку останова внутри provideDocumentSemanticTokens ?

2. Я не думаю, что провайдер работает. Ничего не произойдет, если я добавлю точку останова внутри provideDocumentSemanticTokens . Я также написал console.log() заявление внутри provideDocumentSemanticTokens , и ничего не было напечатано на консоли отладки.

3. Похоже, ваш провайдер не зарегистрирован должным образом. Попробуйте добавить точку останова после context.subscriptions.push , чтобы убедиться, что она работает правильно.

4. Я не уверен, как именно это должно работать, но, используя точки останова, я могу сказать, что программа не запускает provideDocumentSemanticTokens метод. Однако я не могу найти никакой разницы между моей реализацией и документацией

5. У меня есть, вот моя реализация. Единственное различие, которое я мог видеть, заключается в том, что я использую класс вместо объекта.