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();