languageContext.js 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.createLanguageContext = void 0;
  4. const virtualFiles_1 = require("./virtualFiles");
  5. function createLanguageContext(rawHost, languages) {
  6. let host = rawHost;
  7. let lastRootFiles = new Map();
  8. let lastProjectVersion;
  9. const virtualFiles = (0, virtualFiles_1.createVirtualFiles)(languages);
  10. for (const language of languages.reverse()) {
  11. if (language.resolveHost) {
  12. const pastHost = host;
  13. let proxyHost = language.resolveHost(host);
  14. if (proxyHost === pastHost) {
  15. console.warn(`[volar] language.resolveHost() should not return the same host instance.`);
  16. proxyHost = { ...proxyHost };
  17. }
  18. host = new Proxy(proxyHost, {
  19. get(target, p) {
  20. if (p in target) {
  21. return target[p];
  22. }
  23. return pastHost[p];
  24. }
  25. });
  26. }
  27. }
  28. return {
  29. rawHost,
  30. host,
  31. virtualFiles: new Proxy(virtualFiles, {
  32. get: (target, property) => {
  33. syncVirtualFiles();
  34. return target[property];
  35. },
  36. }),
  37. };
  38. function syncVirtualFiles() {
  39. const newProjectVersion = host.getProjectVersion();
  40. const shouldUpdate = newProjectVersion !== lastProjectVersion;
  41. if (!shouldUpdate)
  42. return;
  43. const nowRootFiles = new Map();
  44. const remainRootFiles = new Set(lastRootFiles.keys());
  45. for (const rootFileName of host.getScriptFileNames()) {
  46. nowRootFiles.set(rootFileName, host.getScriptSnapshot(rootFileName));
  47. }
  48. for (const [fileName, snapshot] of nowRootFiles) {
  49. remainRootFiles.delete(fileName);
  50. if (lastRootFiles.get(fileName) !== nowRootFiles.get(fileName)) {
  51. if (snapshot) {
  52. virtualFiles.updateSource(fileName, snapshot, host.getLanguageId?.(fileName));
  53. }
  54. else {
  55. virtualFiles.deleteSource(fileName);
  56. }
  57. }
  58. }
  59. for (const fileName of remainRootFiles) {
  60. virtualFiles.deleteSource(fileName);
  61. }
  62. lastRootFiles = nowRootFiles;
  63. lastProjectVersion = newProjectVersion;
  64. }
  65. }
  66. exports.createLanguageContext = createLanguageContext;
  67. //# sourceMappingURL=languageContext.js.map