From a3583ea79b514af0fb3e9caa5f569e87a0e66999 Mon Sep 17 00:00:00 2001 From: "Aleksei.Cherepanov" Date: Thu, 22 Jun 2023 17:13:24 +0000 Subject: [PATCH] Add the possibility to omit explicitly specifying a version in annotationProcessorPaths Resolve the version of the annotation processor path (specified in annotationProcessorPaths) in kapt plugin if it is already specified in dependencies of this module or parent module. Plugin management is also supported. #KT-59521 In Fixed Merge-request: KT-MR-10761 Merged-by: Aleksei Cherepanov --- .../pom.xml | 58 +++++++++++++++ .../main/kotlin/ExampleAnnotationProcessor.kt | 46 ++++++++++++ .../app-with-kapt/pom.xml | 72 +++++++++++++++++++ .../app-with-kapt/src/main/kotlin/test.kt | 8 +++ .../pom.xml | 16 +++++ .../verify.bsh | 6 ++ .../kapt/AnnotationProcessingManager.java | 18 ++++- 7 files changed, 223 insertions(+), 1 deletion(-) create mode 100644 libraries/tools/kotlin-maven-plugin-test/src/it/test-kapt-annotationProcessorPaths-without-version/annotation-processor-second-version/pom.xml create mode 100644 libraries/tools/kotlin-maven-plugin-test/src/it/test-kapt-annotationProcessorPaths-without-version/annotation-processor-second-version/src/main/kotlin/ExampleAnnotationProcessor.kt create mode 100644 libraries/tools/kotlin-maven-plugin-test/src/it/test-kapt-annotationProcessorPaths-without-version/app-with-kapt/pom.xml create mode 100755 libraries/tools/kotlin-maven-plugin-test/src/it/test-kapt-annotationProcessorPaths-without-version/app-with-kapt/src/main/kotlin/test.kt create mode 100644 libraries/tools/kotlin-maven-plugin-test/src/it/test-kapt-annotationProcessorPaths-without-version/pom.xml create mode 100644 libraries/tools/kotlin-maven-plugin-test/src/it/test-kapt-annotationProcessorPaths-without-version/verify.bsh diff --git a/libraries/tools/kotlin-maven-plugin-test/src/it/test-kapt-annotationProcessorPaths-without-version/annotation-processor-second-version/pom.xml b/libraries/tools/kotlin-maven-plugin-test/src/it/test-kapt-annotationProcessorPaths-without-version/annotation-processor-second-version/pom.xml new file mode 100644 index 00000000000..cf7accaf07c --- /dev/null +++ b/libraries/tools/kotlin-maven-plugin-test/src/it/test-kapt-annotationProcessorPaths-without-version/annotation-processor-second-version/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + + org.jetbrains.kotlin.testkapt + annotation-processor-second-version + 2.0-SNAPSHOT + + + + org.jetbrains.kotlin + kotlin-stdlib + ${kotlin.version} + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.6 + 1.6 + + + + org.apache.maven.plugins + maven-source-plugin + 2.1.2 + + + + + ${project.basedir}/src/main/kotlin + + + kotlin-maven-plugin + org.jetbrains.kotlin + ${kotlin.version} + + + compile + process-sources + + compile + + + + + + + + \ No newline at end of file diff --git a/libraries/tools/kotlin-maven-plugin-test/src/it/test-kapt-annotationProcessorPaths-without-version/annotation-processor-second-version/src/main/kotlin/ExampleAnnotationProcessor.kt b/libraries/tools/kotlin-maven-plugin-test/src/it/test-kapt-annotationProcessorPaths-without-version/annotation-processor-second-version/src/main/kotlin/ExampleAnnotationProcessor.kt new file mode 100644 index 00000000000..f6fbe206d69 --- /dev/null +++ b/libraries/tools/kotlin-maven-plugin-test/src/it/test-kapt-annotationProcessorPaths-without-version/annotation-processor-second-version/src/main/kotlin/ExampleAnnotationProcessor.kt @@ -0,0 +1,46 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package example + +import java.io.File +import javax.annotation.processing.AbstractProcessor +import javax.annotation.processing.RoundEnvironment +import javax.lang.model.SourceVersion +import javax.lang.model.element.ElementKind +import javax.lang.model.element.TypeElement +import javax.tools.Diagnostic +import kotlin.reflect.KClass + +annotation class Anno + +class ExampleAnnotationProcessor : AbstractProcessor() { + private companion object { + val KAPT_KOTLIN_GENERATED_OPTION = "kapt.kotlin.generated" + } + + override fun process(annotations: MutableSet?, roundEnv: RoundEnvironment): Boolean { + val elements = roundEnv.getElementsAnnotatedWith(Anno::class.java) + val kotlinGenerated = processingEnv.options[KAPT_KOTLIN_GENERATED_OPTION] + + for (element in elements) { + val packageName = processingEnv.elementUtils.getPackageOf(element).qualifiedName.toString() + val simpleName = element.simpleName.toString() + + if (kotlinGenerated != null && element.kind == ElementKind.CLASS) { + File(kotlinGenerated, "$simpleName.kt").writer().buffered().use { + it.appendLine("package $packageName") + it.appendLine("fun $simpleName.customToString() = \"$simpleName: \" + toString()") + } + } + } + + return true + } + + override fun getSupportedSourceVersion() = SourceVersion.RELEASE_6 + override fun getSupportedAnnotationTypes() = setOf(Anno::class.java.name) + override fun getSupportedOptions() = emptySet() +} \ No newline at end of file diff --git a/libraries/tools/kotlin-maven-plugin-test/src/it/test-kapt-annotationProcessorPaths-without-version/app-with-kapt/pom.xml b/libraries/tools/kotlin-maven-plugin-test/src/it/test-kapt-annotationProcessorPaths-without-version/app-with-kapt/pom.xml new file mode 100644 index 00000000000..5694dec9530 --- /dev/null +++ b/libraries/tools/kotlin-maven-plugin-test/src/it/test-kapt-annotationProcessorPaths-without-version/app-with-kapt/pom.xml @@ -0,0 +1,72 @@ + + + + 4.0.0 + + org.jetbrains.kotlin.testkapt + app-with-kapt + 1.0-SNAPSHOT + + + 4.13.1 + UTF-8 + + + + + org.jetbrains.kotlin.testkapt + annotation-processor-second-version + 2.0-SNAPSHOT + + + org.jetbrains.kotlin + kotlin-stdlib + ${kotlin.version} + + + + + + + kotlin-maven-plugin + org.jetbrains.kotlin + ${kotlin.version} + + + kapt + + kapt + + + + src/main/kotlin + + + example.ExampleAnnotationProcessor + + + + org.jetbrains.kotlin.testkapt + annotation-processor-second-version + + + + + + compile + + compile + + + + src/main/kotlin + + + + + + + + diff --git a/libraries/tools/kotlin-maven-plugin-test/src/it/test-kapt-annotationProcessorPaths-without-version/app-with-kapt/src/main/kotlin/test.kt b/libraries/tools/kotlin-maven-plugin-test/src/it/test-kapt-annotationProcessorPaths-without-version/app-with-kapt/src/main/kotlin/test.kt new file mode 100755 index 00000000000..c18d6a3057c --- /dev/null +++ b/libraries/tools/kotlin-maven-plugin-test/src/it/test-kapt-annotationProcessorPaths-without-version/app-with-kapt/src/main/kotlin/test.kt @@ -0,0 +1,8 @@ +package test + +@example.Anno +class MyClass { + fun test() { + println(this.customToString()) + } +} diff --git a/libraries/tools/kotlin-maven-plugin-test/src/it/test-kapt-annotationProcessorPaths-without-version/pom.xml b/libraries/tools/kotlin-maven-plugin-test/src/it/test-kapt-annotationProcessorPaths-without-version/pom.xml new file mode 100644 index 00000000000..0f6de0ab465 --- /dev/null +++ b/libraries/tools/kotlin-maven-plugin-test/src/it/test-kapt-annotationProcessorPaths-without-version/pom.xml @@ -0,0 +1,16 @@ + + + 4.0.0 + + org.jetbrains.kotlin.testkapt + test-kapt-annotationProcessorPaths-without-version + 1.0-SNAPSHOT + + annotation-processor-second-version + app-with-kapt + + pom + + \ No newline at end of file diff --git a/libraries/tools/kotlin-maven-plugin-test/src/it/test-kapt-annotationProcessorPaths-without-version/verify.bsh b/libraries/tools/kotlin-maven-plugin-test/src/it/test-kapt-annotationProcessorPaths-without-version/verify.bsh new file mode 100644 index 00000000000..46d94c29439 --- /dev/null +++ b/libraries/tools/kotlin-maven-plugin-test/src/it/test-kapt-annotationProcessorPaths-without-version/verify.bsh @@ -0,0 +1,6 @@ +import java.io.*; + +File file = new File(basedir, "app-with-kapt/target/app-with-kapt-1.0-SNAPSHOT.jar"); +if (!file.exists() || !file.isFile()) { + throw new FileNotFoundException("Could not find generated JAR: " + file); +} diff --git a/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/kapt/AnnotationProcessingManager.java b/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/kapt/AnnotationProcessingManager.java index 594687f1e64..d097f470d2f 100644 --- a/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/kapt/AnnotationProcessingManager.java +++ b/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/kapt/AnnotationProcessingManager.java @@ -25,6 +25,7 @@ import org.apache.maven.artifact.resolver.ArtifactResolutionResult; import org.apache.maven.artifact.resolver.ResolutionErrorHandler; import org.apache.maven.artifact.versioning.VersionRange; import org.apache.maven.execution.MavenSession; +import org.apache.maven.model.Dependency; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.compiler.DependencyCoordinate; import org.apache.maven.project.MavenProject; @@ -167,7 +168,7 @@ public class AnnotationProcessingManager { return new DefaultArtifact( dependency.getGroupId(), dependency.getArtifactId(), - VersionRange.createFromVersionSpec(dependency.getVersion()), + VersionRange.createFromVersionSpec(evaluateVersion(dependency)), Artifact.SCOPE_RUNTIME, dependency.getType(), dependency.getClassifier(), @@ -175,6 +176,21 @@ public class AnnotationProcessingManager { false); } + private String evaluateVersion(@NotNull DependencyCoordinate dependency) { + String version = dependency.getVersion(); + if (version == null) { + Optional sameButParentDependency = project.getDependencies().stream() + .filter(dep -> dep.getGroupId().equals(dependency.getGroupId()) + && dep.getArtifactId().equals(dependency.getArtifactId()) + && dep.getVersion() != null + ).findFirst(); + if (sameButParentDependency.isPresent()) { + version = sameButParentDependency.get().getVersion(); + } + } + return version; + } + @NotNull private static String getMavenPluginVersion() throws MojoExecutionException { ClassLoader classLoader = AnnotationProcessingManager.class.getClassLoader();