168 lines
6.9 KiB
JavaScript
168 lines
6.9 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.documentFeatureWorker = documentFeatureWorker;
|
|
exports.languageFeatureWorker = languageFeatureWorker;
|
|
exports.safeCall = safeCall;
|
|
exports.forEachEmbeddedDocument = forEachEmbeddedDocument;
|
|
exports.getSourceRange = getSourceRange;
|
|
exports.getGeneratedRange = getGeneratedRange;
|
|
exports.getSourceRanges = getSourceRanges;
|
|
exports.getGeneratedRanges = getGeneratedRanges;
|
|
exports.getSourcePositions = getSourcePositions;
|
|
exports.getGeneratedPositions = getGeneratedPositions;
|
|
exports.getLinkedCodePositions = getLinkedCodePositions;
|
|
function documentFeatureWorker(context, uri, valid, worker, transformResult, combineResult) {
|
|
return languageFeatureWorker(context, uri, () => void 0, function* (map) {
|
|
if (valid(map)) {
|
|
yield;
|
|
}
|
|
}, worker, transformResult, combineResult);
|
|
}
|
|
async function languageFeatureWorker(context, uri, getRealDocParams, eachVirtualDocParams, worker, transformResult, combineResult) {
|
|
let sourceScript;
|
|
const decoded = context.decodeEmbeddedDocumentUri(uri);
|
|
if (decoded) {
|
|
sourceScript = context.language.scripts.get(decoded[0]);
|
|
}
|
|
else {
|
|
sourceScript = context.language.scripts.get(uri);
|
|
}
|
|
if (!sourceScript) {
|
|
return;
|
|
}
|
|
let results = [];
|
|
if (decoded) {
|
|
const virtualCode = sourceScript.generated?.embeddedCodes.get(decoded[1]);
|
|
if (virtualCode) {
|
|
const docs = [
|
|
context.documents.get(sourceScript.id, sourceScript.languageId, sourceScript.snapshot),
|
|
context.documents.get(uri, virtualCode.languageId, virtualCode.snapshot),
|
|
context.language.maps.get(virtualCode, sourceScript),
|
|
];
|
|
await docsWorker(docs, false);
|
|
}
|
|
}
|
|
else if (sourceScript.generated) {
|
|
for (const docs of forEachEmbeddedDocument(context, sourceScript, sourceScript.generated.root)) {
|
|
if (results.length && !combineResult) {
|
|
continue;
|
|
}
|
|
await docsWorker(docs, true);
|
|
}
|
|
}
|
|
else {
|
|
const document = context.documents.get(uri, sourceScript.languageId, sourceScript.snapshot);
|
|
const params = getRealDocParams();
|
|
for (const [pluginIndex, plugin] of Object.entries(context.plugins)) {
|
|
if (context.disabledServicePlugins.has(plugin[1])) {
|
|
continue;
|
|
}
|
|
const embeddedResult = await safeCall(() => worker(plugin, document, params, undefined), `Language service plugin "${plugin[0].name}" (${pluginIndex}) failed to provide document feature for ${document.uri}.`);
|
|
if (!embeddedResult) {
|
|
continue;
|
|
}
|
|
const result = transformResult(embeddedResult, undefined);
|
|
if (!result) {
|
|
continue;
|
|
}
|
|
results.push(result);
|
|
if (!combineResult) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (combineResult && results.length > 0) {
|
|
const combined = combineResult(results);
|
|
return combined;
|
|
}
|
|
else if (results.length > 0) {
|
|
return results[0];
|
|
}
|
|
async function docsWorker(docs, transform) {
|
|
for (const mappedArg of eachVirtualDocParams(docs)) {
|
|
if (results.length && !combineResult) {
|
|
continue;
|
|
}
|
|
for (const [pluginIndex, plugin] of Object.entries(context.plugins)) {
|
|
if (context.disabledServicePlugins.has(plugin[1])) {
|
|
continue;
|
|
}
|
|
if (results.length && !combineResult) {
|
|
continue;
|
|
}
|
|
const embeddedResult = await safeCall(() => worker(plugin, docs[1], mappedArg, docs), `Language service plugin "${plugin[0].name}" (${pluginIndex}) failed to provide document feature for ${docs[1].uri}.`);
|
|
if (!embeddedResult) {
|
|
continue;
|
|
}
|
|
if (transform) {
|
|
const mappedResult = transformResult(embeddedResult, docs);
|
|
if (mappedResult) {
|
|
results.push(mappedResult);
|
|
}
|
|
}
|
|
else {
|
|
results.push(embeddedResult);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
async function safeCall(cb, errorMsg) {
|
|
try {
|
|
return await cb();
|
|
}
|
|
catch (err) {
|
|
console.warn(errorMsg, err);
|
|
}
|
|
}
|
|
function* forEachEmbeddedDocument(context, sourceScript, current) {
|
|
if (current.embeddedCodes) {
|
|
for (const embeddedCode of current.embeddedCodes) {
|
|
yield* forEachEmbeddedDocument(context, sourceScript, embeddedCode);
|
|
}
|
|
}
|
|
const embeddedDocumentUri = context.encodeEmbeddedDocumentUri(sourceScript.id, current.id);
|
|
if (!context.disabledEmbeddedDocumentUris.get(embeddedDocumentUri)) {
|
|
yield [
|
|
context.documents.get(sourceScript.id, sourceScript.languageId, sourceScript.snapshot),
|
|
context.documents.get(embeddedDocumentUri, current.languageId, current.snapshot),
|
|
context.language.maps.get(current, sourceScript),
|
|
];
|
|
}
|
|
}
|
|
function getSourceRange(docs, range, filter) {
|
|
for (const result of getSourceRanges(docs, range, filter)) {
|
|
return result;
|
|
}
|
|
}
|
|
function getGeneratedRange(docs, range, filter) {
|
|
for (const result of getGeneratedRanges(docs, range, filter)) {
|
|
return result;
|
|
}
|
|
}
|
|
function* getSourceRanges([sourceDocument, embeddedDocument, map], range, filter) {
|
|
for (const [mappedStart, mappedEnd] of map.toSourceRange(embeddedDocument.offsetAt(range.start), embeddedDocument.offsetAt(range.end), true, filter)) {
|
|
yield { start: sourceDocument.positionAt(mappedStart), end: sourceDocument.positionAt(mappedEnd) };
|
|
}
|
|
}
|
|
function* getGeneratedRanges([sourceDocument, embeddedDocument, map], range, filter) {
|
|
for (const [mappedStart, mappedEnd] of map.toGeneratedRange(sourceDocument.offsetAt(range.start), sourceDocument.offsetAt(range.end), true, filter)) {
|
|
yield { start: embeddedDocument.positionAt(mappedStart), end: embeddedDocument.positionAt(mappedEnd) };
|
|
}
|
|
}
|
|
function* getSourcePositions([sourceDocument, embeddedDocument, map], position, filter = () => true) {
|
|
for (const mapped of map.toSourceLocation(embeddedDocument.offsetAt(position), filter)) {
|
|
yield sourceDocument.positionAt(mapped[0]);
|
|
}
|
|
}
|
|
function* getGeneratedPositions([sourceDocument, embeddedDocument, map], position, filter = () => true) {
|
|
for (const mapped of map.toGeneratedLocation(sourceDocument.offsetAt(position), filter)) {
|
|
yield embeddedDocument.positionAt(mapped[0]);
|
|
}
|
|
}
|
|
function* getLinkedCodePositions(document, linkedMap, posotion) {
|
|
for (const linkedPosition of linkedMap.getLinkedOffsets(document.offsetAt(posotion))) {
|
|
yield document.positionAt(linkedPosition);
|
|
}
|
|
}
|
|
//# sourceMappingURL=featureWorkers.js.map
|