#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. У меня есть, вот моя реализация. Единственное различие, которое я мог видеть, заключается в том, что я использую класс вместо объекта.