From 414a9ff26842571a1b55ad24eafc95be0b2fa4a8 Mon Sep 17 00:00:00 2001 From: Sascha Lisson Date: Tue, 11 Feb 2025 09:01:47 +0100 Subject: [PATCH] ci: compile with all MPS versions The previously added docker integration tests are necessary, but not a replacement for compiling against different MPS versions. The tests don't have a 100 % coverage and the static analysis of the compiler is still useful. Most breaking changes in the API can be detected without executing the code. --- .github/workflows/mps-compatibility.yaml | 43 +++++++++++++++++++ mps-legacy-sync-plugin/build.gradle.kts | 1 + .../mpsplugin/plugin/ModelImportExport.kt | 8 ++-- .../projectview/CloudProjectViewExtension.kt | 25 +++++------ .../modelix/mps/sync/mps/ModelRenameHelper.kt | 3 +- 5 files changed, 60 insertions(+), 20 deletions(-) create mode 100644 .github/workflows/mps-compatibility.yaml diff --git a/.github/workflows/mps-compatibility.yaml b/.github/workflows/mps-compatibility.yaml new file mode 100644 index 00000000..3592aa22 --- /dev/null +++ b/.github/workflows/mps-compatibility.yaml @@ -0,0 +1,43 @@ +name: MPS compatibility + +on: + push: + branches: + - 'main' + pull_request: {} + # allow manual execution just in case + workflow_dispatch: + +jobs: + assemble-mps-components: + runs-on: ubuntu-latest + timeout-minutes: 30 + strategy: + fail-fast: false + matrix: + version: +# - "2020.3" + - "2021.1" + - "2021.2" + - "2021.3" + - "2022.2" + - "2022.3" + - "2023.2" + - "2024.1" +# - "2024.3" + steps: + - uses: actions/checkout@v4 + - name: Set up JDK + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '21' + - name: Set up Gradle + uses: gradle/gradle-build-action@v3 + - name: Assemble with ${{ matrix.version }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: >- + ./gradlew --build-cache + assemble + -Pmps.version.major=${{ matrix.version }} diff --git a/mps-legacy-sync-plugin/build.gradle.kts b/mps-legacy-sync-plugin/build.gradle.kts index e29a72b3..517b3fd9 100644 --- a/mps-legacy-sync-plugin/build.gradle.kts +++ b/mps-legacy-sync-plugin/build.gradle.kts @@ -62,6 +62,7 @@ dependencies { implementation(coreLibs.kotlin.reflect) implementation(coreLibs.ktor.server.resources) + implementation(libs.modelix.mpsApi) // There is a usage of MakeActionParameters in ProjectMakeRunner which we might want to delete compileOnly(mpsHomeDir.map { it.files("plugins/mps-make/languages/jetbrains.mps.ide.make.jar") }) diff --git a/mps-legacy-sync-plugin/src/main/java/org/modelix/model/mpsplugin/plugin/ModelImportExport.kt b/mps-legacy-sync-plugin/src/main/java/org/modelix/model/mpsplugin/plugin/ModelImportExport.kt index bb3b9ca1..e00f0674 100644 --- a/mps-legacy-sync-plugin/src/main/java/org/modelix/model/mpsplugin/plugin/ModelImportExport.kt +++ b/mps-legacy-sync-plugin/src/main/java/org/modelix/model/mpsplugin/plugin/ModelImportExport.kt @@ -12,7 +12,6 @@ import jetbrains.mps.internal.collections.runtime.Sequence import jetbrains.mps.messages.IMessage import jetbrains.mps.project.MPSProject import jetbrains.mps.project.Project -import jetbrains.mps.project.StandaloneMPSProject import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory import org.apache.log4j.Level import org.apache.log4j.LogManager @@ -31,6 +30,7 @@ import org.modelix.model.mpsplugin.ModelServerConnection import org.modelix.model.mpsplugin.ModelServerConnections import org.modelix.model.mpsplugin.ProjectBinding import org.modelix.model.mpsplugin.SyncDirection +import org.modelix.mps.api.ModelixMpsApi import java.io.BufferedReader import java.io.InputStreamReader import java.io.PrintWriter @@ -39,6 +39,7 @@ import java.net.Socket import java.util.function.Consumer /*Generated by MPS */ +@Suppress("UnstableApiUsage", "removal") class ModelImportExport { fun cloud2mps() { val exportPath = PropertyOrEnv.get(ModelixExportConfiguration.PATH) @@ -149,10 +150,7 @@ class ModelImportExport { ), ).where(object : IWhereFilter() { override fun accept(it: SModule): Boolean { - val virtualFolder = - (mpsProject as StandaloneMPSProject).getFolderFor( - it, - ) + val virtualFolder = ModelixMpsApi.getVirtualFolder(mpsProject, it) println("Modelix Application Plugin - Considering module: " + it.moduleName + " virtual folder: " + virtualFolder + ", make is currently: " + make) return Sequence.fromIterable( Sequence.fromArray( diff --git a/mps-legacy-sync-plugin/src/main/java/org/modelix/model/mpsplugin/projectview/CloudProjectViewExtension.kt b/mps-legacy-sync-plugin/src/main/java/org/modelix/model/mpsplugin/projectview/CloudProjectViewExtension.kt index b2e1ddb4..623a3cb2 100644 --- a/mps-legacy-sync-plugin/src/main/java/org/modelix/model/mpsplugin/projectview/CloudProjectViewExtension.kt +++ b/mps-legacy-sync-plugin/src/main/java/org/modelix/model/mpsplugin/projectview/CloudProjectViewExtension.kt @@ -1,3 +1,5 @@ +@file:Suppress("removal", "UnstableApiUsage") + package org.modelix.model.mpsplugin.projectview import com.intellij.openapi.application.ApplicationManager @@ -6,8 +8,6 @@ import jetbrains.mps.baseLanguage.closures.runtime.Wrappers._T import jetbrains.mps.baseLanguage.closures.runtime._FunctionTypes._void_P1_E0 import jetbrains.mps.ide.project.ProjectHelper import jetbrains.mps.ide.projectPane.ProjectPane -import jetbrains.mps.ide.projectPane.logicalview.ProjectTree -import jetbrains.mps.ide.ui.tree.MPSTreeNode import jetbrains.mps.ide.ui.tree.TextTreeNode import jetbrains.mps.internal.collections.runtime.ISelector import jetbrains.mps.internal.collections.runtime.IVisitor @@ -35,10 +35,12 @@ import java.awt.event.ActionEvent import java.awt.event.ActionListener import java.util.concurrent.atomic.AtomicBoolean import javax.swing.Icon +import javax.swing.JTree import javax.swing.Timer import javax.swing.event.TreeModelEvent import javax.swing.event.TreeModelListener import javax.swing.tree.DefaultTreeModel +import javax.swing.tree.MutableTreeNode import javax.swing.tree.TreeNode import kotlin.math.min @@ -127,8 +129,8 @@ class CloudProjectViewExtension(private val project: Project?) { } } - private fun waitForProjectTree(callback: _void_P1_E0) { - val tree: ProjectTree? = projectTree + private fun waitForProjectTree(callback: _void_P1_E0) { + val tree = projectTree if (tree != null) { callback.invoke(tree) } else { @@ -137,7 +139,7 @@ class CloudProjectViewExtension(private val project: Project?) { 1000, object : ActionListener { override fun actionPerformed(e: ActionEvent) { - val tree: ProjectTree? = projectTree + val tree = projectTree if (tree != null) { callback.invoke(tree) timer.value!!.stop() @@ -153,7 +155,7 @@ class CloudProjectViewExtension(private val project: Project?) { } } - private val projectTree: ProjectTree? + private val projectTree: JTree? private get() { if (project!!.isDisposed) { return null @@ -184,10 +186,8 @@ class CloudProjectViewExtension(private val project: Project?) { val projectPane: ProjectPane = ProjectPane.getInstance( project, ) - val root: MPSTreeNode? = projectPane.tree.rootNode - if (root == null) { - return - } + val root = projectPane.tree.model.root ?: return + root as MutableTreeNode val model: DefaultTreeModel? = TreeModelUtil.getModel(projectPane.tree) // wrong parent @@ -238,10 +238,7 @@ class CloudProjectViewExtension(private val project: Project?) { } fun updateModules() { - val root: MPSTreeNode? = projectTree?.rootNode - if (root == null) { - return - } + val root = projectTree?.model?.root ?: return val treeModel: DefaultTreeModel? = TreeModelUtil.getModel(projectTree) project!!.repository.modelAccess.runReadAction(object : Runnable { override fun run() { diff --git a/mps-sync-plugin-lib/src/main/kotlin/org/modelix/mps/sync/mps/ModelRenameHelper.kt b/mps-sync-plugin-lib/src/main/kotlin/org/modelix/mps/sync/mps/ModelRenameHelper.kt index b4fc2b67..2b9e41a7 100644 --- a/mps-sync-plugin-lib/src/main/kotlin/org/modelix/mps/sync/mps/ModelRenameHelper.kt +++ b/mps-sync-plugin-lib/src/main/kotlin/org/modelix/mps/sync/mps/ModelRenameHelper.kt @@ -73,7 +73,8 @@ class ModelRenameHelper(private val model: EditableSModelBase, private val mpsPr while (var4.hasNext()) { val sm: SModel = var4.next() as SModel if (!sm.isReadOnly) { - if (sm is EditableSModelBase && sm.updateExternalReferences(mpsProject.repository)) { + if (sm is EditableSModelBase) { + sm.updateExternalReferences(mpsProject.repository) sm.isChanged = true } }