diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 081a09bf..4318f326 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -31,7 +31,7 @@ jobs: - name: Build env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: ./gradlew build -PciBuild=true -Pgpr.token=${{ secrets.GITHUB_TOKEN }} -Pmps.version.major=2023.3 + run: ./gradlew build -PciBuild=true -Pgpr.token=${{ secrets.GITHUB_TOKEN }} -Pmps.version.major=2025.2 - name: Upload artifact uses: actions/upload-pages-artifact@v4 with: diff --git a/.github/workflows/mps-compatibility.yaml b/.github/workflows/mps-compatibility.yaml index 40b322f6..2669269b 100644 --- a/.github/workflows/mps-compatibility.yaml +++ b/.github/workflows/mps-compatibility.yaml @@ -16,9 +16,9 @@ jobs: matrix: version: # also adjust the compatibility version range of the MPS plugin - - "2023.2" - - "2023.3" -# - "2024.1" + - "2024.3" + - "2025.1" + - "2025.2" steps: - uses: actions/checkout@v5 # - uses: actions/setup-node@v3 diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index bf9c7b92..5a61ec50 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -41,4 +41,4 @@ jobs: -Pgpr.key=${{ secrets.GITHUB_TOKEN }} -Pgpr.token=${{ secrets.GITHUB_TOKEN }} -Pgpr.universalkey=${{ secrets.GHP_UNIVERSAL_PUBLISH_TOKEN }} - -Pmps.version.major=2023.3 + -Pmps.version.major=2025.2 diff --git a/README.md b/README.md index 9e23ea04..e01af824 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ See also https://www.jetbrains.com/help/idea/directories-used-by-the-ide-to-stor You may have to create the plugins folder if it doesn't exist yet. -Currently, these MPS versions are supported: 2023.2, 2023.3 +Currently, these MPS versions are supported: 2025.2 # Usage diff --git a/build.gradle.kts b/build.gradle.kts index 652e8caa..1ea618a8 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,4 +1,4 @@ -import org.jetbrains.intellij.tasks.BuildPluginTask +import org.jetbrains.intellij.platform.gradle.tasks.BuildPluginTask import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jetbrains.kotlin.gradle.plugin.KotlinMultiplatformPluginWrapper @@ -21,7 +21,7 @@ plugins { id("com.dorongold.task-tree") version "4.0.1" alias(libs.plugins.kotlin.multiplatform) apply false alias(libs.plugins.kotlin.serialization) apply false - id("org.jetbrains.intellij") version "1.17.4" apply false + alias(libs.plugins.intellij2) apply false alias(libs.plugins.npm.publish) apply false } @@ -116,7 +116,7 @@ subprojects { plugins.withType { extensions.configure { - jvmToolchain(17) + jvmToolchain(21) sourceSets.all { if (!name.lowercase().contains("test")) { languageSettings { @@ -129,7 +129,7 @@ subprojects { plugins.withType { extensions.configure { - jvmToolchain(17) + jvmToolchain(21) sourceSets.all { if (!name.lowercase().contains("test")) { languageSettings { @@ -151,7 +151,7 @@ rootProject.plugins.withType(org.jetbrains.kotlin.gradle.targets.js.yarn.YarnPlu copyMps() // make all 'packJsPackage' tasks depend on all 'kotlinNodeJsSetup' tasks, because gradle complained about this being missing -tasks.register("setupNodeEverywhere") { +tasks.register("setupNodeEverywhere") { dependsOn(":kernelf-apigen:kotlinNodeJsSetup") dependsOn(":kernelf-editor:kotlinNodeJsSetup") dependsOn(":parser:kotlinNodeJsSetup") diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 80bf5350..b42f081d 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -4,6 +4,7 @@ plugins { dependencies { implementation(kotlin("stdlib")) + implementation("com.google.code.gson:gson:2.13.2") } repositories { diff --git a/buildSrc/src/main/kotlin/org/modelix/CopyMps.kt b/buildSrc/src/main/kotlin/org/modelix/CopyMps.kt index 24ecb435..1fdf2414 100644 --- a/buildSrc/src/main/kotlin/org/modelix/CopyMps.kt +++ b/buildSrc/src/main/kotlin/org/modelix/CopyMps.kt @@ -16,6 +16,8 @@ package org.modelix +import com.google.gson.JsonArray +import com.google.gson.JsonParser import org.gradle.api.Project import org.gradle.api.artifacts.ModuleDependency import org.gradle.api.file.Directory @@ -24,12 +26,13 @@ import org.gradle.kotlin.dsl.dependencies import org.gradle.kotlin.dsl.exclude import java.io.File import java.util.zip.ZipInputStream +import java.util.zip.ZipOutputStream val Project.mpsMajorVersion: String get() { 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") - ?: "2023.2" + ?: "2025.2" } val Project.mpsVersion: String get() { @@ -47,7 +50,10 @@ val Project.mpsVersion: String get() { "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.1" to "2024.1.5", + "2024.3" to "2024.3.2", + "2025.1" to "2025.1.1", + "2025.2" to "2025.2.1", )[it], ) { "Unknown MPS version: $it" } } @@ -136,6 +142,48 @@ fun Project.copyMps(): File { buildTxt.writeText("$prefix$buildNumber") } + // fix product-info.json + val productInfoFile = mpsHomeDir.get().asFile.resolve("product-info.json") + val productInfo = productInfoFile.takeIf { it.exists() }?.reader()?.use { reader -> + JsonParser.parseReader(reader) + }?.asJsonObject + if (productInfo != null) { + if (!productInfo.has("bundledPlugins")) productInfo.add("bundledPlugins", JsonArray()) + if (!productInfo.has("modules")) productInfo.add("modules", JsonArray()) + if (!productInfo.has("layout")) productInfo.add("layout", JsonArray()) + + val currentOS = org.gradle.internal.os.OperatingSystem.current() + val currentOSString = when { + currentOS.isMacOsX -> "macOS" + currentOS.isWindows -> "Windows" + else -> "Linux" + } + val launches = productInfo.getAsJsonArray("launch").asList() + if (!launches.any { it.asJsonObject.get("os").asString == currentOSString && it.asJsonObject.get("arch").asString == System.getProperty("os.arch") }) { + launches.add( + launches.first().deepCopy().also { + it.asJsonObject.addProperty("os", currentOSString) + it.asJsonObject.addProperty("arch", System.getProperty("os.arch")) + } + ) + } + + productInfoFile.writeText(productInfo.toString()) + } + + // add missing module-descriptors.jar + val moduleDescriptorsFile = mpsHomeDir.get().asFile.resolve("modules").resolve("module-descriptors.jar") + if (!moduleDescriptorsFile.exists()) { + moduleDescriptorsFile.parentFile.mkdirs() + moduleDescriptorsFile.outputStream().use { fos -> + ZipOutputStream(fos).use {} + } + } + + // fix bin/mps64.vmoptions + val vmOptionsFile = mpsHome.resolve("bin").resolve("mps64.vmoptions") + vmOptionsFile.writeText(vmOptionsFile.readLines().filterNot { it.trim().startsWith("#") }.joinToString("\n")) + println("Extracting MPS done.") return mpsHome } diff --git a/editor-common-mps/build.gradle.kts b/editor-common-mps/build.gradle.kts index 994ac194..e38d0ee4 100644 --- a/editor-common-mps/build.gradle.kts +++ b/editor-common-mps/build.gradle.kts @@ -1,4 +1,4 @@ -import org.jetbrains.intellij.tasks.PrepareSandboxTask +import org.jetbrains.intellij.platform.gradle.tasks.PrepareSandboxTask import org.jetbrains.kotlin.gradle.dsl.KotlinVersion import org.modelix.buildtools.KnownModuleIds import org.modelix.buildtools.buildStubsSolutionJar @@ -8,11 +8,17 @@ import org.modelix.mpsPluginsDir plugins { kotlin("jvm") - id("org.jetbrains.intellij") + alias(libs.plugins.intellij2) } kotlin { - jvmToolchain(17) + jvmToolchain(21) +} + +repositories { + intellijPlatform { + defaultRepositories() + } } dependencies { @@ -32,13 +38,23 @@ dependencies { api(libs.modelix.mps.model.adapters, excludeMPSLibraries) api(libs.modelix.model.api.gen.runtime, excludeMPSLibraries) api(project(":reverse-mpsadapters"), excludeMPSLibraries) + + intellijPlatform { + local(mpsHomeDir) + } } -// Configure Gradle IntelliJ Plugin -// Read more: https://plugins.jetbrains.com/docs/intellij/tools-gradle-intellij-plugin.html -intellij { - localPath = mpsHomeDir.map { it.asFile.absolutePath } +intellijPlatform { instrumentCode = false + buildSearchableOptions = false + pluginConfiguration { + id = "org.modelix.mps.editor.common" + name = "Shared Libraries for Other Modelix Plugins" +// ideaVersion { +// sinceBuild = "$mpsPlatformVersion" +// untilBuild = "$mpsPlatformVersion.*" +// } + } } kotlin { @@ -49,45 +65,32 @@ kotlin { } tasks { - patchPluginXml { - sinceBuild.set("232") - untilBuild.set("233.*") - } - - buildSearchableOptions { - enabled = false - } - - runIde { - autoReloadPlugins.set(true) - } - val pluginDir = mpsPluginsDir if (pluginDir != null) { val installMpsPlugin = register("installMpsPlugin") { dependsOn(prepareSandbox) - from(project.layout.buildDirectory.dir("idea-sandbox/plugins/${project.name}")) + from(prepareSandbox.map { it.pluginDirectory.get() }) into(pluginDir.resolve(project.name)) } - register("installMpsDevPlugins") { + register("installMpsDevPlugins") { dependsOn(installMpsPlugin) } } withType(PrepareSandboxTask::class.java) { - intoChild(pluginName.map { "$it/META-INF" }) + rootSpec.addChild().into(pluginName.map { "$it/META-INF" }) .from(project.layout.projectDirectory.file("src/main/resources/META-INF")) .exclude("plugin.xml") - intoChild(pluginName.map { "$it/META-INF" }) - .from(patchPluginXml.flatMap { it.outputFiles }) + rootSpec.addChild().into(pluginName.map { "$it/META-INF" }) + .from(patchPluginXml.flatMap { it.outputFile }) doLast { val ownJar: File = pluginJar.get().asFile - val runtimeJars = configurations.getByName(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME).resolvedConfiguration.files + ownJar + val runtimeJars = configurations.getByName(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME).incoming.files + ownJar buildStubsSolutionJar { solutionName("org.modelix.mps.editor.common.stubs") solutionId("208eaf68-fd3a-497a-a4b6-4923ff457c3b") - outputFolder(defaultDestinationDir.get().resolve(project.name).resolve("languages")) + outputFolder(defaultDestinationDirectory.get().asFile.resolve(project.name).resolve("languages")) runtimeJars.forEach { javaJar(it.name) // kotlinJar(it.name) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5468377c..e1131c32 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,11 +7,15 @@ modelix-mps-buildtools = { id = "org.modelix.mps.build-tools", version.ref = "mo kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } +intellij1 = { id = "org.jetbrains.intellij", version = "1.17.4" } +intellij2 = { id = "org.jetbrains.intellij.platform", version.ref = "intellijGradle" } +intellij2-migration = { id = "org.jetbrains.intellij.platform.migration", version.ref = "intellijGradle" } [versions] -modelixCore = "16.3.0" +modelixCore = "16.4.0" modelixBuildtools="2.0.1" kotlin = "2.2.21" +intellijGradle = "2.10.2" [libraries] modelix-model-api = { group = "org.modelix", name = "model-api", version.ref = "modelixCore" } @@ -27,3 +31,5 @@ modelix-build-tools-lib = { group = "org.modelix.mps", name = "build-tools-lib", kotlin-logging = { group = "io.github.oshai", name = "kotlin-logging", version = "7.0.13" } slf4j-api = { group = "org.slf4j", name = "slf4j-api", version = "2.0.17" } kotlin-collections-immutable = { group = "org.jetbrains.kotlinx", name = "kotlinx-collections-immutable", version = "0.4.0" } +mps = { group = "com.jetbrains", name = "mps", version = "2025.2.1" } + diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 9bbc975c..1b33c55b 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index d4081da4..a35649f5 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-all.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index faf93008..23d15a93 100755 --- a/gradlew +++ b/gradlew @@ -114,7 +114,7 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar +CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -213,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index 9d21a218..db3a6ac2 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -70,11 +70,11 @@ goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar +set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/interpreter-vm/build.gradle.kts b/interpreter-vm/build.gradle.kts index f1026fd7..155b9e4c 100644 --- a/interpreter-vm/build.gradle.kts +++ b/interpreter-vm/build.gradle.kts @@ -4,7 +4,7 @@ plugins { } kotlin { - jvmToolchain(17) + jvmToolchain(21) jvm() js(IR) { browser {} diff --git a/kernelf-editor/build.gradle.kts b/kernelf-editor/build.gradle.kts index 3bc3f597..bb33d31b 100644 --- a/kernelf-editor/build.gradle.kts +++ b/kernelf-editor/build.gradle.kts @@ -20,7 +20,7 @@ val generatorOutputDir = file("src/commonMain/kotlin_gen") val tsGeneratorOutputDir = file("../kernelf-angular-demo/src/gen") kotlin { - jvmToolchain(17) + jvmToolchain(21) jvm() js(IR) { browser { @@ -153,7 +153,7 @@ tasks.named("packJsPackage") { val productionLibraryByKotlinOutputDirectory = layout.buildDirectory.dir("compileSync/js/main/productionLibrary/kotlin") val preparedProductionLibraryOutputDirectory = layout.buildDirectory.dir("npmPublication") -val patchTypesScriptInProductionLibrary = tasks.register("patchTypesScriptInProductionLibrary") { +val patchTypesScriptInProductionLibrary = tasks.register("patchTypesScriptInProductionLibrary") { dependsOn("compileProductionLibraryKotlinJs") inputs.dir(productionLibraryByKotlinOutputDirectory) outputs.dir(preparedProductionLibraryOutputDirectory) diff --git a/kernelf-ssr-demo/build.gradle.kts b/kernelf-ssr-demo/build.gradle.kts index a6608ff0..e0fc777e 100644 --- a/kernelf-ssr-demo/build.gradle.kts +++ b/kernelf-ssr-demo/build.gradle.kts @@ -23,5 +23,5 @@ application { } kotlin { - jvmToolchain(17) + jvmToolchain(21) } diff --git a/mps-image-editor-server/build.gradle.kts b/mps-image-editor-server/build.gradle.kts index e5081a8d..431a459f 100644 --- a/mps-image-editor-server/build.gradle.kts +++ b/mps-image-editor-server/build.gradle.kts @@ -1,4 +1,4 @@ -import org.jetbrains.intellij.tasks.PrepareSandboxTask +import org.jetbrains.intellij.platform.gradle.tasks.PrepareSandboxTask import org.jetbrains.kotlin.gradle.dsl.KotlinVersion import org.modelix.excludeMPSLibraries import org.modelix.mpsHomeDir @@ -6,11 +6,17 @@ import org.modelix.mpsPluginsDir plugins { kotlin("jvm") - id("org.jetbrains.intellij") + alias(libs.plugins.intellij2) +} + +repositories { + intellijPlatform { + defaultRepositories() + } } kotlin { - jvmToolchain(17) + jvmToolchain(21) compilerOptions { apiVersion = KotlinVersion.KOTLIN_1_8 } @@ -20,62 +26,49 @@ dependencies { compileOnly(kotlin("stdlib")) compileOnly(project(":editor-common-mps")) implementation(libs.slf4j.api, excludeMPSLibraries) + intellijPlatform { + local(mpsHomeDir) + localPlugin(project(":editor-common-mps")) + } + compileOnly( + fileTree(mpsHomeDir).matching { + include("lib/*.jar") + }, + ) } -// Configure Gradle IntelliJ Plugin -// Read more: https://plugins.jetbrains.com/docs/intellij/tools-gradle-intellij-plugin.html -intellij { - localPath = mpsHomeDir.map { it.asFile.absolutePath } +intellijPlatform { instrumentCode = false - plugins.set(listOf(project(":editor-common-mps"))) + buildSearchableOptions = false + pluginConfiguration { + id = "org.modelix.mps.editor.image" + name = "Image Based Web Editor for MPS" + } } tasks { - patchPluginXml { - sinceBuild.set("232") - untilBuild.set("233.*") - } - - buildSearchableOptions { - enabled = false - } - -// signPlugin { -// certificateChain.set(System.getenv("CERTIFICATE_CHAIN")) -// privateKey.set(System.getenv("PRIVATE_KEY")) -// password.set(System.getenv("PRIVATE_KEY_PASSWORD")) -// } -// -// publishPlugin { -// token.set(System.getenv("PUBLISH_TOKEN")) -// } - - runIde { - autoReloadPlugins.set(true) - } - val pluginDir = mpsPluginsDir if (pluginDir != null) { val installMpsPlugin = register("installMpsPlugin") { dependsOn(prepareSandbox) - from(project.layout.buildDirectory.dir("idea-sandbox/plugins/${project.name}")) + from(prepareSandbox.map { it.pluginDirectory.get() }) into(pluginDir.resolve(project.name)) } - register("installMpsDevPlugins") { + register("installMpsDevPlugins") { dependsOn(installMpsPlugin) } } withType(PrepareSandboxTask::class.java) { - intoChild(pluginName.map { "$it/META-INF" }) + rootSpec.addChild().into(pluginName.map { "$it/META-INF" }) .from(project.layout.projectDirectory.file("src/main/resources/META-INF")) .exclude("plugin.xml") - intoChild(pluginName.map { "$it/META-INF" }) - .from(patchPluginXml.flatMap { it.outputFiles }) + rootSpec.addChild().into(pluginName.map { "$it/META-INF" }) + .from(patchPluginXml.flatMap { it.outputFile }) doLast { - val jarsInBasePlugin = defaultDestinationDir.get().resolve(project(":editor-common-mps").name).resolve("lib").list()?.toHashSet() ?: emptySet() - defaultDestinationDir.get().resolve(project.name).resolve("lib").listFiles()?.forEach { + val jarsInBasePlugin = defaultDestinationDirectory.get().asFile.resolve(project(":editor-common-mps").name).resolve("lib").list()?.toHashSet() ?: emptySet() + defaultDestinationDirectory.get().asFile.resolve(project.name).resolve("lib").listFiles()?.forEach { if (jarsInBasePlugin.contains(it.name)) it.delete() } } diff --git a/mps-image-editor-server/src/main/kotlin/svg/plugin/RenderSession.kt b/mps-image-editor-server/src/main/kotlin/svg/plugin/RenderSession.kt index 442caf98..82177b14 100644 --- a/mps-image-editor-server/src/main/kotlin/svg/plugin/RenderSession.kt +++ b/mps-image-editor-server/src/main/kotlin/svg/plugin/RenderSession.kt @@ -1,11 +1,9 @@ package svg.plugin -/*Generated by MPS */ - import com.intellij.ide.ProhibitAWTEvents import com.intellij.openapi.actionSystem.ActionPlaces +import com.intellij.openapi.actionSystem.ActionUiKind import com.intellij.openapi.actionSystem.AnActionEvent -import com.intellij.openapi.actionSystem.AnActionResult import com.intellij.openapi.actionSystem.DataContext import com.intellij.openapi.actionSystem.ex.ActionManagerEx import com.intellij.openapi.actionSystem.ex.ActionUtil @@ -13,6 +11,7 @@ import com.intellij.openapi.application.EDT import com.intellij.openapi.application.TransactionGuard import com.intellij.openapi.application.TransactionGuardImpl import com.intellij.openapi.keymap.KeymapManager +import com.intellij.openapi.util.SystemInfo import io.ktor.server.websocket.DefaultWebSocketServerSession import io.ktor.websocket.send import jetbrains.mps.intentions.IntentionsManager @@ -28,7 +27,6 @@ import jetbrains.mps.openapi.editor.update.UpdaterListenerAdapter import jetbrains.mps.openapi.intentions.IntentionExecutable import jetbrains.mps.project.Project import jetbrains.mps.util.Pair -import jetbrains.mps.util.SystemInfo import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.cancel @@ -70,6 +68,7 @@ import kotlin.math.roundToInt private val LOG = io.github.oshai.kotlinlogging.KotlinLogging.logger { } +@Suppress("UnstableApiUsage") class RenderSession @JvmOverloads constructor( private val project: Project, private val websocketSession: DefaultWebSocketServerSession, @@ -564,7 +563,7 @@ class RenderSession @JvmOverloads constructor( for (actionId in actionIds) { val action = actionManager.getAction(actionId) ?: continue val actionEvent = - AnActionEvent.createFromAnAction(action, keyEvent, ActionPlaces.MAIN_MENU, dataContext) + AnActionEvent.createEvent(action, dataContext, null, ActionPlaces.MAIN_MENU, ActionUiKind.NONE, keyEvent) ProhibitAWTEvents.start("update").use { token -> (TransactionGuard.getInstance() as TransactionGuardImpl).performUserActivity { @Suppress("removal") @@ -580,14 +579,7 @@ class RenderSession @JvmOverloads constructor( continue } - actionManager.fireBeforeActionPerformed(action, actionEvent) - (TransactionGuard.getInstance() as TransactionGuardImpl).performUserActivity { -// AuthorOverride.AUTHOR.runWith( -// user, -// Runnable { action.actionPerformed(actionEvent) }) - action.actionPerformed(actionEvent) - } - actionManager.fireAfterActionPerformed(action, actionEvent, AnActionResult.PERFORMED) + actionManager.performWithActionCallbacks(action, actionEvent) {} keyEvent.consume() LOG.debug { "processed by " + actionEvent.presentation.text } break diff --git a/mps/build.gradle.kts b/mps/build.gradle.kts index b5029547..f378c86a 100644 --- a/mps/build.gradle.kts +++ b/mps/build.gradle.kts @@ -1,5 +1,6 @@ import org.gradle.internal.jvm.Jvm import org.modelix.mpsHomeDir +import org.modelix.mpsVersion plugins { base @@ -17,9 +18,9 @@ mpsBuild { javaHome = Jvm.current().javaHome disableParentPublication() - search("../editor-common-mps/build/idea-sandbox/plugins/editor-common-mps") - search("../projectional-editor-ssr-mps/build/idea-sandbox/plugins/projectional-editor-ssr-mps") - search("../react-ssr-mps/build/idea-sandbox/plugins/react-ssr-mps") + search("../editor-common-mps/build/idea-sandbox/MPS-${project.mpsVersion}/plugins/editor-common-mps") + search("../projectional-editor-ssr-mps/build/idea-sandbox/MPS-${project.mpsVersion}/plugins/projectional-editor-ssr-mps") + search("../react-ssr-mps/build/idea-sandbox/MPS-${project.mpsVersion}/plugins/react-ssr-mps") search("modules") publication("editor-languages") { module("org.modelix.mps.webaspect.devkit") @@ -40,9 +41,9 @@ mpsBuild { tasks.all { if (name in setOf("assembleMpsModules")) { inputs.dir(project.layout.projectDirectory.dir("modules")) - inputs.dir(project(":editor-common-mps").layout.buildDirectory.dir("idea-sandbox/plugins/editor-common-mps")) - inputs.dir(project(":projectional-editor-ssr-mps").layout.buildDirectory.dir("idea-sandbox/plugins/projectional-editor-ssr-mps")) - inputs.dir(project(":react-ssr-mps").layout.buildDirectory.dir("idea-sandbox/plugins/react-ssr-mps")) + inputs.dir(project(":editor-common-mps").layout.buildDirectory.dir("idea-sandbox/MPS-${project.mpsVersion}/plugins/editor-common-mps")) + inputs.dir(project(":projectional-editor-ssr-mps").layout.buildDirectory.dir("idea-sandbox/MPS-${project.mpsVersion}/plugins/projectional-editor-ssr-mps")) + inputs.dir(project(":react-ssr-mps").layout.buildDirectory.dir("idea-sandbox/MPS-${project.mpsVersion}/plugins/react-ssr-mps")) } if (name == "assembleMpsModules") { outputs.dir(project.layout.buildDirectory.dir("mpsbuild/packaged-modules")) diff --git a/parser/build.gradle.kts b/parser/build.gradle.kts index dc0968f4..3122ce45 100644 --- a/parser/build.gradle.kts +++ b/parser/build.gradle.kts @@ -5,7 +5,7 @@ plugins { } kotlin { - jvmToolchain(17) + jvmToolchain(21) jvm() js(IR) { browser {} diff --git a/projectional-editor-ssr-common/build.gradle.kts b/projectional-editor-ssr-common/build.gradle.kts index 05b5d32d..ac032e2a 100644 --- a/projectional-editor-ssr-common/build.gradle.kts +++ b/projectional-editor-ssr-common/build.gradle.kts @@ -5,7 +5,7 @@ plugins { } kotlin { - jvmToolchain(17) + jvmToolchain(21) jvm() js(IR) { browser {} diff --git a/projectional-editor-ssr-mps-languages/build.gradle.kts b/projectional-editor-ssr-mps-languages/build.gradle.kts index b2b47a4f..608e8366 100644 --- a/projectional-editor-ssr-mps-languages/build.gradle.kts +++ b/projectional-editor-ssr-mps-languages/build.gradle.kts @@ -1,128 +1,81 @@ -import org.jetbrains.kotlin.gradle.dsl.KotlinVersion +import org.jetbrains.intellij.platform.gradle.TestFrameworkType +import org.jetbrains.intellij.platform.gradle.tasks.PrepareSandboxTask import org.modelix.excludeMPSLibraries import org.modelix.mpsHomeDir import org.modelix.mpsPluginsDir plugins { kotlin("jvm") - id("org.jetbrains.intellij") + alias(libs.plugins.intellij2) } -kotlin { - jvmToolchain(17) - compilerOptions { - apiVersion = KotlinVersion.KOTLIN_1_8 +repositories { + intellijPlatform { + defaultRepositories() } } +kotlin { + jvmToolchain(21) +// compilerOptions { +// apiVersion = KotlinVersion.KOTLIN_1_8 +// } +} + dependencies { testImplementation(project(":projectional-editor-ssr-mps"), excludeMPSLibraries) testImplementation(project(":projectional-editor"), excludeMPSLibraries) testImplementation(libs.modelix.mps.model.adapters, excludeMPSLibraries) + intellijPlatform { + local(mpsHomeDir) +// bundledPlugin("jetbrains.mps.core") +// bundledPlugin("jetbrains.mps.kotlin") + localPlugin(project(":editor-common-mps")) + localPlugin(project(":projectional-editor-ssr-mps")) + testFramework(TestFrameworkType.Bundled) + } + compileOnly( + fileTree(mpsHomeDir).matching { + include("lib/*.jar") + }, + ) + testCompileOnly( + fileTree(mpsHomeDir).matching { + include("lib/*.jar") + }, + ) } -intellij { - localPath = mpsHomeDir.map { it.asFile.absolutePath } +intellijPlatform { instrumentCode = false - plugins = listOf( - project(":projectional-editor-ssr-mps"), - project(":editor-common-mps"), - ) + listOf( -// "Git4Idea", -// "Subversion", -// "com.intellij.copyright", -// "com.intellij.laf.macos", -// "com.intellij.platform.images", -// "com.intellij.properties", -// "com.intellij.properties.bundle.editor", -// "com.intellij.tasks", -// "com.jetbrains.changeReminder", -// "jetbrains.jetpad", -// "jetbrains.mps.build", -// "jetbrains.mps.build.ui", -// "jetbrains.mps.console", - "jetbrains.mps.core", -// "jetbrains.mps.debugger.api", -// "jetbrains.mps.debugger.java", -// "jetbrains.mps.editor.contextActions", -// "jetbrains.mps.editor.diagram", -// "jetbrains.mps.editor.spellcheck", -// "jetbrains.mps.editor.tooltips", -// "jetbrains.mps.execution.api", -// "jetbrains.mps.execution.configurations", -// "jetbrains.mps.execution.languages", -// "jetbrains.mps.git4idea.stubs", -// "jetbrains.mps.ide", -// "jetbrains.mps.ide.devkit", -// "jetbrains.mps.ide.httpsupport", -// "jetbrains.mps.ide.java", -// "jetbrains.mps.ide.make", -// "jetbrains.mps.ide.memtool", -// "jetbrains.mps.ide.migration.workbench", -// "jetbrains.mps.ide.modelchecker", -// "jetbrains.mps.ide.mpsmigration", - "jetbrains.mps.kotlin", -// "jetbrains.mps.navbar", -// "jetbrains.mps.rcp", -// "jetbrains.mps.samples", -// "jetbrains.mps.testing", -// "jetbrains.mps.tool.make", -// "jetbrains.mps.trove", -// "jetbrains.mps.vcs", -// "org.intellij.plugins.markdown", -// "org.jetbrains.plugins.github", -// "org.jetbrains.settingsRepository", - -// "com.intellij", -// "com.jetbrains.sh", -// "org.jetbrains.plugins.terminal", - ) + buildSearchableOptions = false + pluginConfiguration { + id = "org.modelix.mps.editor.languages" + name = "Notation Language for the Modelix Web Editor" + } } tasks { - patchPluginXml { - sinceBuild.set("232") - untilBuild.set("233.*") - } - - buildSearchableOptions { - enabled = false - } - -// signPlugin { -// certificateChain.set(System.getenv("CERTIFICATE_CHAIN")) -// privateKey.set(System.getenv("PRIVATE_KEY")) -// password.set(System.getenv("PRIVATE_KEY_PASSWORD")) -// } -// -// publishPlugin { -// token.set(System.getenv("PUBLISH_TOKEN")) -// } - - runIde { - autoReloadPlugins.set(true) - } - val pluginDir = mpsPluginsDir if (pluginDir != null) { register("installMpsPlugin") { dependsOn(prepareSandbox) - from(project.layout.buildDirectory.dir("idea-sandbox/plugins/${project.name}")) + from(prepareSandbox.map { it.pluginDirectory.get() }) into(pluginDir.resolve(project.name)) } } - withType().configureEach { + withType().configureEach { dependsOn(project(":mps").tasks.named("packageMpsPublications")) - intoChild(pluginName.map { "$it/META-INF" }) + rootSpec.addChild().into(pluginName.map { "$it/META-INF" }) .from(project.layout.projectDirectory.file("src/main/resources/META-INF")) .exclude("plugin.xml") - intoChild(pluginName.map { "$it/META-INF" }) - .from(patchPluginXml.flatMap { it.outputFiles }) + rootSpec.addChild().into(pluginName.map { "$it/META-INF" }) + .from(patchPluginXml.flatMap { it.outputFile }) listOf("editor-languages", "baseLanguage-notation", "react").forEach { publicationName -> - intoChild(pluginName.map { "$it/languages" }) + rootSpec.addChild().into(pluginName.map { "$it/languages" }) .from(zipTree({ project(":mps").layout.buildDirectory.file("mpsbuild/publications/$publicationName.zip") })) .eachFile { path = path.replaceFirst("packaged-modules/", "") diff --git a/projectional-editor-ssr-mps-languages/src/test/kotlin/org/modelix/editor/ssr/mps/TestFrameworkSetupTest.kt b/projectional-editor-ssr-mps-languages/src/test/kotlin/org/modelix/editor/ssr/mps/TestFrameworkSetupTest.kt index 05251c41..e65a769d 100644 --- a/projectional-editor-ssr-mps-languages/src/test/kotlin/org/modelix/editor/ssr/mps/TestFrameworkSetupTest.kt +++ b/projectional-editor-ssr-mps-languages/src/test/kotlin/org/modelix/editor/ssr/mps/TestFrameworkSetupTest.kt @@ -2,7 +2,7 @@ package org.modelix.editor.ssr.mps import com.intellij.ide.plugins.PluginManager import jetbrains.mps.classloading.ModuleClassLoader -import jetbrains.mps.module.ReloadableModuleBase +import jetbrains.mps.module.ReloadableModule /** * Check that the environment is initialized properly and all plugins and modules are loaded properly. @@ -28,7 +28,7 @@ class TestFrameworkSetupTest : TestBase("SimpleProject") { fun `test module is valid for classloading`() { readAction { - val module = mpsProject.repository.modules.filterIsInstance().first { it.moduleName == "org.modelix.mps.notation.impl.baseLanguage" } + val module = mpsProject.repository.modules.filterIsInstance().first { it.moduleName == "org.modelix.mps.notation.impl.baseLanguage" } assertInstanceOf(module.classLoader, ModuleClassLoader::class.java) } } diff --git a/projectional-editor-ssr-mps/build.gradle.kts b/projectional-editor-ssr-mps/build.gradle.kts index 53a60e06..e560a7c0 100644 --- a/projectional-editor-ssr-mps/build.gradle.kts +++ b/projectional-editor-ssr-mps/build.gradle.kts @@ -1,4 +1,4 @@ -import org.jetbrains.intellij.tasks.PrepareSandboxTask +import org.jetbrains.intellij.platform.gradle.tasks.PrepareSandboxTask import org.jetbrains.kotlin.gradle.dsl.KotlinVersion import org.modelix.buildtools.KnownModuleIds import org.modelix.buildtools.ModuleId @@ -10,11 +10,17 @@ import org.modelix.mpsPluginsDir plugins { kotlin("jvm") - id("org.jetbrains.intellij") + alias(libs.plugins.intellij2) +} + +repositories { + intellijPlatform { + defaultRepositories() + } } kotlin { - jvmToolchain(17) + jvmToolchain(21) compilerOptions { apiVersion = KotlinVersion.KOTLIN_1_8 } @@ -26,6 +32,15 @@ dependencies { implementation(project(":projectional-editor"), excludeMPSLibraries) implementation(project(":projectional-editor-ssr-server"), excludeMPSLibraries) implementation(libs.slf4j.api, excludeMPSLibraries) + intellijPlatform { + local(mpsHomeDir) + localPlugin(project(":editor-common-mps")) + } + compileOnly( + fileTree(mpsHomeDir).matching { + include("lib/*.jar") + }, + ) } tasks.processResources { @@ -40,59 +55,47 @@ sourceSets { } } -// Configure Gradle IntelliJ Plugin -// Read more: https://plugins.jetbrains.com/docs/intellij/tools-gradle-intellij-plugin.html -intellij { - localPath = mpsHomeDir.map { it.asFile.absolutePath } +intellijPlatform { instrumentCode = false - plugins.set(listOf(project(":editor-common-mps"))) + buildSearchableOptions = false + pluginConfiguration { + id = "org.modelix.mps.editor" + name = "Modelix Projectional Text Editor for MPS" + } } tasks { - patchPluginXml { - sinceBuild.set("232") - untilBuild.set("233.*") - } - - buildSearchableOptions { - enabled = false - } - - runIde { - autoReloadPlugins.set(true) - } - val pluginDir = mpsPluginsDir if (pluginDir != null) { val installMpsPlugin = register("installMpsPlugin") { dependsOn(prepareSandbox) - from(project.layout.buildDirectory.dir("idea-sandbox/plugins/${project.name}")) + from(prepareSandbox.map { it.pluginDirectory.get() }) into(pluginDir.resolve(project.name)) } - register("installMpsDevPlugins") { + register("installMpsDevPlugins") { dependsOn(installMpsPlugin) } } withType(PrepareSandboxTask::class.java) { - intoChild(pluginName.map { "$it/META-INF" }) + rootSpec.addChild().into(pluginName.map { "$it/META-INF" }) .from(project.layout.projectDirectory.file("src/main/resources/META-INF")) .exclude("plugin.xml") - intoChild(pluginName.map { "$it/META-INF" }) - .from(patchPluginXml.flatMap { it.outputFiles }) + rootSpec.addChild().into(pluginName.map { "$it/META-INF" }) + .from(patchPluginXml.flatMap { it.outputFile }) doLast { - val jarsInBasePlugin = defaultDestinationDir.get().resolve(project(":editor-common-mps").name).resolve("lib").list()?.toHashSet() ?: emptySet() - defaultDestinationDir.get().resolve(project.name).resolve("lib").listFiles()?.forEach { + val jarsInBasePlugin = defaultDestinationDirectory.get().asFile.resolve(project(":editor-common-mps").name).resolve("lib").list()?.toHashSet() ?: emptySet() + defaultDestinationDirectory.get().asFile.resolve(project.name).resolve("lib").listFiles()?.forEach { if (jarsInBasePlugin.contains(it.name)) it.delete() } val ownJar: File = pluginJar.get().asFile - val runtimeJars = configurations.getByName(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME).resolvedConfiguration.files + ownJar + val runtimeJars = configurations.getByName(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME).incoming.files + ownJar buildStubsSolutionJar { solutionName("org.modelix.mps.editor.ssr.stubs") solutionId("771cf896-ab1b-409b-93b4-48c3bbb6b23f") - outputFolder(defaultDestinationDir.get().resolve(project.name).resolve("languages")) + outputFolder(defaultDestinationDirectory.get().asFile.resolve(project.name).resolve("languages")) runtimeJars.filterNot { jarsInBasePlugin.contains(it.name) }.forEach { javaJar(it.name) // kotlinJar(it.name) diff --git a/projectional-editor-ssr-server/build.gradle.kts b/projectional-editor-ssr-server/build.gradle.kts index dfa09a73..cb3f91b6 100644 --- a/projectional-editor-ssr-server/build.gradle.kts +++ b/projectional-editor-ssr-server/build.gradle.kts @@ -12,5 +12,5 @@ dependencies { } kotlin { - jvmToolchain(17) + jvmToolchain(21) } diff --git a/projectional-editor/build.gradle.kts b/projectional-editor/build.gradle.kts index b98dd651..30f2af02 100644 --- a/projectional-editor/build.gradle.kts +++ b/projectional-editor/build.gradle.kts @@ -5,7 +5,7 @@ plugins { } kotlin { - jvmToolchain(17) + jvmToolchain(21) jvm() js(IR) { browser {} diff --git a/react-ssr-mps/build.gradle.kts b/react-ssr-mps/build.gradle.kts index 3d98e156..cf338ba7 100644 --- a/react-ssr-mps/build.gradle.kts +++ b/react-ssr-mps/build.gradle.kts @@ -1,4 +1,4 @@ -import org.jetbrains.intellij.tasks.PrepareSandboxTask +import org.jetbrains.intellij.platform.gradle.tasks.PrepareSandboxTask import org.jetbrains.kotlin.gradle.dsl.KotlinVersion import org.modelix.buildtools.KnownModuleIds import org.modelix.buildtools.ModuleId @@ -10,12 +10,18 @@ import org.modelix.mpsPluginsDir plugins { kotlin("jvm") - id("org.jetbrains.intellij") + alias(libs.plugins.intellij2) alias(libs.plugins.modelix.model.api.gen) } kotlin { - jvmToolchain(17) + jvmToolchain(21) +} + +repositories { + intellijPlatform { + defaultRepositories() + } } dependencies { @@ -23,14 +29,27 @@ dependencies { compileOnly(project(":editor-common-mps")) implementation(project(":react-ssr-server"), excludeMPSLibraries) implementation(libs.slf4j.api, excludeMPSLibraries) + intellijPlatform { + local(mpsHomeDir) + localPlugin(project(":editor-common-mps")) + } + compileOnly( + fileTree(mpsHomeDir).matching { + include("lib/*.jar") + }, + ) } -// Configure Gradle IntelliJ Plugin -// Read more: https://plugins.jetbrains.com/docs/intellij/tools-gradle-intellij-plugin.html -intellij { - localPath = mpsHomeDir.map { it.asFile.absolutePath } +intellijPlatform { instrumentCode = false - plugins.set(listOf(project(":editor-common-mps"))) + buildSearchableOptions = false + pluginConfiguration { + name = "org.modelix.mps.react" +// ideaVersion { +// sinceBuild = "$mpsPlatformVersion" +// untilBuild = "$mpsPlatformVersion.*" +// } + } } kotlin { @@ -41,50 +60,37 @@ kotlin { } tasks { - patchPluginXml { - sinceBuild.set("232") - untilBuild.set("233.*") - } - - buildSearchableOptions { - enabled = false - } - - runIde { - autoReloadPlugins.set(true) - } - val pluginDir = mpsPluginsDir if (pluginDir != null) { val installMpsPlugin = register("installMpsPlugin") { dependsOn(prepareSandbox) - from(project.layout.buildDirectory.dir("idea-sandbox/plugins/${project.name}")) + from(prepareSandbox.map { it.pluginDirectory.get() }) into(pluginDir.resolve(project.name)) } - register("installMpsDevPlugins") { + register("installMpsDevPlugins") { dependsOn(installMpsPlugin) } } withType(PrepareSandboxTask::class.java) { - intoChild(pluginName.map { "$it/META-INF" }) + rootSpec.addChild().into(pluginName.map { "$it/META-INF" }) .from(project.layout.projectDirectory.file("src/main/resources/META-INF")) .exclude("plugin.xml") - intoChild(pluginName.map { "$it/META-INF" }) - .from(patchPluginXml.flatMap { it.outputFiles }) + rootSpec.addChild().into(pluginName.map { "$it/META-INF" }) + .from(patchPluginXml.flatMap { it.outputFile }) doLast { - val jarsInBasePlugin = defaultDestinationDir.get().resolve(project(":editor-common-mps").name).resolve("lib").list()?.toHashSet() ?: emptySet() - defaultDestinationDir.get().resolve(project.name).resolve("lib").listFiles()?.forEach { + val jarsInBasePlugin = defaultDestinationDirectory.get().asFile.resolve(project(":editor-common-mps").name).resolve("lib").list()?.toHashSet() ?: emptySet() + defaultDestinationDirectory.get().asFile.resolve(project.name).resolve("lib").listFiles()?.forEach { if (jarsInBasePlugin.contains(it.name)) it.delete() } val ownJar: File = pluginJar.get().asFile - val runtimeJars = configurations.getByName(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME).resolvedConfiguration.files + ownJar + val runtimeJars = configurations.getByName(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME).incoming.files + ownJar buildStubsSolutionJar { solutionName("org.modelix.mps.react.ssr.stubs") solutionId("83a7cbdc-dd9d-4dad-be97-957aa1b07375") - outputFolder(defaultDestinationDir.get().resolve(project.name).resolve("languages")) + outputFolder(defaultDestinationDirectory.get().asFile.resolve(project.name).resolve("languages")) runtimeJars.filterNot { jarsInBasePlugin.contains(it.name) }.forEach { javaJar(it.name) // kotlinJar(it.name) diff --git a/react-ssr-server/build.gradle.kts b/react-ssr-server/build.gradle.kts index 1c10fda8..3b0de64a 100644 --- a/react-ssr-server/build.gradle.kts +++ b/react-ssr-server/build.gradle.kts @@ -15,7 +15,7 @@ dependencies { } kotlin { - jvmToolchain(17) + jvmToolchain(21) } val copyClient = tasks.register("copyClient", Sync::class.java) { diff --git a/reverse-mpsadapters/build.gradle.kts b/reverse-mpsadapters/build.gradle.kts index 174a4a74..b6c4954f 100644 --- a/reverse-mpsadapters/build.gradle.kts +++ b/reverse-mpsadapters/build.gradle.kts @@ -6,7 +6,7 @@ plugins { } kotlin { - jvmToolchain(17) + jvmToolchain(21) compilerOptions { apiVersion = KotlinVersion.KOTLIN_1_8 }