123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 |
- "use strict";
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- var desc = Object.getOwnPropertyDescriptor(m, k);
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
- desc = { enumerable: true, get: function() { return m[k]; } };
- }
- Object.defineProperty(o, k2, desc);
- }) : (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- o[k2] = m[k];
- }));
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
- };
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.defaultMapperFactory = exports.SourceMap = void 0;
- exports.createLanguage = createLanguage;
- exports.forEachEmbeddedCode = forEachEmbeddedCode;
- var source_map_1 = require("@volar/source-map");
- Object.defineProperty(exports, "SourceMap", { enumerable: true, get: function () { return source_map_1.SourceMap; } });
- __exportStar(require("./lib/editor"), exports);
- __exportStar(require("./lib/linkedCodeMap"), exports);
- __exportStar(require("./lib/types"), exports);
- __exportStar(require("./lib/utils"), exports);
- const source_map_2 = require("@volar/source-map");
- const linkedCodeMap_1 = require("./lib/linkedCodeMap");
- const defaultMapperFactory = mappings => new source_map_2.SourceMap(mappings);
- exports.defaultMapperFactory = defaultMapperFactory;
- function createLanguage(plugins, scriptRegistry, sync, onAssociationDirty) {
- const virtualCodeToSourceScriptMap = new WeakMap();
- const virtualCodeToSourceMap = new WeakMap();
- const virtualCodeToLinkedCodeMap = new WeakMap();
- const language = {
- mapperFactory: exports.defaultMapperFactory,
- plugins,
- scripts: {
- fromVirtualCode(virtualCode) {
- return virtualCodeToSourceScriptMap.get(virtualCode);
- },
- get(id, includeFsFiles = true, shouldRegister = false) {
- sync(id, includeFsFiles, shouldRegister);
- const result = scriptRegistry.get(id);
- // The sync function provider may not always call the set function due to caching, so it is necessary to explicitly check isAssociationDirty.
- if (result?.isAssociationDirty) {
- this.set(id, result.snapshot, result.languageId);
- }
- return scriptRegistry.get(id);
- },
- set(id, snapshot, languageId, _plugins = plugins) {
- if (!languageId) {
- for (const plugin of plugins) {
- languageId = plugin.getLanguageId?.(id);
- if (languageId) {
- break;
- }
- }
- }
- if (!languageId) {
- console.warn(`languageId not found for ${id}`);
- return;
- }
- let associatedOnly = false;
- for (const plugin of plugins) {
- if (plugin.isAssociatedFileOnly?.(id, languageId)) {
- associatedOnly = true;
- break;
- }
- }
- if (scriptRegistry.has(id)) {
- const sourceScript = scriptRegistry.get(id);
- if (sourceScript.languageId !== languageId || sourceScript.associatedOnly !== associatedOnly) {
- this.delete(id);
- triggerTargetsDirty(sourceScript);
- return this.set(id, snapshot, languageId);
- }
- else if (associatedOnly) {
- if (sourceScript.snapshot !== snapshot) {
- sourceScript.snapshot = snapshot;
- triggerTargetsDirty(sourceScript);
- }
- }
- else if (sourceScript.isAssociationDirty || sourceScript.snapshot !== snapshot) {
- if (sourceScript.snapshot !== snapshot) {
- sourceScript.snapshot = snapshot;
- triggerTargetsDirty(sourceScript);
- }
- const codegenCtx = prepareCreateVirtualCode(sourceScript);
- if (sourceScript.generated) {
- const { updateVirtualCode, createVirtualCode } = sourceScript.generated.languagePlugin;
- const newVirtualCode = updateVirtualCode
- ? updateVirtualCode(id, sourceScript.generated.root, snapshot, codegenCtx)
- : createVirtualCode?.(id, languageId, snapshot, codegenCtx);
- if (newVirtualCode) {
- sourceScript.generated.root = newVirtualCode;
- sourceScript.generated.embeddedCodes.clear();
- for (const code of forEachEmbeddedCode(sourceScript.generated.root)) {
- virtualCodeToSourceScriptMap.set(code, sourceScript);
- sourceScript.generated.embeddedCodes.set(code.id, code);
- }
- return sourceScript;
- }
- else {
- this.delete(id);
- return;
- }
- }
- }
- else {
- // not changed
- return sourceScript;
- }
- }
- else {
- // created
- const sourceScript = {
- id: id,
- languageId,
- snapshot,
- associatedIds: new Set(),
- targetIds: new Set(),
- associatedOnly
- };
- scriptRegistry.set(id, sourceScript);
- if (associatedOnly) {
- return sourceScript;
- }
- for (const languagePlugin of _plugins) {
- const virtualCode = languagePlugin.createVirtualCode?.(id, languageId, snapshot, prepareCreateVirtualCode(sourceScript));
- if (virtualCode) {
- sourceScript.generated = {
- root: virtualCode,
- languagePlugin,
- embeddedCodes: new Map(),
- };
- for (const code of forEachEmbeddedCode(virtualCode)) {
- virtualCodeToSourceScriptMap.set(code, sourceScript);
- sourceScript.generated.embeddedCodes.set(code.id, code);
- }
- break;
- }
- }
- return sourceScript;
- }
- },
- delete(id) {
- const sourceScript = scriptRegistry.get(id);
- if (sourceScript) {
- sourceScript.generated?.languagePlugin.disposeVirtualCode?.(id, sourceScript.generated.root);
- scriptRegistry.delete(id);
- triggerTargetsDirty(sourceScript);
- }
- },
- },
- maps: {
- get(virtualCode, sourceScript) {
- let mapCache = virtualCodeToSourceMap.get(virtualCode.snapshot);
- if (!mapCache) {
- virtualCodeToSourceMap.set(virtualCode.snapshot, mapCache = new WeakMap());
- }
- if (!mapCache.has(sourceScript.snapshot)) {
- const mappings = virtualCode.associatedScriptMappings?.get(sourceScript.id) ?? virtualCode.mappings;
- mapCache.set(sourceScript.snapshot, language.mapperFactory(mappings));
- }
- return mapCache.get(sourceScript.snapshot);
- },
- *forEach(virtualCode) {
- const sourceScript = virtualCodeToSourceScriptMap.get(virtualCode);
- yield [
- sourceScript,
- this.get(virtualCode, sourceScript),
- ];
- if (virtualCode.associatedScriptMappings) {
- for (const [relatedScriptId] of virtualCode.associatedScriptMappings) {
- const relatedSourceScript = scriptRegistry.get(relatedScriptId);
- if (relatedSourceScript) {
- yield [
- relatedSourceScript,
- this.get(virtualCode, relatedSourceScript),
- ];
- }
- }
- }
- },
- },
- linkedCodeMaps: {
- get(virtualCode) {
- const sourceScript = virtualCodeToSourceScriptMap.get(virtualCode);
- let mapCache = virtualCodeToLinkedCodeMap.get(virtualCode.snapshot);
- if (mapCache?.[0] !== sourceScript.snapshot) {
- virtualCodeToLinkedCodeMap.set(virtualCode.snapshot, mapCache = [
- sourceScript.snapshot,
- virtualCode.linkedCodeMappings
- ? new linkedCodeMap_1.LinkedCodeMap(virtualCode.linkedCodeMappings)
- : undefined,
- ]);
- }
- return mapCache[1];
- },
- },
- };
- return language;
- function triggerTargetsDirty(sourceScript) {
- sourceScript.targetIds.forEach(id => {
- const sourceScript = scriptRegistry.get(id);
- if (sourceScript) {
- sourceScript.isAssociationDirty = true;
- onAssociationDirty?.(sourceScript.id);
- }
- });
- }
- function prepareCreateVirtualCode(sourceScript) {
- for (const id of sourceScript.associatedIds) {
- scriptRegistry.get(id)?.targetIds.delete(sourceScript.id);
- }
- sourceScript.associatedIds.clear();
- sourceScript.isAssociationDirty = false;
- return {
- getAssociatedScript(id) {
- sync(id, true, true);
- const relatedSourceScript = scriptRegistry.get(id);
- if (relatedSourceScript) {
- relatedSourceScript.targetIds.add(sourceScript.id);
- sourceScript.associatedIds.add(relatedSourceScript.id);
- }
- return relatedSourceScript;
- },
- };
- }
- }
- function* forEachEmbeddedCode(virtualCode) {
- yield virtualCode;
- if (virtualCode.embeddedCodes) {
- for (const embeddedCode of virtualCode.embeddedCodes) {
- yield* forEachEmbeddedCode(embeddedCode);
- }
- }
- }
- //# sourceMappingURL=index.js.map
|