diff --git a/.idea/modules.xml b/.idea/modules.xml index 1b1b16f3e885..a688802c8e9c 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -542,6 +542,7 @@ + diff --git a/java/compiler/impl/src/com/intellij/compiler/CompilerConfigurationImpl.java b/java/compiler/impl/src/com/intellij/compiler/CompilerConfigurationImpl.java index 8bbd7f47f83a..f5f001aa4cd7 100644 --- a/java/compiler/impl/src/com/intellij/compiler/CompilerConfigurationImpl.java +++ b/java/compiler/impl/src/com/intellij/compiler/CompilerConfigurationImpl.java @@ -376,12 +376,16 @@ public class CompilerConfigurationImpl extends CompilerConfiguration implements public void setAdditionalOptions(@NotNull Module module, @NotNull List options) { JpsJavaCompilerOptions settings = getCompilerSettings(); if (settings != null) { - String previous = settings.ADDITIONAL_OPTIONS_OVERRIDE.getOrDefault(module.getName(), settings.ADDITIONAL_OPTIONS_STRING); - String newValue = ParametersListUtil.join(options); - if (!newValue.equals(previous)) { - settings.ADDITIONAL_OPTIONS_OVERRIDE.put(module.getName(), newValue); - BuildManager.getInstance().clearState(myProject); - } + setAdditionalOptions(settings, module, options); + } + } + + public void setAdditionalOptions(@NotNull JpsJavaCompilerOptions settings, @NotNull Module module, @NotNull List options) { + String previous = settings.ADDITIONAL_OPTIONS_OVERRIDE.getOrDefault(module.getName(), settings.ADDITIONAL_OPTIONS_STRING); + String newValue = ParametersListUtil.join(options); + if (!newValue.equals(previous)) { + settings.ADDITIONAL_OPTIONS_OVERRIDE.put(module.getName(), newValue); + BuildManager.getInstance().clearState(myProject); } } diff --git a/plugins/maven/error-prone-compiler/intellij.maven.errorProne.compiler.iml b/plugins/maven/error-prone-compiler/intellij.maven.errorProne.compiler.iml new file mode 100644 index 000000000000..243ffd954358 --- /dev/null +++ b/plugins/maven/error-prone-compiler/intellij.maven.errorProne.compiler.iml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/maven/error-prone-compiler/src/main/java/org/intellij/errorProne/MavenCompilerErrorProneExtension.kt b/plugins/maven/error-prone-compiler/src/main/java/org/intellij/errorProne/MavenCompilerErrorProneExtension.kt new file mode 100644 index 000000000000..248c505c0c65 --- /dev/null +++ b/plugins/maven/error-prone-compiler/src/main/java/org/intellij/errorProne/MavenCompilerErrorProneExtension.kt @@ -0,0 +1,26 @@ +// 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.intellij.errorProne + +import com.intellij.compiler.CompilerConfiguration +import com.intellij.compiler.CompilerConfigurationImpl +import com.intellij.compiler.impl.javaCompiler.BackendCompiler +import com.intellij.openapi.project.Project +import org.jetbrains.idea.maven.importing.MavenCompilerExtension +import org.jetbrains.jps.model.java.compiler.JpsJavaCompilerOptions + +/** + * @author Vladislav.Soroka + */ +class MavenCompilerErrorProneExtension : MavenCompilerExtension { + override fun getMavenCompilerId(): String = "javac-with-errorprone" + + override fun getCompiler(project: Project): BackendCompiler { + val compilerConfiguration = CompilerConfiguration.getInstance(project) as CompilerConfigurationImpl + return compilerConfiguration.registeredJavaCompilers.find { it is ErrorProneJavaBackendCompiler }!! + } + + override fun getOptions(project: Project): JpsJavaCompilerOptions { + return ErrorProneCompilerConfiguration.getOptions(project) + } +} + diff --git a/plugins/maven/intellij.maven.iml b/plugins/maven/intellij.maven.iml index 56ff8f2ba5d3..c7f36100de54 100644 --- a/plugins/maven/intellij.maven.iml +++ b/plugins/maven/intellij.maven.iml @@ -61,6 +61,7 @@ + diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenCompilerEclipseExtension.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenCompilerEclipseExtension.kt new file mode 100644 index 000000000000..3a4f89b1e10b --- /dev/null +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenCompilerEclipseExtension.kt @@ -0,0 +1,26 @@ +// 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.compiler.impl.javaCompiler.eclipse.EclipseCompiler +import com.intellij.compiler.impl.javaCompiler.eclipse.EclipseCompilerConfiguration +import com.intellij.openapi.project.Project +import org.jetbrains.jps.model.java.compiler.JpsJavaCompilerOptions + +/** + * @author Vladislav.Soroka + */ +class MavenCompilerEclipseExtension : MavenCompilerExtension { + override fun getMavenCompilerId(): String = "eclipse" + + override fun getCompiler(project: Project): BackendCompiler { + val compilerConfiguration = CompilerConfiguration.getInstance(project) as CompilerConfigurationImpl + return compilerConfiguration.registeredJavaCompilers.find { it is EclipseCompiler }!! + } + + override fun getOptions(project: Project): JpsJavaCompilerOptions { + return EclipseCompilerConfiguration.getOptions(project, EclipseCompilerConfiguration::class.java) + } +} 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 new file mode 100644 index 000000000000..2e9394408dd9 --- /dev/null +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenCompilerExtension.java @@ -0,0 +1,26 @@ +// 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.impl.javaCompiler.BackendCompiler; +import com.intellij.openapi.extensions.ExtensionPointName; +import com.intellij.openapi.project.Project; +import org.jetbrains.jps.model.java.compiler.JpsJavaCompilerOptions; + +/** + * @author Vladislav.Soroka + */ +public interface MavenCompilerExtension { + ExtensionPointName EP_NAME = ExtensionPointName.create("org.jetbrains.idea.maven.compiler"); + + /** + * Id of the maven compiler, see the role-hint of the @plexus.component with role="org.codehaus.plexus.compiler.Compiler". + * Note, this can be not equal to {@link BackendCompiler#getId()} + * + * @return maven compiler id + */ + String getMavenCompilerId(); + + BackendCompiler getCompiler(Project project); + + JpsJavaCompilerOptions getOptions(Project project); +} 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 new file mode 100644 index 000000000000..2a83d66fb9e1 --- /dev/null +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenCompilerImporter.kt @@ -0,0 +1,122 @@ +// 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.openapi.diagnostic.Logger +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider +import com.intellij.openapi.module.Module +import com.intellij.openapi.util.Key +import com.intellij.openapi.util.text.StringUtil +import com.intellij.openapi.util.text.StringUtil.nullize +import com.intellij.util.containers.ContainerUtil.addIfNotNull +import org.jdom.Element +import org.jetbrains.idea.maven.project.* + +/** + * @author Vladislav.Soroka + */ +class MavenCompilerImporter : MavenImporter("org.apache.maven.plugins", "maven-compiler-plugin") { + private val LOG = Logger.getInstance("#org.jetbrains.idea.maven.importing.MavenCompilerImporter") + + override fun processChangedModulesOnly(): Boolean { + return false + } + + override fun preProcess(module: Module, + mavenProject: MavenProject, + changes: MavenProjectChanges, + modifiableModelsProvider: IdeModifiableModelsProvider) { + if (!MavenProjectsManager.getInstance(module.project).importingSettings.isUseMavenCompilerArguments) return + val config = getConfig(mavenProject) ?: return + + var compilers = modifiableModelsProvider.getUserData>(COMPILERS) + if (compilers == null) { + compilers = mutableSetOf() + modifiableModelsProvider.putUserData(COMPILERS, compilers) + } + compilers.add(getCompilerId(config)) + } + + override fun process(modifiableModelsProvider: IdeModifiableModelsProvider, + module: Module, + rootModel: MavenRootModelAdapter, + mavenModel: MavenProjectsTree, + mavenProject: MavenProject, + changes: MavenProjectChanges, + mavenProjectToModuleName: Map, + postTasks: List) { + if (!MavenProjectsManager.getInstance(module.project).importingSettings.isUseMavenCompilerArguments) return + + val compilers = modifiableModelsProvider.getUserData(COMPILERS) + val isMultipleCompilersUsed = compilers != null && compilers.size > 1 + + val compilerConfiguration = getConfig(mavenProject) ?: return + val compilerId = getCompilerId(compilerConfiguration) + + MavenCompilerExtension.EP_NAME.extensions.find { compilerId == it.mavenCompilerId }?.run { + importCompilerConfiguration(module, compilerConfiguration, this, !isMultipleCompilersUsed) + } + } + + private fun importCompilerConfiguration(module: Module, + compilerMavenConfiguration: Element, + extension: MavenCompilerExtension, + useAsDefault: Boolean) { + val options = mutableListOf() + val parameters = compilerMavenConfiguration.getChild("parameters") + + if (parameters?.textTrim?.toBoolean() == true) { + options += "-parameters" + } + + val compilerArguments = compilerMavenConfiguration.getChild("compilerArguments") + if (compilerArguments != null) { + for (compilerArgument in compilerArguments.children) { + options.add("-" + compilerArgument.name) + addIfNotNull(options, nullize(compilerArgument.textTrim)) + } + } + + addIfNotNull(options, nullize(compilerMavenConfiguration.getChildTextTrim("compilerArgument"))) + + val compilerArgs = compilerMavenConfiguration.getChild("compilerArgs") + if (compilerArgs != null) { + for (arg in compilerArgs.getChildren("arg")) { + addIfNotNull(options, nullize(arg.textTrim)) + } + for (compilerArg in compilerArgs.getChildren("compilerArg")) { + addIfNotNull(options, nullize(compilerArg.textTrim)) + } + } + + val compilerOptions = extension.getOptions(module.project) + val compilerConfiguration = CompilerConfiguration.getInstance(module.project) as CompilerConfigurationImpl + compilerConfiguration.setAdditionalOptions(compilerOptions, module, options) + + if (useAsDefault) { + val backendCompiler = extension.getCompiler(module.project) + if (compilerConfiguration.defaultCompiler !== backendCompiler) { + val compilers = compilerConfiguration.registeredJavaCompilers + if (compilers.contains(backendCompiler)) { + compilerConfiguration.defaultCompiler = backendCompiler + } + else { + LOG.error(backendCompiler.toString() + " is not registered.") + } + } + } + } + + companion object { + private val COMPILERS = Key.create>("maven.compilers") + + private fun getCompilerId(config: Element): String { + var compilerId = config.getChildTextTrim("compilerId") + if (StringUtil.isEmpty(compilerId) || "javac" == compilerId) { + compilerId = "javac" + } + return compilerId + } + } +} diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenCompilerJavacExtension.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenCompilerJavacExtension.kt new file mode 100644 index 000000000000..7d115fff2a85 --- /dev/null +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenCompilerJavacExtension.kt @@ -0,0 +1,24 @@ +// 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.compiler.impl.javaCompiler.javac.JavacConfiguration +import com.intellij.openapi.project.Project +import org.jetbrains.jps.model.java.compiler.JpsJavaCompilerOptions + +/** + * @author Vladislav.Soroka + */ +class MavenCompilerJavacExtension : MavenCompilerExtension { + override fun getMavenCompilerId(): String = "javac" + + override fun getCompiler(project: Project): BackendCompiler { + return (CompilerConfiguration.getInstance(project) as CompilerConfigurationImpl).javacCompiler + } + + override fun getOptions(project: Project): JpsJavaCompilerOptions { + return JavacConfiguration.getOptions(project, JavacConfiguration::class.java) + } +} diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenModuleImporter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenModuleImporter.java index 186064ada969..54e203c156aa 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenModuleImporter.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenModuleImporter.java @@ -33,7 +33,6 @@ import com.intellij.openapi.vfs.JarFileSystem; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.pom.java.LanguageLevel; -import com.intellij.psi.JavaCompilerConfigurationProxy; import gnu.trove.THashSet; import org.jdom.Element; import org.jetbrains.annotations.NotNull; @@ -43,14 +42,10 @@ import org.jetbrains.idea.maven.model.MavenConstants; import org.jetbrains.idea.maven.project.*; import org.jetbrains.idea.maven.utils.MavenUtil; -import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; -import static com.intellij.openapi.util.text.StringUtil.nullize; -import static com.intellij.util.containers.ContainerUtil.addIfNotNull; - public class MavenModuleImporter { public static final String SUREFIRE_PLUGIN_LIBRARY_NAME = "maven-surefire-plugin urls"; @@ -107,7 +102,6 @@ public class MavenModuleImporter { configFolders(); configDependencies(); configLanguageLevel(); - configCompilerArguments(); } public void preConfigFacets() { @@ -408,40 +402,4 @@ public class MavenModuleImporter { myRootModelAdapter.setLanguageLevel(level); } - - private void configCompilerArguments() { - List options = new ArrayList<>(); - - Element compilerConfiguration = myMavenProject.getPluginConfiguration("org.apache.maven.plugins", "maven-compiler-plugin"); - if (compilerConfiguration != null) { - Element parameters = compilerConfiguration.getChild("parameters"); - if (parameters != null && Boolean.parseBoolean(parameters.getTextTrim())) { - options.add("-parameters"); - } - - if(!mySettings.isUseMavenCompilerArguments()) return; - - Element compilerArguments = compilerConfiguration.getChild("compilerArguments"); - if (compilerArguments != null) { - for (Element compilerArgument : compilerArguments.getChildren()) { - options.add("-" + compilerArgument.getName()); - addIfNotNull(options, nullize(compilerArgument.getTextTrim())); - } - } - - addIfNotNull(options, nullize(compilerConfiguration.getChildTextTrim("compilerArgument"))); - - Element compilerArgs = compilerConfiguration.getChild("compilerArgs"); - if (compilerArgs != null) { - for (Element arg: compilerArgs.getChildren("arg")) { - addIfNotNull(options, nullize(arg.getTextTrim())); - } - for (Element compilerArg: compilerArgs.getChildren("compilerArg")) { - addIfNotNull(options, nullize(compilerArg.getTextTrim())); - } - } - } - - JavaCompilerConfigurationProxy.setAdditionalOptions(myModule.getProject(), myModule, options); - } } diff --git a/plugins/maven/src/main/resources/META-INF/errorProne-compiler-support.xml b/plugins/maven/src/main/resources/META-INF/errorProne-compiler-support.xml new file mode 100644 index 000000000000..99265a878af1 --- /dev/null +++ b/plugins/maven/src/main/resources/META-INF/errorProne-compiler-support.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/plugins/maven/src/main/resources/META-INF/plugin.xml b/plugins/maven/src/main/resources/META-INF/plugin.xml index eff1ec040344..abf95740c8db 100644 --- a/plugins/maven/src/main/resources/META-INF/plugin.xml +++ b/plugins/maven/src/main/resources/META-INF/plugin.xml @@ -21,6 +21,7 @@ + @@ -34,6 +35,7 @@ com.intellij.properties org.intellij.groovy + Error-prone plugin @@ -318,8 +320,12 @@ + + + +