virtualFiles.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.forEachEmbeddedFile = exports.updateVirtualFileMaps = exports.createVirtualFiles = void 0;
  4. const source_map_1 = require("@volar/source-map");
  5. const sourceMaps_1 = require("./sourceMaps");
  6. function createVirtualFiles(languages) {
  7. const sourceFiles = new Map();
  8. const virtualFiles = new Map();
  9. const virtualFileMaps = new WeakMap();
  10. const virtualFileToMirrorMap = new WeakMap();
  11. return {
  12. allSources() {
  13. return Array.from(sourceFiles.values());
  14. },
  15. updateSource(fileName, snapshot, languageId) {
  16. const key = normalizePath(fileName);
  17. const value = sourceFiles.get(key);
  18. if (value) {
  19. if (value.languageId !== languageId) {
  20. // languageId changed
  21. this.deleteSource(fileName);
  22. return this.updateSource(fileName, snapshot, languageId);
  23. }
  24. else {
  25. value.snapshot = snapshot;
  26. deleteVirtualFiles(value);
  27. value.language.updateVirtualFile(value.root, snapshot);
  28. updateVirtualFiles(value);
  29. return value.root; // updated
  30. }
  31. }
  32. for (const language of languages) {
  33. const virtualFile = language.createVirtualFile(fileName, snapshot, languageId);
  34. if (virtualFile) {
  35. const source = { fileName, languageId, snapshot, root: virtualFile, language };
  36. sourceFiles.set(key, source);
  37. updateVirtualFiles(source);
  38. return virtualFile; // created
  39. }
  40. }
  41. },
  42. deleteSource(fileName) {
  43. const key = normalizePath(fileName);
  44. const value = sourceFiles.get(key);
  45. if (value) {
  46. value.language.deleteVirtualFile?.(value.root);
  47. sourceFiles.delete(key); // deleted
  48. deleteVirtualFiles(value);
  49. }
  50. },
  51. getSource(fileName) {
  52. const key = normalizePath(fileName);
  53. return sourceFiles.get(key);
  54. },
  55. hasSource: (fileName) => sourceFiles.has(normalizePath(fileName)),
  56. getMirrorMap: getMirrorMap,
  57. getMaps: getMapsByVirtualFile,
  58. hasVirtualFile(fileName) {
  59. return !!virtualFiles.get(normalizePath(fileName));
  60. },
  61. getVirtualFile(fileName) {
  62. const sourceAndVirtual = virtualFiles.get(normalizePath(fileName));
  63. if (sourceAndVirtual) {
  64. return [sourceAndVirtual.virtualFile, sourceAndVirtual.source];
  65. }
  66. return [undefined, undefined];
  67. },
  68. };
  69. function deleteVirtualFiles(source) {
  70. forEachEmbeddedFile(source.root, file => {
  71. virtualFiles.delete(normalizePath(file.fileName));
  72. });
  73. }
  74. function updateVirtualFiles(source) {
  75. forEachEmbeddedFile(source.root, file => {
  76. virtualFiles.set(normalizePath(file.fileName), { virtualFile: file, source });
  77. });
  78. }
  79. function getMapsByVirtualFile(virtualFile) {
  80. if (!virtualFileMaps.has(virtualFile.snapshot)) {
  81. virtualFileMaps.set(virtualFile.snapshot, new Map());
  82. }
  83. updateVirtualFileMaps(virtualFile, sourceFileName => {
  84. if (sourceFileName) {
  85. const source = sourceFiles.get(normalizePath(sourceFileName));
  86. return [sourceFileName, source.snapshot];
  87. }
  88. else {
  89. const source = virtualFiles.get(normalizePath(virtualFile.fileName)).source;
  90. return [source.fileName, source.snapshot];
  91. }
  92. }, virtualFileMaps.get(virtualFile.snapshot));
  93. return virtualFileMaps.get(virtualFile.snapshot);
  94. }
  95. function getMirrorMap(file) {
  96. if (!virtualFileToMirrorMap.has(file.snapshot)) {
  97. virtualFileToMirrorMap.set(file.snapshot, file.mirrorBehaviorMappings ? new sourceMaps_1.MirrorMap(file.mirrorBehaviorMappings) : undefined);
  98. }
  99. return virtualFileToMirrorMap.get(file.snapshot);
  100. }
  101. }
  102. exports.createVirtualFiles = createVirtualFiles;
  103. function updateVirtualFileMaps(virtualFile, getSourceSnapshot, map = new Map()) {
  104. const sources = new Set();
  105. for (const mapping of virtualFile.mappings) {
  106. if (sources.has(mapping.source))
  107. continue;
  108. sources.add(mapping.source);
  109. const source = getSourceSnapshot(mapping.source);
  110. if (!source)
  111. continue;
  112. if (!map.has(source[0]) || map.get(source[0])[0] !== source[1]) {
  113. map.set(source[0], [source[1], new source_map_1.SourceMap(virtualFile.mappings.filter(mapping2 => mapping2.source === mapping.source))]);
  114. }
  115. }
  116. return map;
  117. }
  118. exports.updateVirtualFileMaps = updateVirtualFileMaps;
  119. function forEachEmbeddedFile(file, cb) {
  120. cb(file);
  121. for (const embeddedFile of file.embeddedFiles) {
  122. forEachEmbeddedFile(embeddedFile, cb);
  123. }
  124. }
  125. exports.forEachEmbeddedFile = forEachEmbeddedFile;
  126. function normalizePath(fileName) {
  127. return fileName.replace(/\\/g, '/').toLowerCase();
  128. }
  129. //# sourceMappingURL=virtualFiles.js.map