67 lines
2.9 KiB
JavaScript
67 lines
2.9 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.register = register;
|
|
const language_core_1 = require("@volar/language-core");
|
|
const SemanticTokensBuilder_1 = require("../utils/SemanticTokensBuilder");
|
|
const cancellation_1 = require("../utils/cancellation");
|
|
const common_1 = require("../utils/common");
|
|
const featureWorkers_1 = require("../utils/featureWorkers");
|
|
function register(context) {
|
|
return async (uri, range, legend, _reportProgress, // TODO
|
|
token = cancellation_1.NoneCancellationToken) => {
|
|
const sourceScript = context.language.scripts.get(uri);
|
|
if (!sourceScript) {
|
|
return;
|
|
}
|
|
const document = context.documents.get(uri, sourceScript.languageId, sourceScript.snapshot);
|
|
if (!range) {
|
|
range = {
|
|
start: { line: 0, character: 0 },
|
|
end: { line: document.lineCount - 1, character: document.getText().length },
|
|
};
|
|
}
|
|
const tokens = await (0, featureWorkers_1.languageFeatureWorker)(context, uri, () => range, function* (docs) {
|
|
const mapped = (0, common_1.findOverlapCodeRange)(docs[0].offsetAt(range.start), docs[0].offsetAt(range.end), docs[2], language_core_1.isSemanticTokensEnabled);
|
|
if (mapped) {
|
|
yield {
|
|
start: docs[1].positionAt(mapped.start),
|
|
end: docs[1].positionAt(mapped.end),
|
|
};
|
|
}
|
|
}, (plugin, document, range) => {
|
|
if (token?.isCancellationRequested) {
|
|
return;
|
|
}
|
|
return plugin[1].provideDocumentSemanticTokens?.(document, range, legend, token);
|
|
}, (tokens, docs) => {
|
|
if (!docs) {
|
|
return tokens;
|
|
}
|
|
return tokens
|
|
.map(_token => {
|
|
const range = (0, featureWorkers_1.getSourceRange)(docs, {
|
|
start: { line: _token[0], character: _token[1] },
|
|
end: { line: _token[0], character: _token[1] + _token[2] },
|
|
}, language_core_1.isSemanticTokensEnabled);
|
|
if (range) {
|
|
return [range.start.line, range.start.character, range.end.character - range.start.character, _token[3], _token[4]];
|
|
}
|
|
})
|
|
.filter(token => !!token);
|
|
}, tokens => tokens.flat()
|
|
// tokens => reportProgress?.(buildTokens(tokens)), // TODO: this has no effect with LSP
|
|
);
|
|
if (tokens) {
|
|
return buildTokens(tokens);
|
|
}
|
|
};
|
|
}
|
|
function buildTokens(tokens) {
|
|
const builder = new SemanticTokensBuilder_1.SemanticTokensBuilder();
|
|
const sortedTokens = tokens.sort((a, b) => a[0] - b[0] === 0 ? a[1] - b[1] : a[0] - b[0]);
|
|
for (const token of sortedTokens) {
|
|
builder.push(...token);
|
|
}
|
|
return builder.build();
|
|
}
|
|
//# sourceMappingURL=provideDocumentSemanticTokens.js.map
|