From d6f0a48bea6caac702579262b177a12d222bc728 Mon Sep 17 00:00:00 2001 From: Amir Date: Sun, 15 Nov 2020 16:20:34 +0100 Subject: [PATCH] add language plugins as dependencies --- .../kotlin/de/itemis/mps/gradle/Common.kt | 57 +++++++- .../de/itemis/mps/gradle/generate/Plugin.kt | 11 +- .../de/itemis/mps/gradle/modelcheck/Plugin.kt | 10 +- src/test/kotlin/GenerateModel.kt | 123 ++++++++++++++++++ .../resources/test-project/.mps/modules.xml | 8 ++ .../ZargariSolution/ZargariSolution.msd | 19 +++ .../models/ZargariSolution.java.mps | 22 ++++ src/test/resources/zargari-lang.zip | Bin 0 -> 36909 bytes 8 files changed, 241 insertions(+), 9 deletions(-) create mode 100644 src/test/kotlin/GenerateModel.kt create mode 100644 src/test/resources/test-project/.mps/modules.xml create mode 100644 src/test/resources/test-project/solutions/ZargariSolution/ZargariSolution.msd create mode 100644 src/test/resources/test-project/solutions/ZargariSolution/models/ZargariSolution.java.mps create mode 100644 src/test/resources/zargari-lang.zip diff --git a/src/main/kotlin/de/itemis/mps/gradle/Common.kt b/src/main/kotlin/de/itemis/mps/gradle/Common.kt index 6cecb983..a06022df 100644 --- a/src/main/kotlin/de/itemis/mps/gradle/Common.kt +++ b/src/main/kotlin/de/itemis/mps/gradle/Common.kt @@ -3,8 +3,17 @@ package de.itemis.mps.gradle import org.apache.log4j.Logger import org.gradle.api.GradleException import org.gradle.api.JavaVersion +import org.gradle.api.Project import org.gradle.api.artifacts.Configuration +import org.gradle.api.tasks.Copy +import org.w3c.dom.Document +import org.w3c.dom.Node import java.io.File +import java.util.zip.ZipFile +import javax.xml.parsers.DocumentBuilderFactory +import javax.xml.xpath.XPath +import javax.xml.xpath.XPathConstants +import javax.xml.xpath.XPathFactory private val logger = Logger.getLogger("de.itemis.mps.gradle.common") @@ -20,6 +29,7 @@ data class Macro( open class BasePluginExtensions { lateinit var mpsConfig: Configuration + var mpsPluginConfig: Configuration? = null var mpsLocation: File? = null var plugins: List = emptyList() var pluginLocation: File? = null @@ -29,7 +39,7 @@ open class BasePluginExtensions { var javaExec: File? = null } -fun validateDefaultJvm(){ +fun validateDefaultJvm() { if (JavaVersion.current() != JavaVersion.VERSION_11) logger.error("MPS requires Java 11 but current JVM uses ${JavaVersion.current()}, starting MPS will most probably fail!") } @@ -48,4 +58,47 @@ fun argsFromBaseExtension(extensions: BasePluginExtensions): MutableList extensions.plugins.map { "--plugin=${it.id}::${it.path}" }.asSequence(), extensions.macros.map { "--macro=${it.name}::${it.value}" }.asSequence(), prj).flatten().toMutableList() -} \ No newline at end of file +} + +fun Project.initializeMpsPluginDependencies(extension: BasePluginExtensions) { + val mpsLocation = extension.mpsLocation ?: File(buildDir, "mps") + extension.pluginLocation = extension.pluginLocation ?: File(mpsLocation, "plugins") + val pluginDeps = (extension.mpsPluginConfig?.dependencies?.asSequence() ?: emptySequence()) + .flatMap { extension.mpsPluginConfig!!.files(it).asSequence() } + .map { toPlugin(it) } + .asSequence() + extension.plugins = sequenceOf( + extension.plugins.asSequence(), + pluginDeps + ).flatten().toList() + + +} + +fun Project.addCopyMpsPluginDepsTask(extension: BasePluginExtensions, dependencies: Any, pluginTail: String) = + tasks.create("copyMpsPluginsFor$pluginTail", Copy::class.java) { + dependsOn(dependencies) + into(extension.pluginLocation!!) + extension.mpsPluginConfig?.asFileTree?.forEach { + from(zipTree(it)) + } + } + +private fun toPlugin(file: File): de.itemis.mps.gradle.Plugin { + return ZipFile(file).use { zipFile -> + zipFile.entries().asSequence() + .first { it.name.endsWith("META-INF/plugin.xml") } + .let { entry -> + val name = entry.name.substring(0, entry.name.indexOf('/')) + val xmlDoc: Document = DocumentBuilderFactory.newInstance() + .newDocumentBuilder() + .parse(zipFile.getInputStream(entry)) + xmlDoc.documentElement.normalize() + val xPath: XPath = XPathFactory.newInstance().newXPath() + val evaluate: Node = + xPath.compile("/idea-plugin/id") + .evaluate(xmlDoc, XPathConstants.NODE) as Node + de.itemis.mps.gradle.Plugin(evaluate.textContent, name) + } + } +} diff --git a/src/main/kotlin/de/itemis/mps/gradle/generate/Plugin.kt b/src/main/kotlin/de/itemis/mps/gradle/generate/Plugin.kt index bee7f527..87d1058f 100644 --- a/src/main/kotlin/de/itemis/mps/gradle/generate/Plugin.kt +++ b/src/main/kotlin/de/itemis/mps/gradle/generate/Plugin.kt @@ -1,12 +1,13 @@ package de.itemis.mps.gradle.generate import de.itemis.mps.gradle.BasePluginExtensions +import de.itemis.mps.gradle.addCopyMpsPluginDepsTask import de.itemis.mps.gradle.argsFromBaseExtension +import de.itemis.mps.gradle.initializeMpsPluginDependencies import de.itemis.mps.gradle.validateDefaultJvm import org.gradle.api.GradleException import org.gradle.api.Plugin import org.gradle.api.Project -import org.gradle.api.artifacts.Configuration import org.gradle.api.tasks.Copy import org.gradle.api.tasks.JavaExec import org.gradle.kotlin.dsl.support.zipTo @@ -28,6 +29,8 @@ open class GenerateMpsProjectPlugin : Plugin { val mpsLocation = extension.mpsLocation ?: File(project.buildDir, "mps") afterEvaluate { + initializeMpsPluginDependencies(extension) + val mpsVersion = extension .mpsConfig .resolvedConfiguration @@ -89,8 +92,10 @@ open class GenerateMpsProjectPlugin : Plugin { dependsOn(resolveMps) } + val copyPlugins = addCopyMpsPluginDepsTask(extension, fake, "Generation") + tasks.create("generate", JavaExec::class.java) { - dependsOn(fake) + dependsOn(copyPlugins) args(args) if (extension.javaExec != null) executable(extension.javaExec!!) @@ -110,4 +115,4 @@ open class GenerateMpsProjectPlugin : Plugin { } } } -} \ No newline at end of file +} diff --git a/src/main/kotlin/de/itemis/mps/gradle/modelcheck/Plugin.kt b/src/main/kotlin/de/itemis/mps/gradle/modelcheck/Plugin.kt index cb40e3bc..cfde888e 100644 --- a/src/main/kotlin/de/itemis/mps/gradle/modelcheck/Plugin.kt +++ b/src/main/kotlin/de/itemis/mps/gradle/modelcheck/Plugin.kt @@ -1,8 +1,6 @@ package de.itemis.mps.gradle.modelcheck -import de.itemis.mps.gradle.BasePluginExtensions -import de.itemis.mps.gradle.argsFromBaseExtension -import de.itemis.mps.gradle.validateDefaultJvm +import de.itemis.mps.gradle.* import org.gradle.api.GradleException import org.gradle.api.Plugin import org.gradle.api.Project @@ -30,6 +28,7 @@ open class ModelcheckMpsProjectPlugin : Plugin { afterEvaluate { val mpsLocation = extension.mpsLocation ?: File(project.buildDir, "mps") + initializeMpsPluginDependencies(extension) val mpsVersion = extension .mpsConfig @@ -94,8 +93,11 @@ open class ModelcheckMpsProjectPlugin : Plugin { } into(mpsLocation) } + + val copyPlugins = addCopyMpsPluginDepsTask(extension, resolveMps, "Generation") + tasks.create("checkmodels", JavaExec::class.java) { - dependsOn(resolveMps) + dependsOn(copyPlugins) args(args) if (extension.javaExec != null) executable(extension.javaExec!!) diff --git a/src/test/kotlin/GenerateModel.kt b/src/test/kotlin/GenerateModel.kt new file mode 100644 index 00000000..25da0699 --- /dev/null +++ b/src/test/kotlin/GenerateModel.kt @@ -0,0 +1,123 @@ +import de.itemis.mps.gradle.generate.GenerateMpsProjectPlugin +import org.gradle.testkit.runner.GradleRunner +import org.junit.Assert +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.rules.TemporaryFolder +import java.io.File + + +class GenerateModelTest { + + @Rule + @JvmField + val testProjectDir: TemporaryFolder = TemporaryFolder() + + private lateinit var settingsFile: File + private lateinit var buildFile: File + private lateinit var cp: List + private lateinit var file: File + + @Before + fun setup() { + val pkgCount = GenerateMpsProjectPlugin::class.java.packageName.count { it == '.' } + file = File(GenerateMpsProjectPlugin::class.java.getResource("").toURI()) + for (i in 0..pkgCount) { + file = file.parentFile + } + + settingsFile = testProjectDir.newFile("settings.gradle") + buildFile = testProjectDir.newFile("build.gradle") + cp = javaClass.classLoader.getResource( + "plugin-classpath.txt")!!.readText().lines().map { File(it) } + testProjectDir.newFolder("buildSrc") + val buildSrcGradle = testProjectDir.newFile("buildSrc/build.gradle") + buildSrcGradle.writeText(""" + plugins { + id 'java-gradle-plugin' + } + dependencies { + implementation files('${file.absolutePath}') + } + gradlePlugin { + plugins { + myPlugins { + id = 'generate-models' + implementationClass = 'de.itemis.mps.gradle.generate.GenerateMpsProjectPlugin' + } + } + } + """.trimIndent()) + } + + @Test + fun `test generate model`() { + val testProjFolder = File(javaClass.classLoader.getResource("test-project")!!.toURI()) + val langPlugin = File(javaClass.classLoader.getResource("zargari-lang.zip")!!.toURI()) + testProjFolder.copyRecursively(testProjectDir.root) + settingsFile.writeText(""" + rootProject.name = "test-project" + """.trimIndent()) + buildFile.writeText(""" + ext.mpsMajor = "2020.1" + ext.mpsMinor = "6" + + buildscript { + dependencies { + classpath files('${file.absolutePath}') + classpath files(${cp.map { """"${it.invariantSeparatorsPath}"""" }.joinToString()}) + } + } + + repositories { + maven { url 'https://projects.itemis.de/nexus/content/repositories/mbeddr' } + jcenter() + ivy { + url "https://download.jetbrains.com/mps/${'$'}mpsMajor/" + layout 'pattern', { + artifact "[module]-[revision].[ext]" + } + metadataSources { // skip downloading ivy.xml + artifact() + } + } + } + + apply plugin: 'generate-models' + + configurations { + mps + mpsPlugin + } + + ext.mpsVersion = '2020.1.6' + + generate { + projectLocation = new File("${testProjectDir.root.absolutePath}") + mpsConfig = configurations.mps + mpsPluginConfig = configurations.mpsPlugin + } + + dependencies { + mps "com.jetbrains:mps:${'$'}mpsVersion" + mpsPlugin files('${langPlugin.absolutePath}') + } + """.trimIndent()) + + GradleRunner.create() + .withProjectDir(testProjectDir.root) + .withArguments("generate") + .withPluginClasspath(cp) + .build() + val generatedSrcDir = testProjectDir.root + .resolve("solutions") + .resolve("ZargariSolution") + .resolve("source_gen") + .resolve("ZargariSolution") + .resolve("java") + Assert.assertTrue(generatedSrcDir.exists()) + Assert.assertTrue(generatedSrcDir.resolve("MyClass.java").exists()) + } +} + diff --git a/src/test/resources/test-project/.mps/modules.xml b/src/test/resources/test-project/.mps/modules.xml new file mode 100644 index 00000000..6edf4f1a --- /dev/null +++ b/src/test/resources/test-project/.mps/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/src/test/resources/test-project/solutions/ZargariSolution/ZargariSolution.msd b/src/test/resources/test-project/solutions/ZargariSolution/ZargariSolution.msd new file mode 100644 index 00000000..2673a952 --- /dev/null +++ b/src/test/resources/test-project/solutions/ZargariSolution/ZargariSolution.msd @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/test/resources/test-project/solutions/ZargariSolution/models/ZargariSolution.java.mps b/src/test/resources/test-project/solutions/ZargariSolution/models/ZargariSolution.java.mps new file mode 100644 index 00000000..34230850 --- /dev/null +++ b/src/test/resources/test-project/solutions/ZargariSolution/models/ZargariSolution.java.mps @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/resources/zargari-lang.zip b/src/test/resources/zargari-lang.zip new file mode 100644 index 0000000000000000000000000000000000000000..25f1b8aaadda2551ef760ca9724ea88b26d58043 GIT binary patch literal 36909 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