140 lines
5.7 KiB
Plaintext
140 lines
5.7 KiB
Plaintext
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.safeCall = exports.ruleWorker = exports.languageFeatureWorker = exports.documentFeatureWorker = void 0;
|
|
const definePlugin_1 = require("./definePlugin");
|
|
const types_1 = require("../types");
|
|
async function documentFeatureWorker(context, uri, isValidSourceMap, worker, transform, combineResult) {
|
|
return languageFeatureWorker(context, uri, undefined, (_, map, file) => {
|
|
if (isValidSourceMap(file, map)) {
|
|
return [undefined];
|
|
}
|
|
return [];
|
|
}, worker, transform, combineResult);
|
|
}
|
|
exports.documentFeatureWorker = documentFeatureWorker;
|
|
async function languageFeatureWorker(context, uri, arg, transformArg, worker, transform, combineResult, reportProgress) {
|
|
const document = context.getTextDocument(uri);
|
|
const virtualFile = context.documents.getSourceByUri(uri)?.root;
|
|
let results = [];
|
|
if (virtualFile) {
|
|
await (0, definePlugin_1.visitEmbedded)(context.documents, virtualFile, async (file, map) => {
|
|
for (const mappedArg of transformArg(arg, map, file)) {
|
|
for (const [serviceId, service] of Object.entries(context.services)) {
|
|
const embeddedResult = await safeCall(() => worker(service, map.virtualFileDocument, mappedArg, map, file), 'service ' + serviceId + ' crashed on ' + map.virtualFileDocument.uri);
|
|
if (!embeddedResult)
|
|
continue;
|
|
const result = transform(embeddedResult, map);
|
|
if (!result)
|
|
continue;
|
|
results.push(result);
|
|
if (!combineResult)
|
|
return false;
|
|
const isEmptyArray = Array.isArray(result) && result.length === 0;
|
|
if (reportProgress && !isEmptyArray) {
|
|
reportProgress(combineResult(results));
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
});
|
|
}
|
|
else if (document) {
|
|
for (const [serviceId, service] of Object.entries(context.services)) {
|
|
const embeddedResult = await safeCall(() => worker(service, document, arg, undefined, undefined), 'service ' + serviceId + ' crashed on ' + uri);
|
|
if (!embeddedResult)
|
|
continue;
|
|
const result = transform(embeddedResult, undefined);
|
|
if (!result)
|
|
continue;
|
|
results.push(result);
|
|
if (!combineResult)
|
|
break;
|
|
const isEmptyArray = Array.isArray(result) && result.length === 0;
|
|
if (reportProgress && !isEmptyArray) {
|
|
reportProgress(combineResult(results));
|
|
}
|
|
}
|
|
}
|
|
if (combineResult && results.length > 0) {
|
|
return combineResult(results);
|
|
}
|
|
else if (results.length > 0) {
|
|
return results[0];
|
|
}
|
|
}
|
|
exports.languageFeatureWorker = languageFeatureWorker;
|
|
async function ruleWorker(context, ruleType, uri, isValidSourceMap, worker, transform, combineResult, reportProgress) {
|
|
const document = context.getTextDocument(uri);
|
|
const virtualFile = context.documents.getSourceByUri(uri)?.root;
|
|
const ruleCtx = {
|
|
env: context.env,
|
|
inject: context.inject,
|
|
report: () => { },
|
|
};
|
|
let results = [];
|
|
if (virtualFile) {
|
|
await (0, definePlugin_1.visitEmbedded)(context.documents, virtualFile, async (file, map) => {
|
|
if (!isValidSourceMap(file)) {
|
|
return true;
|
|
}
|
|
for (const ruleId in context.rules) {
|
|
const rule = context.rules[ruleId];
|
|
if ((rule.type ?? types_1.RuleType.Syntax) !== ruleType) {
|
|
continue;
|
|
}
|
|
const embeddedResult = await safeCall(() => worker(ruleId, rule, map.virtualFileDocument, ruleCtx), 'rule ' + ruleId + ' crashed on ' + map.virtualFileDocument.uri);
|
|
if (!embeddedResult)
|
|
continue;
|
|
const result = transform(embeddedResult, map);
|
|
if (!result)
|
|
continue;
|
|
results.push(result);
|
|
if (!combineResult)
|
|
return false;
|
|
const isEmptyArray = Array.isArray(result) && result.length === 0;
|
|
if (reportProgress && !isEmptyArray) {
|
|
reportProgress(combineResult(results));
|
|
}
|
|
}
|
|
return true;
|
|
});
|
|
}
|
|
else if (document) {
|
|
for (const ruleId in context.rules) {
|
|
const rule = context.rules[ruleId];
|
|
if ((rule.type ?? types_1.RuleType.Syntax) !== ruleType) {
|
|
continue;
|
|
}
|
|
const embeddedResult = await safeCall(() => worker(ruleId, rule, document, ruleCtx), 'rule ' + ruleId + ' crashed on ' + document.uri);
|
|
if (!embeddedResult)
|
|
continue;
|
|
const result = transform(embeddedResult, undefined);
|
|
if (!result)
|
|
continue;
|
|
results.push(result);
|
|
if (!combineResult)
|
|
break;
|
|
const isEmptyArray = Array.isArray(result) && result.length === 0;
|
|
if (reportProgress && !isEmptyArray) {
|
|
reportProgress(combineResult(results));
|
|
}
|
|
}
|
|
}
|
|
if (combineResult && results.length > 0) {
|
|
return combineResult(results);
|
|
}
|
|
else if (results.length > 0) {
|
|
return results[0];
|
|
}
|
|
}
|
|
exports.ruleWorker = ruleWorker;
|
|
async function safeCall(cb, errorMsg) {
|
|
try {
|
|
return await cb();
|
|
}
|
|
catch (err) {
|
|
console.warn(errorMsg, err);
|
|
}
|
|
}
|
|
exports.safeCall = safeCall;
|
|
//# sourceMappingURL=featureWorkers.js.map |