astro-ghostcms/.pnpm-store/v3/files/5c/1aa701b6a8dc5b70c4d1f8cbe9a...

89 lines
5.0 KiB
Plaintext

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createAsyncLanguageServicePlugin = void 0;
const decorateLanguageService_1 = require("../node/decorateLanguageService");
const decorateLanguageServiceHost_1 = require("../node/decorateLanguageServiceHost");
const language_core_1 = require("@volar/language-core");
const createLanguageServicePlugin_1 = require("./createLanguageServicePlugin");
const externalFiles = new WeakMap();
const decoratedLanguageServices = new WeakSet();
const decoratedLanguageServiceHosts = new WeakSet();
function createAsyncLanguageServicePlugin(extensions, scriptKind, loadLanguagePlugins) {
return modules => {
const { typescript: ts } = modules;
const pluginModule = {
create(info) {
if (!decoratedLanguageServices.has(info.languageService)
&& !decoratedLanguageServiceHosts.has(info.languageServiceHost)) {
decoratedLanguageServices.add(info.languageService);
decoratedLanguageServiceHosts.add(info.languageServiceHost);
const emptySnapshot = ts.ScriptSnapshot.fromString('');
const getScriptSnapshot = info.languageServiceHost.getScriptSnapshot.bind(info.languageServiceHost);
const getScriptVersion = info.languageServiceHost.getScriptVersion.bind(info.languageServiceHost);
const getScriptKind = info.languageServiceHost.getScriptKind?.bind(info.languageServiceHost);
const getProjectVersion = info.languageServiceHost.getProjectVersion?.bind(info.languageServiceHost);
let initialized = false;
info.languageServiceHost.getScriptSnapshot = fileName => {
if (!initialized && extensions.some(ext => fileName.endsWith(ext))) {
return emptySnapshot;
}
return getScriptSnapshot(fileName);
};
info.languageServiceHost.getScriptVersion = fileName => {
if (!initialized && extensions.some(ext => fileName.endsWith(ext))) {
return 'initializing...';
}
return getScriptVersion(fileName);
};
if (getScriptKind) {
info.languageServiceHost.getScriptKind = fileName => {
if (!initialized && extensions.some(ext => fileName.endsWith(ext))) {
return scriptKind; // TODO: bypass upstream bug
}
return getScriptKind(fileName);
};
}
if (getProjectVersion) {
info.languageServiceHost.getProjectVersion = () => {
if (!initialized) {
return getProjectVersion() + ',initializing...';
}
return getProjectVersion();
};
}
loadLanguagePlugins(ts, info).then(languagePlugins => {
const files = (0, language_core_1.createFileRegistry)(languagePlugins, ts.sys.useCaseSensitiveFileNames, fileName => {
const snapshot = getScriptSnapshot(fileName);
if (snapshot) {
files.set(fileName, (0, language_core_1.resolveCommonLanguageId)(fileName), snapshot);
}
else {
files.delete(fileName);
}
});
(0, decorateLanguageService_1.decorateLanguageService)(files, info.languageService);
(0, decorateLanguageServiceHost_1.decorateLanguageServiceHost)(files, info.languageServiceHost, ts);
info.project.markAsDirty();
initialized = true;
});
}
return info.languageService;
},
getExternalFiles(project, updateLevel = 0) {
if (updateLevel >= (1)
|| !externalFiles.has(project)) {
const oldFiles = externalFiles.get(project);
const newFiles = (0, decorateLanguageServiceHost_1.searchExternalFiles)(ts, project, extensions);
externalFiles.set(project, newFiles);
if (oldFiles && !(0, createLanguageServicePlugin_1.arrayItemsEqual)(oldFiles, newFiles)) {
project.refreshDiagnostics();
}
}
return externalFiles.get(project);
},
};
return pluginModule;
};
}
exports.createAsyncLanguageServicePlugin = createAsyncLanguageServicePlugin;
//# sourceMappingURL=createAsyncLanguageServicePlugin.js.map