diff --git a/app/packages/language-model-transformation/src/generatedModelTransformationPlugin.ts b/app/packages/language-model-transformation/src/generatedModelTransformationPlugin.ts index 5d69041c..206ff7f4 100644 --- a/app/packages/language-model-transformation/src/generatedModelTransformationPlugin.ts +++ b/app/packages/language-model-transformation/src/generatedModelTransformationPlugin.ts @@ -30,42 +30,50 @@ class EmptyExternalReferenceCollector implements ExternalReferenceCollector { /** * Plugin for generated model transformations (.mt_gen). + * + * @param languageJsUrl The HTTP URL of this plugin's `language.js` entry file, used + * to bind the GED worker so the metadata manager can attempt a smart old-to-new ID + * remapping after a textual edit, instead of always falling back to naive ID matching. */ -const generatedModelTransformationPlugin: LangiumLanguagePlugin = { - rootRule: GeneratedModelTransformationRule, - additionalTerminals: [], - module: { - references: { - ExternalReferenceCollector: () => new EmptyExternalReferenceCollector() - }, - action: { - ActionHandlerRegistry: (services) => { - const registry = new ActionHandlerRegistry(); - registry.register( - "save-as-model-transformation", - new SaveGeneratedModelTransformationActionHandler(services.shared) - ); - return registry; +function createGeneratedModelTransformationPlugin( + languageJsUrl?: string +): LangiumLanguagePlugin { + return { + rootRule: GeneratedModelTransformationRule, + additionalTerminals: [], + module: { + references: { + ExternalReferenceCollector: () => new EmptyExternalReferenceCollector() + }, + action: { + ActionHandlerRegistry: (services) => { + const registry = new ActionHandlerRegistry(); + registry.register( + "save-as-model-transformation", + new SaveGeneratedModelTransformationActionHandler(services.shared) + ); + return registry; + }, + ActionProvider: () => new GeneratedModelTransformationActionProvider() }, - ActionProvider: () => new GeneratedModelTransformationActionProvider() + workspace: { + WorkspaceEdit: (services) => new DefaultWorkspaceEditService(services) + } }, - workspace: { - WorkspaceEdit: (services) => new DefaultWorkspaceEditService(services) + postCreate(services) { + services.shared.glsp.serverModule.configureDiagramModule( + new GeneratedModelTransformationDiagramModule(services, languageJsUrl) + ); } - }, - postCreate(services) { - services.shared.glsp.serverModule.configureDiagramModule( - new GeneratedModelTransformationDiagramModule(services) - ); - } -}; + }; +} /** * Provider for the generated model transformation language plugin. */ export const generatedModelTransformationPluginProvider: LangiumLanguagePluginProvider = { - create(): LangiumLanguagePlugin { - return generatedModelTransformationPlugin; + create(_contributionPlugins, languageJsUrl): LangiumLanguagePlugin { + return createGeneratedModelTransformationPlugin(languageJsUrl); } }; diff --git a/app/packages/language-model/src/generatedModelPlugin.ts b/app/packages/language-model/src/generatedModelPlugin.ts index d5dd6b1b..a49ed62e 100644 --- a/app/packages/language-model/src/generatedModelPlugin.ts +++ b/app/packages/language-model/src/generatedModelPlugin.ts @@ -32,36 +32,44 @@ class EmptyExternalReferenceCollector implements ExternalReferenceCollector { * The plugin for the Generated Model language. * Provides minimal language server functionality for .m_gen files. * The language treats the entire file content as JSON, captured in a single string field. + * + * @param languageJsUrl The HTTP URL of this plugin's `language.js` entry file, used + * to bind the GED worker so the metadata manager can attempt a smart old-to-new ID + * remapping after a textual edit, instead of always falling back to naive ID matching. */ -const generatedModelPlugin: LangiumLanguagePlugin = { - rootRule: GeneratedModelRule, - additionalTerminals: [], - module: { - references: { - ExternalReferenceCollector: () => new EmptyExternalReferenceCollector() - }, - action: { - ActionHandlerRegistry: (services) => { - const registry = new ActionHandlerRegistry(); - registry.register("save-as-model", new SaveGeneratedModelActionHandler(services.shared)); - return registry; +function createGeneratedModelPlugin(languageJsUrl?: string): LangiumLanguagePlugin { + return { + rootRule: GeneratedModelRule, + additionalTerminals: [], + module: { + references: { + ExternalReferenceCollector: () => new EmptyExternalReferenceCollector() + }, + action: { + ActionHandlerRegistry: (services) => { + const registry = new ActionHandlerRegistry(); + registry.register("save-as-model", new SaveGeneratedModelActionHandler(services.shared)); + return registry; + }, + ActionProvider: () => new GeneratedModelActionProvider() }, - ActionProvider: () => new GeneratedModelActionProvider() + workspace: { + WorkspaceEdit: (services) => new DefaultWorkspaceEditService(services) + } }, - workspace: { - WorkspaceEdit: (services) => new DefaultWorkspaceEditService(services) + postCreate(services) { + services.shared.glsp.serverModule.configureDiagramModule( + new GeneratedModelDiagramModule(services, languageJsUrl) + ); } - }, - postCreate(services) { - services.shared.glsp.serverModule.configureDiagramModule(new GeneratedModelDiagramModule(services)); - } -}; + }; +} /** * Provider for the Generated Model language plugin. */ export const generatedModelPluginProvider: LangiumLanguagePluginProvider = { - create(): LangiumLanguagePlugin { - return generatedModelPlugin; + create(_contributionPlugins, languageJsUrl): LangiumLanguagePlugin { + return createGeneratedModelPlugin(languageJsUrl); } }; diff --git a/infra/docker/workbench/Dockerfile b/infra/docker/workbench/Dockerfile index d3b04c2d..e2d0d794 100644 --- a/infra/docker/workbench/Dockerfile +++ b/infra/docker/workbench/Dockerfile @@ -5,6 +5,7 @@ WORKDIR /build COPY app/ ./ RUN npm ci +ENV NODE_OPTIONS="--max-old-space-size=6144" RUN npm run build # Workbench runtime (nginx)