diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/GreclipseIdeaCompilerSettings.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/GreclipseIdeaCompilerSettings.java index e6301a0debd7..2fe97bba99da 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/GreclipseIdeaCompilerSettings.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/GreclipseIdeaCompilerSettings.java @@ -28,4 +28,12 @@ public class GreclipseIdeaCompilerSettings implements PersistentStateComponent + diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/buildtool/MavenSyncConsole.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/buildtool/MavenSyncConsole.kt index ea9cb061c7a5..8a9d86e9cae5 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/buildtool/MavenSyncConsole.kt +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/buildtool/MavenSyncConsole.kt @@ -21,6 +21,7 @@ import com.intellij.openapi.util.registry.Registry import com.intellij.openapi.util.text.StringUtil import com.intellij.openapi.vfs.VirtualFile import com.intellij.pom.Navigatable +import org.jetbrains.annotations.Nls import org.jetbrains.idea.maven.buildtool.quickfix.OffMavenOfflineModeQuickFix import org.jetbrains.idea.maven.buildtool.quickfix.OpenMavenSettingsQuickFix import org.jetbrains.idea.maven.buildtool.quickfix.UseBundledMavenQuickFix @@ -96,6 +97,11 @@ class MavenSyncConsole(private val myProject: Project) { mySyncView.onEvent(mySyncId, OutputBuildEventImpl(parentId, toPrint, stdout)) } + @Synchronized + fun addWarning(@Nls text: String, @Nls description: String) = doIfImportInProcess { + mySyncView.onEvent(mySyncId, MessageEventImpl(mySyncId, MessageEvent.Kind.WARNING, "Compiler", text, description)) + } + @Synchronized fun finishImport() { debugLog("Maven sync: finishImport") diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenCompilerExtension.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenCompilerExtension.java index fb052168e783..db71696cee40 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenCompilerExtension.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenCompilerExtension.java @@ -1,9 +1,13 @@ // Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package org.jetbrains.idea.maven.importing; +import com.intellij.compiler.CompilerConfiguration; +import com.intellij.compiler.CompilerConfigurationImpl; import com.intellij.compiler.impl.javaCompiler.BackendCompiler; import com.intellij.openapi.extensions.ExtensionPointName; +import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; +import org.jdom.Element; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.maven.project.MavenProject; @@ -11,6 +15,10 @@ import org.jetbrains.idea.maven.project.ResolveContext; import org.jetbrains.idea.maven.server.MavenEmbedderWrapper; import org.jetbrains.idea.maven.server.NativeMavenProjectHolder; import org.jetbrains.idea.maven.utils.MavenProcessCanceledException; +import org.jetbrains.jps.model.java.compiler.CompilerOptions; +import org.jetbrains.jps.model.java.compiler.JpsJavaCompilerOptions; + +import java.util.List; /** * @author Vladislav.Soroka @@ -42,4 +50,16 @@ public interface MavenCompilerExtension { @NotNull NativeMavenProjectHolder nativeMavenProject, @NotNull MavenEmbedderWrapper embedder, @NotNull ResolveContext context) throws MavenProcessCanceledException { return false; } + + default void configureOptions(CompilerOptions compilerOptions, + Module module, + MavenProject mavenProject, + List compilerArgs) { + if(compilerOptions instanceof JpsJavaCompilerOptions){ + JpsJavaCompilerOptions javaCompilerOptions = (JpsJavaCompilerOptions)compilerOptions; + + CompilerConfigurationImpl compilerConfiguration = (CompilerConfigurationImpl)CompilerConfiguration.getInstance(module.getProject()); + compilerConfiguration.setAdditionalOptions(javaCompilerOptions, module, compilerArgs); + } + } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenCompilerImporter.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenCompilerImporter.kt index a69535b1f77a..0656d9fe83da 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenCompilerImporter.kt +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenCompilerImporter.kt @@ -12,11 +12,13 @@ import com.intellij.openapi.util.registry.Registry import com.intellij.util.containers.ContainerUtil.addIfNotNull import com.intellij.util.text.nullize import org.jdom.Element +import org.jetbrains.annotations.NotNull import org.jetbrains.idea.maven.project.* import org.jetbrains.idea.maven.server.MavenEmbedderWrapper import org.jetbrains.idea.maven.server.NativeMavenProjectHolder import org.jetbrains.idea.maven.utils.MavenLog import org.jetbrains.idea.maven.utils.MavenProcessCanceledException +import org.jetbrains.jps.model.java.compiler.CompilerOptions import org.jetbrains.jps.model.java.compiler.JpsJavaCompilerOptions /** @@ -94,7 +96,7 @@ class MavenCompilerImporter : MavenImporter("org.apache.maven.plugins", "maven-c for (compilerExtension in MavenCompilerExtension.EP_NAME.extensions) { if (mavenConfiguration.value != null && compilerId == compilerExtension.mavenCompilerId) { - importCompilerConfiguration(module, mavenConfiguration.value!!, compilerExtension) + importCompilerConfiguration(module, mavenConfiguration.value!!, compilerExtension, mavenProject) } else { // cleanup obsolete options @@ -132,55 +134,15 @@ class MavenCompilerImporter : MavenImporter("org.apache.maven.plugins", "maven-c private fun importCompilerConfiguration(module: Module, compilerMavenConfiguration: Element, - extension: MavenCompilerExtension) { - val compilerOptions = extension.getCompiler(module.project)?.options as? JpsJavaCompilerOptions ?: return - - val options = mutableListOf() - val parameters = compilerMavenConfiguration.getChild("parameters") - - if (parameters?.textTrim?.toBoolean() == true) { - options += "-parameters" - } - - val compilerArguments = compilerMavenConfiguration.getChild("compilerArguments") - if (compilerArguments != null) { - val unresolvedArgs = mutableSetOf() - val effectiveArguments = compilerArguments.children.map { - val key = it.name.run { if (startsWith("-")) this else "-$this" } - val value = getResolvedText(it) - if (value == null && hasUnresolvedProperty(it.textTrim)) { - unresolvedArgs += key - } - key to value - }.toMap() - - effectiveArguments.forEach { key, value -> - if (key.startsWith("-A") && value != null) { - options.add("$key=$value") - } - else if (key !in unresolvedArgs) { - options.add(key) - addIfNotNull(options, value) - } - } - } - - addIfNotNull(options, getResolvedText(compilerMavenConfiguration.getChildTextTrim("compilerArgument"))) - - val compilerArgs = compilerMavenConfiguration.getChild("compilerArgs") - if (compilerArgs != null) { - for (arg in compilerArgs.getChildren("arg")) { - addIfNotNull(options, getResolvedText(arg)) - } - for (compilerArg in compilerArgs.getChildren("compilerArg")) { - addIfNotNull(options, getResolvedText(compilerArg)) - } - } - - val compilerConfiguration = CompilerConfiguration.getInstance(module.project) as CompilerConfigurationImpl - compilerConfiguration.setAdditionalOptions(compilerOptions, module, options) + extension: MavenCompilerExtension, + mavenProject: MavenProject) { + val compilerOptions = extension.getCompiler(module.project)?.options + val compilerArgs = collectCompilerArgs(compilerMavenConfiguration); + extension.configureOptions(compilerOptions, module, mavenProject, compilerArgs); } + + companion object { private val COMPILERS = Key.create>("maven.compilers") private val DEFAULT_COMPILER_IS_RESOLVED = Key.create("default.compiler.resolved") @@ -218,5 +180,52 @@ class MavenCompilerImporter : MavenImporter("org.apache.maven.plugins", "maven-c private fun getResolvedText(it: Element): String? { return getResolvedText(it.textTrim) } + + private fun collectCompilerArgs(compilerMavenConfiguration: Element): List { + + + val options = mutableListOf() + val parameters = compilerMavenConfiguration.getChild("parameters") + + if (parameters?.textTrim?.toBoolean() == true) { + options += "-parameters" + } + + val compilerArguments = compilerMavenConfiguration.getChild("compilerArguments") + if (compilerArguments != null) { + val unresolvedArgs = mutableSetOf() + val effectiveArguments = compilerArguments.children.map { + val key = it.name.run { if (startsWith("-")) this else "-$this" } + val value = getResolvedText(it) + if (value == null && hasUnresolvedProperty(it.textTrim)) { + unresolvedArgs += key + } + key to value + }.toMap() + + effectiveArguments.forEach { key, value -> + if (key.startsWith("-A") && value != null) { + options.add("$key=$value") + } + else if (key !in unresolvedArgs) { + options.add(key) + addIfNotNull(options, value) + } + } + } + + addIfNotNull(options, getResolvedText(compilerMavenConfiguration.getChildTextTrim("compilerArgument"))) + + val compilerArgs = compilerMavenConfiguration.getChild("compilerArgs") + if (compilerArgs != null) { + for (arg in compilerArgs.getChildren("arg")) { + addIfNotNull(options, getResolvedText(arg)) + } + for (compilerArg in compilerArgs.getChildren("compilerArg")) { + addIfNotNull(options, getResolvedText(compilerArg)) + } + } + return options; + } } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/plugins/groovy/MavenCompilerGrEclipseExtension.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/plugins/groovy/MavenCompilerGrEclipseExtension.kt new file mode 100644 index 000000000000..6de4e1faee40 --- /dev/null +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/plugins/groovy/MavenCompilerGrEclipseExtension.kt @@ -0,0 +1,49 @@ +// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package org.jetbrains.idea.maven.plugins.groovy + +import com.intellij.compiler.CompilerConfiguration +import com.intellij.compiler.CompilerConfigurationImpl +import com.intellij.compiler.impl.javaCompiler.BackendCompiler +import com.intellij.openapi.module.Module +import com.intellij.openapi.project.Project +import org.jetbrains.idea.maven.execution.SyncBundle +import org.jetbrains.idea.maven.importing.MavenCompilerExtension +import org.jetbrains.idea.maven.project.MavenProject +import org.jetbrains.idea.maven.project.MavenProjectsManager +import org.jetbrains.jps.model.java.compiler.CompilerOptions +import org.jetbrains.plugins.groovy.compiler.GreclipseIdeaCompiler +import org.jetbrains.plugins.groovy.compiler.GreclipseIdeaCompilerSettings + +/** + * + */ +class MavenCompilerGrEclipseExtension : MavenCompilerExtension { + override fun getMavenCompilerId(): String = "groovy-eclipse-compiler" + + override fun getCompiler(project: Project): BackendCompiler? { + val compilerConfiguration = CompilerConfiguration.getInstance(project) as CompilerConfigurationImpl + return compilerConfiguration.registeredJavaCompilers.find { it is GreclipseIdeaCompiler } + } + + override fun configureOptions(compilerOptions: CompilerOptions?, + module: Module, + mavenProject: MavenProject, + compilerArgs: MutableList) { + val eclipseBatchId = mavenProject.plugins.filter { it.artifactId == "maven-compiler-plugin" && it.groupId == "org.apache.maven.plugins" } + .flatMap { it.dependencies } + .find { it.groupId == "org.codehaus.groovy" && it.artifactId == "groovy-eclipse-batch" } + val batchLib = mavenProject.dependencies.find { it.mavenId == eclipseBatchId } + + if (batchLib != null) { + GreclipseIdeaCompilerSettings.setGrEclipsePath(module.project, batchLib.file.absolutePath); + GreclipseIdeaCompilerSettings.setGrCmdParams(module.project, compilerArgs.joinToString(" ")); + } + else { + MavenProjectsManager.getInstance(module.project).syncConsole.addWarning( + SyncBundle.message("maven.sync.warnings.eclipse.batch.compiler.no.dependency"), + SyncBundle.message("maven.sync.warnings.eclipse.batch.compiler.no.dependency.desc") + ) + } + + } +} diff --git a/plugins/maven/src/main/resources/META-INF/groovy-support.xml b/plugins/maven/src/main/resources/META-INF/groovy-support.xml index eaffd1ef5a91..92ae95c4e36a 100644 --- a/plugins/maven/src/main/resources/META-INF/groovy-support.xml +++ b/plugins/maven/src/main/resources/META-INF/groovy-support.xml @@ -6,6 +6,8 @@ + + diff --git a/plugins/maven/src/main/resources/messages/MavenSyncBundle.properties b/plugins/maven/src/main/resources/messages/MavenSyncBundle.properties index 6a18319b3833..693139c65a66 100644 --- a/plugins/maven/src/main/resources/messages/MavenSyncBundle.properties +++ b/plugins/maven/src/main/resources/messages/MavenSyncBundle.properties @@ -10,3 +10,8 @@ maven.sync.dependencies.artifact.download=Downloading {0} maven.sync.quickfixes.nomaven=Maven version is not defined maven.sync.quickfixes.maven360=You use Maven 3.6.0, there could be issues importing multimodule project. It is recommended to upgrade or downgrade Maven version + + +maven.sync.warnings.eclipse.batch.compiler.no.dependency=Dependency org.codehaus.groovy:groovy-eclipse-batch not properly registered +maven.sync.warnings.eclipse.batch.compiler.no.dependency.desc=To use groovy-eclipse-compiler you need to specify a Groovy artifact as a build dependency in addition to the maven-compiler-plugin dependency.\ + The Groovy dependency version should match the compiler version. \ No newline at end of file diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/GroovyImporterTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/GroovyImporterTest.java index 0ac061e547bb..5b6e6d134257 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/GroovyImporterTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/GroovyImporterTest.java @@ -5,11 +5,13 @@ package org.jetbrains.idea.maven.importing; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProviderImpl; import com.intellij.openapi.roots.OrderRootType; import com.intellij.openapi.roots.libraries.Library; import org.jetbrains.idea.maven.MavenImportingTestCase; import org.jetbrains.idea.maven.server.MavenServerManager; +import org.jetbrains.plugins.groovy.compiler.GreclipseIdeaCompilerSettings; import org.jetbrains.plugins.groovy.config.GroovyConfigUtils; import java.io.File; @@ -224,6 +226,9 @@ public class GroovyImporterTest extends MavenImportingTestCase { "src/test/groovy", "src/test/java"); assertTestResources("project", "src/test/resources"); + + GreclipseIdeaCompilerSettings compilerSettings = ServiceManager.getService(myProject, GreclipseIdeaCompilerSettings.class); + assertEquals("", compilerSettings.getState().greclipsePath); } public void testAddingCustomGroovySpecificSources() { @@ -655,4 +660,8 @@ public class GroovyImporterTest extends MavenImportingTestCase { assertExcludes("project", "target"); } + public void testGrEclipseMavenPlugin(){ + + } + }