数通智联化工云平台
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

112 lines
4.5 KiB

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.forEachEmbeddedFile = exports.createVirtualFiles = void 0;
const source_map_1 = require("@volar/source-map");
const sourceMaps_1 = require("./sourceMaps");
function createVirtualFiles(languageModules) {
const sourceFiles = new Map();
const virtualFiles = new Map();
const virtualFileToSourceMapsMap = new WeakMap();
const virtualFileToMirrorMap = new WeakMap();
let sourceFilesDirty = true;
return {
allSources() {
return Array.from(sourceFiles.values());
},
updateSource(fileName, snapshot, languageId) {
const key = normalizePath(fileName);
const value = sourceFiles.get(key);
if (value) {
value.snapshot = snapshot;
value.languageModule.updateFile(value.root, snapshot);
sourceFilesDirty = true;
return value.root; // updated
}
for (const languageModule of languageModules) {
const virtualFile = languageModule.createFile(fileName, snapshot, languageId);
if (virtualFile) {
sourceFiles.set(key, { fileName, snapshot, root: virtualFile, languageModule });
sourceFilesDirty = true;
return virtualFile; // created
}
}
},
deleteSource(fileName) {
const key = normalizePath(fileName);
const value = sourceFiles.get(key);
if (value) {
value.languageModule.deleteFile?.(value.root);
sourceFiles.delete(key); // deleted
sourceFilesDirty = true;
}
},
getSource(fileName) {
const key = normalizePath(fileName);
return sourceFiles.get(key);
},
hasSource: (fileName) => sourceFiles.has(normalizePath(fileName)),
getMirrorMap: getMirrorMap,
getMaps: getSourceMaps,
hasVirtualFile(fileName) {
return !!getVirtualFilesMap().get(normalizePath(fileName));
},
getVirtualFile(fileName) {
const sourceAndVirtual = getVirtualFilesMap().get(normalizePath(fileName));
if (sourceAndVirtual) {
return [sourceAndVirtual.virtualFile, sourceAndVirtual.source];
}
return [undefined, undefined];
},
};
function getVirtualFilesMap() {
if (sourceFilesDirty) {
sourceFilesDirty = false;
virtualFiles.clear();
for (const [_, row] of sourceFiles) {
forEachEmbeddedFile(row.root, file => {
virtualFiles.set(normalizePath(file.fileName), { virtualFile: file, source: row });
});
}
}
return virtualFiles;
}
function getSourceMaps(virtualFile) {
let sourceMapsBySourceFileName = virtualFileToSourceMapsMap.get(virtualFile.snapshot);
if (!sourceMapsBySourceFileName) {
sourceMapsBySourceFileName = new Map();
virtualFileToSourceMapsMap.set(virtualFile.snapshot, sourceMapsBySourceFileName);
}
const sources = new Set();
for (const map of virtualFile.mappings) {
sources.add(map.source);
}
for (const source of sources) {
const sourceFileName = source ?? getVirtualFilesMap().get(normalizePath(virtualFile.fileName)).source.fileName;
if (!sourceMapsBySourceFileName.has(sourceFileName)) {
sourceMapsBySourceFileName.set(sourceFileName, [
sourceFileName,
new source_map_1.SourceMap(virtualFile.mappings.filter(mapping => mapping.source === source)),
]);
}
}
return [...sourceMapsBySourceFileName.values()];
}
function getMirrorMap(file) {
if (!virtualFileToMirrorMap.has(file.snapshot)) {
virtualFileToMirrorMap.set(file.snapshot, file.mirrorBehaviorMappings ? new sourceMaps_1.MirrorMap(file.mirrorBehaviorMappings) : undefined);
}
return virtualFileToMirrorMap.get(file.snapshot);
}
}
exports.createVirtualFiles = createVirtualFiles;
function forEachEmbeddedFile(file, cb) {
cb(file);
for (const embeddedFile of file.embeddedFiles) {
forEachEmbeddedFile(embeddedFile, cb);
}
}
exports.forEachEmbeddedFile = forEachEmbeddedFile;
function normalizePath(fileName) {
return fileName.replace(/\\/g, '/').toLowerCase();
}
//# sourceMappingURL=virtualFiles.js.map