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
112 lines
4.5 KiB
|
2 years ago
|
"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
|