Files
website/node_modules/@volar/language-service/lib/features/provideDocumentSemanticTokens.js
2024-05-06 17:15:30 -04:00

65 lines
2.8 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.register = void 0;
const SemanticTokensBuilder_1 = require("../utils/SemanticTokensBuilder");
const cancellation_1 = require("../utils/cancellation");
const common_1 = require("../utils/common");
const featureWorkers_1 = require("../utils/featureWorkers");
const language_core_1 = require("@volar/language-core");
function register(context) {
return async (uri, range, legend, token = cancellation_1.NoneCancellationToken, _reportProgress) => {
const sourceFile = context.language.files.get(uri);
if (!sourceFile) {
return;
}
const document = context.documents.get(uri, sourceFile.languageId, sourceFile.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* (map) {
const mapped = (0, common_1.findOverlapCodeRange)(map.sourceDocument.offsetAt(range.start), map.sourceDocument.offsetAt(range.end), map.map, language_core_1.isSemanticTokensEnabled);
if (mapped) {
yield {
start: map.embeddedDocument.positionAt(mapped.start),
end: map.embeddedDocument.positionAt(mapped.end),
};
}
}, (service, document, range) => {
if (token?.isCancellationRequested) {
return;
}
return service[1].provideDocumentSemanticTokens?.(document, range, legend, token);
}, (tokens, map) => {
if (!map) {
return tokens;
}
return tokens
.map(_token => {
const range = map.getSourceRange({
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(common_1.notEmpty);
}, tokens => tokens.flat());
if (tokens) {
return buildTokens(tokens);
}
};
}
exports.register = register;
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