From 8f0ffde38ef76df8272d86f5ecb9a78f74d2a1dc Mon Sep 17 00:00:00 2001 From: Alexander Bubenchikov Date: Mon, 21 Oct 2024 17:49:01 +0200 Subject: [PATCH] [maven] [IDEA-342187] import Annotation processor declared as managementDependency (cherry picked from commit 38370b5e09fe463761fffda2d78e1112e1f859bb) IJ-CR-152420 GitOrigin-RevId: 2fb2a8dd8920fcff5bc44d49de28847c84b55f96 --- .../MavenAnnotationProcessorConfigurator.kt | 97 ++++++++++++------- .../MavenAnnotationProcessorContributor.kt | 2 +- .../AnnotationProcessorImportingTest.kt | 53 ++++++++++ 3 files changed, 118 insertions(+), 34 deletions(-) diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenAnnotationProcessorConfigurator.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenAnnotationProcessorConfigurator.kt index eced62e1f185..5319fffc4761 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenAnnotationProcessorConfigurator.kt +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenAnnotationProcessorConfigurator.kt @@ -17,6 +17,7 @@ import com.intellij.openapi.util.text.StringUtil import com.intellij.pom.java.LanguageLevel import com.intellij.util.Consumer import com.intellij.util.containers.ContainerUtil +import com.intellij.util.text.VersionComparatorUtil import org.jdom.Element import org.jetbrains.annotations.ApiStatus import org.jetbrains.idea.maven.importing.MavenAnnotationProcessorConfiguratorUtil.getProcessorArtifactInfos @@ -44,9 +45,13 @@ val MAVEN_BSC_DEFAULT_ANNOTATION_PROFILE: String = MavenAnnotationProcessorConfi private val ANNOTATION_PROCESSOR_MODULE_NAMES = Key.create>>( "ANNOTATION_PROCESSOR_MODULE_NAMES") +private const val PLUGIN_GROUP_ID = "org.apache.maven.plugins" + +private const val PLUGIN_ARTIFACT_ID = "maven-compiler-plugin" + @ApiStatus.Internal -class MavenAnnotationProcessorConfigurator : MavenApplicableConfigurator("org.apache.maven.plugins", - "maven-compiler-plugin"), MavenWorkspaceConfigurator { +class MavenAnnotationProcessorConfigurator : MavenApplicableConfigurator(PLUGIN_GROUP_ID, + PLUGIN_ARTIFACT_ID), MavenWorkspaceConfigurator { override fun isApplicable(mavenProject: MavenProject): Boolean { return true } @@ -67,16 +72,18 @@ class MavenAnnotationProcessorConfigurator : MavenApplicableConfigurator("org.ap ANNOTATION_PROCESSOR_MODULE_NAMES[context] = map } - private fun collectProcessorModuleNames(projects: Iterable, - moduleNameByProjectId: Function?>, - result: MutableMap>) { + private fun collectProcessorModuleNames( + projects: Iterable, + moduleNameByProjectId: Function?>, + result: MutableMap>, + ) { for (mavenProject in projects) { if (!shouldEnableAnnotationProcessors(mavenProject)) continue val config = getConfig(mavenProject, "annotationProcessorPaths") if (config == null) continue - for (info in getProcessorArtifactInfos(config)) { + for (info in getProcessorArtifactInfos(config, mavenProject)) { val mavenId = MavenId(info.groupId, info.artifactId, info.version) val processorModuleNames = moduleNameByProjectId.apply(mavenId) @@ -87,6 +94,7 @@ class MavenAnnotationProcessorConfigurator : MavenApplicableConfigurator("org.ap } } + override fun afterModelApplied(context: AppliedModelContext) { val nameToModuleCache: MutableMap = HashMap() for (each in context.mavenProjectsWithModules.asIterable()) { @@ -112,14 +120,18 @@ class MavenAnnotationProcessorConfigurator : MavenApplicableConfigurator("org.ap } - private class MavenProjectWithProcessorModules(val mavenProject: MavenProject, - val mavenProjectModules: List>, - val processorModuleNames: List) + private class MavenProjectWithProcessorModules( + val mavenProject: MavenProject, + val mavenProjectModules: List>, + val processorModuleNames: List, + ) - private fun configureProfiles(project: Project, - tree: MavenProjectsTree, - projectsWithModules: Iterable, - moduleByName: Function) { + private fun configureProfiles( + project: Project, + tree: MavenProjectsTree, + projectsWithModules: Iterable, + moduleByName: Function, + ) { val compilerConfiguration = CompilerConfiguration.getInstance(project) as CompilerConfigurationImpl for (it in projectsWithModules) { @@ -146,10 +158,12 @@ class MavenAnnotationProcessorConfigurator : MavenApplicableConfigurator("org.ap } } - private fun createOrUpdateProfile(mavenProject: MavenProject, - module: Module, - processorModules: List, - compilerConfiguration: CompilerConfigurationImpl): Pair? { + private fun createOrUpdateProfile( + mavenProject: MavenProject, + module: Module, + processorModules: List, + compilerConfiguration: CompilerConfigurationImpl, + ): Pair? { val processors = mavenProject.declaredAnnotationProcessors val options = mavenProject.annotationProcessorOptions @@ -209,13 +223,15 @@ class MavenAnnotationProcessorConfigurator : MavenApplicableConfigurator("org.ap return Pair.pair(moduleProfile, isDefault) } - private fun getModuleProfile(module: Module, - mavenProject: MavenProject, - compilerConfiguration: CompilerConfigurationImpl, - moduleProfileName: String, - outputRelativeToContentRoot: Boolean, - annotationProcessorDirectory: String, - testAnnotationProcessorDirectory: String): ProcessorConfigProfile? { + private fun getModuleProfile( + module: Module, + mavenProject: MavenProject, + compilerConfiguration: CompilerConfigurationImpl, + moduleProfileName: String, + outputRelativeToContentRoot: Boolean, + annotationProcessorDirectory: String, + testAnnotationProcessorDirectory: String, + ): ProcessorConfigProfile? { var moduleProfile = compilerConfiguration.findModuleProcessorProfile(moduleProfileName) if (moduleProfile == null) { @@ -258,8 +274,10 @@ class MavenAnnotationProcessorConfigurator : MavenApplicableConfigurator("org.ap return true } - private fun getAnnotationProcessorPath(mavenProject: MavenProject, - processorModules: List): String { + private fun getAnnotationProcessorPath( + mavenProject: MavenProject, + processorModules: List, + ): String { val annotationProcessorPath = StringJoiner(File.pathSeparator) val resultAppender = Consumer { path: String? -> @@ -282,11 +300,13 @@ class MavenAnnotationProcessorConfigurator : MavenApplicableConfigurator("org.ap return annotationProcessorPath.toString() } - private fun cleanAndMergeModuleProfiles(rootProject: MavenProject, - compilerConfiguration: CompilerConfigurationImpl, - moduleProfile: ProcessorConfigProfile?, - isDefault: Boolean, - module: Module) { + private fun cleanAndMergeModuleProfiles( + rootProject: MavenProject, + compilerConfiguration: CompilerConfigurationImpl, + moduleProfile: ProcessorConfigProfile?, + isDefault: Boolean, + module: Module, + ) { val profiles: List = ArrayList(compilerConfiguration.moduleProcessorProfiles) for (p in profiles) { if (p !== moduleProfile) { @@ -369,17 +389,28 @@ object MavenAnnotationProcessorConfiguratorUtil { return PROFILE_PREFIX + moduleName } - fun getProcessorArtifactInfos(config: Element): List { + private fun getProcessorVersion(groupId: String?, artifactId: String?, version: String?, project: MavenProject): String? { + if (version != null) return version + val pluginVersion = project.findPlugin(PLUGIN_GROUP_ID, PLUGIN_ARTIFACT_ID)?.version ?: return null + + if (VersionComparatorUtil.compare(pluginVersion, "3.12.0") >= 0 && groupId != null && artifactId != null) { + return project.findManagedDependency(groupId, artifactId)?.version + } + return null + } + + fun getProcessorArtifactInfos(config: Element, mavenProject: MavenProject): List { val artifacts: MutableList = ArrayList() val addToArtifacts = Consumer { path: Element -> val groupId = path.getChildTextTrim("groupId") val artifactId = path.getChildTextTrim("artifactId") val version = path.getChildTextTrim("version") + val resolvedVersion = getProcessorVersion(groupId, artifactId, version, mavenProject) val classifier = path.getChildTextTrim("classifier") //String type = path.getChildTextTrim("type"); - artifacts.add(MavenArtifactInfo(groupId, artifactId, version, "jar", classifier)) + artifacts.add(MavenArtifactInfo(groupId, artifactId, resolvedVersion, "jar", classifier)) } for (path in config.getChildren("path")) { diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenAnnotationProcessorContributor.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenAnnotationProcessorContributor.kt index f60c3a9e5682..55cf57c583cf 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenAnnotationProcessorContributor.kt +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenAnnotationProcessorContributor.kt @@ -20,7 +20,7 @@ internal class MavenAnnotationProcessorContributor : MavenProjectResolutionContr val config = MavenJDOMUtil.findChildByPath(pluginConfiguration, "annotationProcessorPaths") if (config == null) return - val artifactsInfo = getProcessorArtifactInfos(config) + val artifactsInfo = getProcessorArtifactInfos(config, mavenProject) if (artifactsInfo.isEmpty()) { return } diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/compiler/AnnotationProcessorImportingTest.kt b/plugins/maven/src/test/java/org/jetbrains/idea/maven/compiler/AnnotationProcessorImportingTest.kt index 92f192b2d7e4..906d5e3ddfcf 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/compiler/AnnotationProcessorImportingTest.kt +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/compiler/AnnotationProcessorImportingTest.kt @@ -582,4 +582,57 @@ class AnnotationProcessorImportingTest : MavenMultiVersionImportingTestCase() { Assert.assertNull(compilerConfiguration.findModuleProcessorProfile(profileName)) } + + @Test + fun testImportManagedDependencyAnnotationProcessor() = runBlocking{ + importProjectAsync(""" + test + project + 1.0 + + + + com.google.dagger + dagger-compiler + 2.2 + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.12.1 + + + + com.google.dagger + dagger-compiler + + + + + + +""") + + val mavenProject = projectsManager.findProject(getModule("project")) + assertNotNull(mavenProject) + + val annotationProcessors = mavenProject!!.externalAnnotationProcessors + assertNotEmpty(annotationProcessors) + + assertTrue( + annotationProcessors.any { "com.google.dagger" == it!!.groupId && "dagger-compiler" == it.artifactId && "2.2" == it.version }) + assertTrue(annotationProcessors.any { "com.google.dagger" == it!!.groupId && "dagger" == it.artifactId && "2.2" == it.version }) + + val config = CompilerConfiguration.getInstance(project) as CompilerConfigurationImpl + + val projectProfile = config.findModuleProcessorProfile(getModuleProfileName("project")) + assertNotNull(projectProfile) + val path = projectProfile!!.processorPath + assertTrue(path.contains(FileUtil.toSystemDependentName("/com/google/dagger/dagger-compiler/2.2/dagger-compiler-2.2.jar"))) + } }