From 9e302a54b122e5333d24472df2652e34d184bc01 Mon Sep 17 00:00:00 2001 From: Sascha Lisson Date: Thu, 23 Jan 2025 16:27:06 +0100 Subject: [PATCH] feat(mps-model-adapters): support for MPS 2020.3 --- .github/workflows/mps-compatibility.yaml | 2 ++ .../src/main/kotlin/org/modelix/CopyMps.kt | 13 ++++++------ bulk-model-sync-lib/mps-test/build.gradle.kts | 6 ++++++ .../RecreateProjectFromModelServerTest.kt | 11 +++++----- gradle/libs.versions.toml | 1 + mps-model-adapters-plugin/build.gradle.kts | 6 ++++++ .../model/mpsadapters/ReplaceNodeTest.kt | 9 ++++---- .../testdata/SimpleProject/.mps/modules.xml | 2 +- mps-model-adapters/build.gradle.kts | 1 + .../model/mpsadapters/MPSContextProject.kt | 8 ------- .../model/mpsadapters/MPSModuleAsNode.kt | 21 ++++++++----------- .../mpsadapters/MPSProjectModuleAsNode.kt | 3 ++- .../model/mpsadapters/MPSRepositoryAsNode.kt | 15 +++++++------ .../model/mpsadapters/MPSWritableNode.kt | 3 ++- .../model/mpsadapters/SolutionProducer.kt | 14 ------------- 15 files changed, 54 insertions(+), 61 deletions(-) delete mode 100644 mps-model-adapters/src/main/kotlin/org/modelix/model/mpsadapters/MPSContextProject.kt diff --git a/.github/workflows/mps-compatibility.yaml b/.github/workflows/mps-compatibility.yaml index d9440112c8..3f06e5d7f9 100644 --- a/.github/workflows/mps-compatibility.yaml +++ b/.github/workflows/mps-compatibility.yaml @@ -17,6 +17,7 @@ jobs: strategy: matrix: version: + - "2020.3" - "2021.1" - "2021.2" - "2021.3" @@ -42,6 +43,7 @@ jobs: run: >- ./gradlew --build-cache :bulk-model-sync-mps:build + :bulk-model-sync-lib:mps-test:build :metamodel-export:build :mps-model-adapters:build :mps-model-adapters-plugin:build diff --git a/build-logic/src/main/kotlin/org/modelix/CopyMps.kt b/build-logic/src/main/kotlin/org/modelix/CopyMps.kt index 3bcfa91d46..0ccd224649 100644 --- a/build-logic/src/main/kotlin/org/modelix/CopyMps.kt +++ b/build-logic/src/main/kotlin/org/modelix/CopyMps.kt @@ -8,7 +8,7 @@ import java.io.File import java.util.zip.ZipInputStream val Project.mpsMajorVersion: String get() { - if (project != rootProject) return rootProject.mpsVersion + if (project != rootProject) return rootProject.mpsMajorVersion return project.findProperty("mps.version.major")?.toString()?.takeIf { it.isNotEmpty() } ?: project.findProperty("mps.version")?.toString()?.takeIf { it.isNotEmpty() }?.replace(Regex("""(20\d\d\.\d+).*"""), "$1") ?: "2021.1" @@ -25,11 +25,12 @@ val Project.mpsVersion: String get() { "2021.1" to "2021.1.4", "2021.2" to "2021.2.6", "2021.3" to "2021.3.5", - "2022.2" to "2022.2.3", - "2022.3" to "2022.3.1", - "2023.2" to "2023.2", - "2023.3" to "2023.3", - "2024.1" to "2024.1-EAP1", + "2022.2" to "2022.2.4", + "2022.3" to "2022.3.3", + "2023.2" to "2023.2.2", + "2023.3" to "2023.3.2", + "2024.1" to "2024.1.1", + "2024.3" to "2024.3", )[it], ) { "Unknown MPS version: $it" } } diff --git a/bulk-model-sync-lib/mps-test/build.gradle.kts b/bulk-model-sync-lib/mps-test/build.gradle.kts index b0e39f1092..702b36a2b3 100644 --- a/bulk-model-sync-lib/mps-test/build.gradle.kts +++ b/bulk-model-sync-lib/mps-test/build.gradle.kts @@ -1,4 +1,5 @@ import org.modelix.copyMps +import org.modelix.mpsMajorVersion plugins { `modelix-kotlin-jvm` @@ -20,6 +21,7 @@ dependencies { testImplementation(libs.kotlin.serialization.json) testImplementation(libs.xmlunit.matchers) testImplementation(libs.jimfs) + testImplementation(libs.modelix.mpsApi) } intellij { @@ -34,4 +36,8 @@ tasks { buildSearchableOptions { enabled = false } + + test { + onlyIf { mpsMajorVersion != "2020.3" } // incompatible with the intellij plugin + } } diff --git a/bulk-model-sync-lib/mps-test/src/test/kotlin/org/modelix/model/sync/bulk/lib/test/RecreateProjectFromModelServerTest.kt b/bulk-model-sync-lib/mps-test/src/test/kotlin/org/modelix/model/sync/bulk/lib/test/RecreateProjectFromModelServerTest.kt index 6aa00cc172..4f144fff2e 100644 --- a/bulk-model-sync-lib/mps-test/src/test/kotlin/org/modelix/model/sync/bulk/lib/test/RecreateProjectFromModelServerTest.kt +++ b/bulk-model-sync-lib/mps-test/src/test/kotlin/org/modelix/model/sync/bulk/lib/test/RecreateProjectFromModelServerTest.kt @@ -9,6 +9,7 @@ import com.intellij.openapi.project.ex.ProjectManagerEx import com.intellij.openapi.util.Disposer import com.intellij.testFramework.TestApplicationManager import com.intellij.testFramework.UsefulTestCase +import com.intellij.util.io.delete import jetbrains.mps.ide.ThreadUtils import jetbrains.mps.ide.project.ProjectHelper import jetbrains.mps.project.AbstractModule @@ -16,7 +17,6 @@ import jetbrains.mps.project.MPSProject import jetbrains.mps.smodel.Language import jetbrains.mps.smodel.MPSModuleRepository import org.jetbrains.mps.openapi.model.EditableSModel -import org.jetbrains.mps.openapi.model.SaveOptions import org.modelix.model.api.PBranch import org.modelix.model.api.getRootNode import org.modelix.model.client.IdGenerator @@ -25,13 +25,13 @@ import org.modelix.model.data.asData import org.modelix.model.lazy.CLTree import org.modelix.model.lazy.CLVersion import org.modelix.model.lazy.ObjectStoreCache -import org.modelix.model.mpsadapters.MPSContextProject import org.modelix.model.mpsadapters.asReadableNode import org.modelix.model.mpsadapters.asWritableNode import org.modelix.model.persistent.MapBaseStore import org.modelix.model.sync.bulk.ModelSynchronizer import org.modelix.model.sync.bulk.NodeAssociationFromModelServer import org.modelix.model.sync.bulk.NodeAssociationToModelServer +import org.modelix.mps.api.ModelixMpsApi import org.modelix.mps.model.sync.bulk.MPSProjectSyncFilter import org.w3c.dom.Element import java.io.File @@ -39,7 +39,6 @@ import java.nio.file.Files import java.nio.file.Path import kotlin.io.path.ExperimentalPathApi import kotlin.io.path.absolute -import kotlin.io.path.deleteRecursively class RecreateProjectFromModelServerTest : UsefulTestCase() { @@ -114,7 +113,7 @@ class RecreateProjectFromModelServerTest : UsefulTestCase() { targetRoot = mpsRoot, nodeAssociation = NodeAssociationFromModelServer(branch, mpsRoot.getModel()), ) - MPSContextProject.contextValue.computeWith(mpsProject) { + ModelixMpsApi.runWithProject(mpsProject) { modelSynchronizer.synchronize() } } @@ -145,7 +144,7 @@ class RecreateProjectFromModelServerTest : UsefulTestCase() { val projectDirParent = Path.of("build", "test-projects").absolute() projectDirParent.toFile().mkdirs() val projectDir = Files.createTempDirectory(projectDirParent, "mps-project") - projectDir.deleteRecursively() + projectDir.delete(recursively = true) projectDir.toFile().mkdirs() projectDir.toFile().deleteOnExit() val options = OpenProjectTask().withProjectName("test-project") @@ -223,7 +222,7 @@ private fun Project.captureFileContents(): Map { module as AbstractModule module.save() for (model in module.models.filterIsInstance()) { - model.save(SaveOptions.FORCE) + ModelixMpsApi.forceSave(model) } } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a6aebe8f0c..c1f0a636dd 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -126,6 +126,7 @@ dokka-base = { group = "org.jetbrains.dokka", name = "dokka-base", version.ref=" modelix-buildtools-gradle = { group = "org.modelix.mps", name = "build-tools-gradle", version.ref = "modelixBuildtools"} modelix-buildtools-lib = { group = "org.modelix.mps", name = "build-tools-lib", version.ref = "modelixBuildtools"} +modelix-mpsApi = { group = "org.modelix.mps", name = "stable-api", version = "1.1.0" } micrometer-registry-prometheus = { group = "io.micrometer", name = "micrometer-registry-prometheus", version.ref = "micrometer"} diff --git a/mps-model-adapters-plugin/build.gradle.kts b/mps-model-adapters-plugin/build.gradle.kts index 6ddc0474f9..e79b142f48 100644 --- a/mps-model-adapters-plugin/build.gradle.kts +++ b/mps-model-adapters-plugin/build.gradle.kts @@ -1,4 +1,5 @@ import org.modelix.copyMps +import org.modelix.mpsMajorVersion plugins { `modelix-kotlin-jvm` @@ -14,6 +15,7 @@ dependencies { exclude(group = "org.jetbrains.kotlinx", module = "kotlinx-coroutines-core") exclude(group = "org.jetbrains.kotlinx", module = "kotlinx-coroutines-jdk8") } + testImplementation(kotlin("test")) } intellij { @@ -35,6 +37,10 @@ tasks { autoReloadPlugins.set(true) } + test { + onlyIf { mpsMajorVersion != "2020.3" } // incompatible with the intellij plugin + } + val mpsPluginDir = project.findProperty("mps.plugins.dir")?.toString()?.let { file(it) } if (mpsPluginDir != null && mpsPluginDir.isDirectory) { create("installMpsPlugin") { diff --git a/mps-model-adapters-plugin/src/test/kotlin/org/modelix/model/mpsadapters/ReplaceNodeTest.kt b/mps-model-adapters-plugin/src/test/kotlin/org/modelix/model/mpsadapters/ReplaceNodeTest.kt index 62ab3da329..364d62e8e5 100644 --- a/mps-model-adapters-plugin/src/test/kotlin/org/modelix/model/mpsadapters/ReplaceNodeTest.kt +++ b/mps-model-adapters-plugin/src/test/kotlin/org/modelix/model/mpsadapters/ReplaceNodeTest.kt @@ -6,6 +6,7 @@ import org.modelix.model.api.BuiltinLanguages import org.modelix.model.api.ConceptReference import org.modelix.model.api.INode import org.modelix.model.api.IReplaceableNode +import kotlin.test.assertFailsWith class ReplaceNodeTest : MpsAdaptersTestBase("SimpleProject") { @@ -86,23 +87,23 @@ class ReplaceNodeTest : MpsAdaptersTestBase("SimpleProject") { assertEquals(newConcept, newNode.getConceptReference()) } - fun `test fail to replace node with null concept`() = runCommandOnEDT { + fun `test fail to replace node with null concept`(): Unit = runCommandOnEDT { val rootNode = getRootUnderTest() val nodeToReplace = rootNode.allChildren.first() as IReplaceableNode val expectedMessage = "Cannot replace node `method1` with a null concept. Explicitly specify a concept (e.g., `BaseConcept`)." - assertThrows(IllegalArgumentException::class.java, expectedMessage) { + assertFailsWith(IllegalArgumentException::class, expectedMessage) { nodeToReplace.replaceNode(null) } } - fun `test fail to replace node with non mps concept`() = runCommandOnEDT { + fun `test fail to replace node with non mps concept`(): Unit = runCommandOnEDT { val rootNode = getRootUnderTest() val nodeToReplace = rootNode.allChildren.first() as IReplaceableNode val newConcept = ConceptReference("notMpsConcept") val expectedMessage = "Concept UID `notMpsConcept` cannot be parsed as MPS concept." - assertThrows(IllegalArgumentException::class.java, expectedMessage) { + assertFailsWith(IllegalArgumentException::class, expectedMessage) { nodeToReplace.replaceNode(newConcept) } } diff --git a/mps-model-adapters-plugin/testdata/SimpleProject/.mps/modules.xml b/mps-model-adapters-plugin/testdata/SimpleProject/.mps/modules.xml index d24dfe0659..6b0fa619c3 100644 --- a/mps-model-adapters-plugin/testdata/SimpleProject/.mps/modules.xml +++ b/mps-model-adapters-plugin/testdata/SimpleProject/.mps/modules.xml @@ -2,7 +2,7 @@ - + diff --git a/mps-model-adapters/build.gradle.kts b/mps-model-adapters/build.gradle.kts index cb966e9403..9fda7e8f86 100644 --- a/mps-model-adapters/build.gradle.kts +++ b/mps-model-adapters/build.gradle.kts @@ -18,6 +18,7 @@ dependencies { implementation(libs.trove4j) implementation(kotlin("stdlib")) implementation(libs.kotlin.logging) + implementation(libs.modelix.mpsApi) } group = "org.modelix.mps" diff --git a/mps-model-adapters/src/main/kotlin/org/modelix/model/mpsadapters/MPSContextProject.kt b/mps-model-adapters/src/main/kotlin/org/modelix/model/mpsadapters/MPSContextProject.kt deleted file mode 100644 index 06012d01d9..0000000000 --- a/mps-model-adapters/src/main/kotlin/org/modelix/model/mpsadapters/MPSContextProject.kt +++ /dev/null @@ -1,8 +0,0 @@ -package org.modelix.model.mpsadapters - -import jetbrains.mps.project.MPSProject -import org.modelix.kotlin.utils.ContextValue - -object MPSContextProject { - val contextValue = ContextValue() -} diff --git a/mps-model-adapters/src/main/kotlin/org/modelix/model/mpsadapters/MPSModuleAsNode.kt b/mps-model-adapters/src/main/kotlin/org/modelix/model/mpsadapters/MPSModuleAsNode.kt index 179f76c3da..32e1f5ac2a 100644 --- a/mps-model-adapters/src/main/kotlin/org/modelix/model/mpsadapters/MPSModuleAsNode.kt +++ b/mps-model-adapters/src/main/kotlin/org/modelix/model/mpsadapters/MPSModuleAsNode.kt @@ -3,9 +3,8 @@ package org.modelix.model.mpsadapters import jetbrains.mps.persistence.MementoImpl import jetbrains.mps.project.AbstractModule import jetbrains.mps.project.DevKit +import jetbrains.mps.project.MPSProject import jetbrains.mps.project.ModuleId -import jetbrains.mps.project.ProjectBase -import jetbrains.mps.project.ProjectManager import jetbrains.mps.project.Solution import jetbrains.mps.project.facets.JavaModuleFacet import jetbrains.mps.smodel.Generator @@ -30,6 +29,7 @@ import org.modelix.model.api.IReadableNode import org.modelix.model.api.IReferenceLinkReference import org.modelix.model.api.IWritableNode import org.modelix.model.data.asData +import org.modelix.mps.api.ModelixMpsApi import java.util.UUID fun MPSModuleAsNode(module: SModule) = MPSModuleAsNode.create(module) @@ -55,16 +55,11 @@ abstract class MPSModuleAsNode : MPSGenericNodeAdapter() { }, BuiltinLanguages.jetbrains_mps_lang_core.BaseConcept.virtualPackage.toReference() to object : IPropertyAccessor { override fun read(element: SModule): String? { - return ProjectManager.getInstance().openedProjects.asSequence() - .filterIsInstance() - .mapNotNull { it.getPath(element) } - .firstOrNull() - ?.virtualFolder - ?.takeIf { it.isNotEmpty() } + return ModelixMpsApi.getVirtualFolder(element) } override fun write(element: SModule, value: String?) { - MPSContextProject.contextValue.getValue().setVirtualFolder(element, value ?: "") + ModelixMpsApi.setVirtualFolder(element, value) } }, BuiltinLanguages.MPSRepositoryConcepts.Module.id.toReference() to object : IPropertyAccessor { @@ -318,7 +313,7 @@ data class MPSLanguageAsNode(override val module: Language) : MPSModuleAsNode Iterable.withoutDescriptorModel(): List { private fun SModule.getCompileInMPS(): Boolean { val module = this - if (module is DevKit || module !is AbstractModule) { + if (module !is Solution) { return false } - return module.moduleDescriptor?.compileInMPS ?: false + @Suppress("removal") + return module.moduleDescriptor.compileInMPS } diff --git a/mps-model-adapters/src/main/kotlin/org/modelix/model/mpsadapters/MPSProjectModuleAsNode.kt b/mps-model-adapters/src/main/kotlin/org/modelix/model/mpsadapters/MPSProjectModuleAsNode.kt index 5f298cb4af..12d4e51c02 100644 --- a/mps-model-adapters/src/main/kotlin/org/modelix/model/mpsadapters/MPSProjectModuleAsNode.kt +++ b/mps-model-adapters/src/main/kotlin/org/modelix/model/mpsadapters/MPSProjectModuleAsNode.kt @@ -10,6 +10,7 @@ import org.modelix.model.api.INodeReference import org.modelix.model.api.IProperty import org.modelix.model.api.IReferenceLink import org.modelix.model.area.IArea +import org.modelix.mps.api.ModelixMpsApi data class MPSProjectModuleAsNode(val project: ProjectBase, val module: SModule) : IDefaultNodeAdapter { @@ -39,7 +40,7 @@ data class MPSProjectModuleAsNode(val project: ProjectBase, val module: SModule) override fun getPropertyValue(property: IProperty): String? { return if (property.conformsTo(BuiltinLanguages.MPSRepositoryConcepts.ProjectModule.virtualFolder)) { - project.getPath(module)?.virtualFolder + ModelixMpsApi.getVirtualFolders(module).firstOrNull() } else { null } diff --git a/mps-model-adapters/src/main/kotlin/org/modelix/model/mpsadapters/MPSRepositoryAsNode.kt b/mps-model-adapters/src/main/kotlin/org/modelix/model/mpsadapters/MPSRepositoryAsNode.kt index 68d3177fa3..9874d4de97 100644 --- a/mps-model-adapters/src/main/kotlin/org/modelix/model/mpsadapters/MPSRepositoryAsNode.kt +++ b/mps-model-adapters/src/main/kotlin/org/modelix/model/mpsadapters/MPSRepositoryAsNode.kt @@ -1,8 +1,8 @@ package org.modelix.model.mpsadapters +import jetbrains.mps.project.MPSProject import jetbrains.mps.project.ModuleId import jetbrains.mps.project.ProjectBase -import jetbrains.mps.project.ProjectManager import jetbrains.mps.smodel.Generator import jetbrains.mps.smodel.tempmodel.TempModule import jetbrains.mps.smodel.tempmodel.TempModule2 @@ -18,6 +18,7 @@ import org.modelix.model.api.IReadableNode import org.modelix.model.api.IReferenceLinkReference import org.modelix.model.api.IWritableNode import org.modelix.model.api.NullChildLinkReference +import org.modelix.mps.api.ModelixMpsApi fun SRepository.asLegacyNode(): INode = MPSRepositoryAsNode(this).asLegacyNode() fun SRepository.asWritableNode(): IWritableNode = MPSRepositoryAsNode(this) @@ -41,19 +42,19 @@ data class MPSRepositoryAsNode(@get:JvmName("getRepository_") val repository: SR ): IWritableNode { return when (sourceNode.getConceptReference()) { BuiltinLanguages.MPSRepositoryConcepts.Solution.getReference() -> { - SolutionProducer(MPSContextProject.contextValue.getValue()).create( + SolutionProducer(ModelixMpsApi.getMPSProject() as MPSProject).create( sourceNode.getNode().getPropertyValue(BuiltinLanguages.jetbrains_mps_lang_core.INamedConcept.name.toReference())!!, sourceNode.getNode().getPropertyValue(BuiltinLanguages.MPSRepositoryConcepts.Module.id.toReference())!!.let { ModuleId.fromString(it) }, ).let { MPSModuleAsNode(it) } } BuiltinLanguages.MPSRepositoryConcepts.Language.getReference() -> { - LanguageProducer(MPSContextProject.contextValue.getValue()).create( + LanguageProducer(ModelixMpsApi.getMPSProject() as MPSProject).create( sourceNode.getNode().getPropertyValue(BuiltinLanguages.jetbrains_mps_lang_core.INamedConcept.name.toReference())!!, sourceNode.getNode().getPropertyValue(BuiltinLanguages.MPSRepositoryConcepts.Module.id.toReference())!!.let { ModuleId.fromString(it) }, ).let { MPSModuleAsNode(it) } } BuiltinLanguages.MPSRepositoryConcepts.DevKit.getReference() -> { - DevkitProducer(MPSContextProject.contextValue.getValue()).create( + DevkitProducer(ModelixMpsApi.getMPSProject() as MPSProject).create( sourceNode.getNode().getPropertyValue(BuiltinLanguages.jetbrains_mps_lang_core.INamedConcept.name.toReference())!!, sourceNode.getNode().getPropertyValue(BuiltinLanguages.MPSRepositoryConcepts.Module.id.toReference())!!.let { ModuleId.fromString(it) }, ).let { MPSModuleAsNode(it) } @@ -69,10 +70,8 @@ data class MPSRepositoryAsNode(@get:JvmName("getRepository_") val repository: SR }, BuiltinLanguages.MPSRepositoryConcepts.Repository.projects.toReference() to object : IChildAccessor { override fun read(element: SRepository): List { - return ProjectManager.getInstance().openedProjects - .filterIsInstance() - .plus(listOfNotNull(MPSContextProject.contextValue.getValueOrNull())) - .map { MPSProjectAsNode(it).asWritableNode() } + return ModelixMpsApi.getMPSProjects() + .map { MPSProjectAsNode(it as ProjectBase).asWritableNode() } } }, ) diff --git a/mps-model-adapters/src/main/kotlin/org/modelix/model/mpsadapters/MPSWritableNode.kt b/mps-model-adapters/src/main/kotlin/org/modelix/model/mpsadapters/MPSWritableNode.kt index b098963ffd..baeafe6efe 100644 --- a/mps-model-adapters/src/main/kotlin/org/modelix/model/mpsadapters/MPSWritableNode.kt +++ b/mps-model-adapters/src/main/kotlin/org/modelix/model/mpsadapters/MPSWritableNode.kt @@ -23,6 +23,7 @@ import org.modelix.model.api.ISyncTargetNode import org.modelix.model.api.IWritableNode import org.modelix.model.api.NewNodeSpec import org.modelix.model.api.meta.NullConcept +import org.modelix.mps.api.ModelixMpsApi data class MPSWritableNode(val node: SNode) : IWritableNode, ISyncTargetNode { override fun getModel(): IMutableModel { @@ -97,7 +98,7 @@ data class MPSWritableNode(val node: SNode) : IWritableNode, ISyncTargetNode { } node.properties.forEach { newNode.setProperty(it, node.getProperty(it)) } - node.references.forEach { newNode.setReference(it.link, it.targetNodeReference) } + node.references.forEach { ModelixMpsApi.setReference(newNode, it.link, it.targetNodeReference) } node.children.forEach { child -> val link = checkNotNull(child.containmentLink) { "Containment link of child node not found" } node.removeChild(child) diff --git a/mps-model-adapters/src/main/kotlin/org/modelix/model/mpsadapters/SolutionProducer.kt b/mps-model-adapters/src/main/kotlin/org/modelix/model/mpsadapters/SolutionProducer.kt index c81f8e5460..2d6ed17150 100644 --- a/mps-model-adapters/src/main/kotlin/org/modelix/model/mpsadapters/SolutionProducer.kt +++ b/mps-model-adapters/src/main/kotlin/org/modelix/model/mpsadapters/SolutionProducer.kt @@ -14,8 +14,6 @@ import jetbrains.mps.project.structure.modules.SolutionDescriptor import jetbrains.mps.smodel.GeneralModuleFactory import jetbrains.mps.smodel.Generator import jetbrains.mps.smodel.Language -import jetbrains.mps.smodel.ModuleDependencyVersions -import jetbrains.mps.smodel.language.LanguageRegistry import jetbrains.mps.vfs.IFile class SolutionProducer(private val myProject: MPSProject) { @@ -32,10 +30,6 @@ class SolutionProducer(private val myProject: MPSProject) { val descriptor: SolutionDescriptor = createSolutionDescriptor(namespace, id, descriptorFile) val module = GeneralModuleFactory().instantiate(descriptor, descriptorFile) as Solution myProject.addModule(module) - ModuleDependencyVersions( - myProject.getComponent(LanguageRegistry::class.java), - myProject.repository, - ).update(module) module.save() return module } @@ -72,10 +66,6 @@ class LanguageProducer(private val myProject: MPSProject) { val descriptor = createDescriptor(namespace, id, descriptorFile) val module = GeneralModuleFactory().instantiate(descriptor, descriptorFile) as Language myProject.addModule(module) - ModuleDependencyVersions( - myProject.getComponent(LanguageRegistry::class.java), - myProject.repository, - ).update(module) module.save() return module } @@ -147,10 +137,6 @@ class DevkitProducer(private val myProject: MPSProject) { val descriptor = createDescriptor(namespace, id, descriptorFile) val module = GeneralModuleFactory().instantiate(descriptor, descriptorFile) as DevKit myProject.addModule(module) - ModuleDependencyVersions( - myProject.getComponent(LanguageRegistry::class.java), - myProject.repository, - ).update(module) module.save() return module }