diff --git a/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/annotations.xml b/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/annotations.xml index bef387a3e38..dc5cd1bbcbe 100644 --- a/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/annotations.xml +++ b/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/annotations.xml @@ -10,4 +10,9 @@ + + + + + \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/initialization/dsl/annotations.xml b/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/initialization/dsl/annotations.xml new file mode 100644 index 00000000000..a33a584b9ed --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/initialization/dsl/annotations.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/internal/annotations.xml b/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/internal/annotations.xml index 763aaf5197f..c14ebed20ae 100644 --- a/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/internal/annotations.xml +++ b/libraries/tools/kotlin-gradle-plugin/kotlinAnnotation/org/gradle/api/internal/annotations.xml @@ -7,4 +7,9 @@ + + + + + \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/pom.xml b/libraries/tools/kotlin-gradle-plugin/pom.xml index af6d7e7f215..f3602e2ce62 100644 --- a/libraries/tools/kotlin-gradle-plugin/pom.xml +++ b/libraries/tools/kotlin-gradle-plugin/pom.xml @@ -26,6 +26,11 @@ 4.11 test + + commons-lang + commons-lang + 2.3 + com.google.guava guava @@ -47,6 +52,11 @@ kotlin-compiler ${project.version} + + org.jetbrains.kotlin + kotlin-jdk-annotations + ${project.version} + org.jetbrains.kotlin kdoc @@ -71,6 +81,9 @@ kotlin-jdk-annotations.jar false + + ${project.basedir}/src/main/resources + diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt index 5504585efe0..7422d5f491d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt @@ -30,12 +30,21 @@ import org.gradle.api.logging.Logger import org.gradle.api.logging.Logging import org.apache.commons.io.FileUtils import java.io.IOException +import org.apache.commons.lang.StringUtils +import org.gradle.api.initialization.dsl.ScriptHandler public open class KotlinCompile(): AbstractCompile() { val srcDirsRoots = HashSet() val compiler = K2JVMCompiler() - val logger = getLogger() + val logger = Logging.getLogger(getClass()) + + public val kotlinOptions: K2JVMCompilerArguments = K2JVMCompilerArguments(); + + { + kotlinOptions.noStdlib = true + kotlinOptions.noJdkAnnotations = true + } // override setSource to track source directory sets override fun setSource(source: Any?) { @@ -70,7 +79,7 @@ public open class KotlinCompile(): AbstractCompile() { override fun compile() { - val args = K2JVMCompilerArguments() + val args = kotlinOptions val javaSrcRoots = HashSet() val sources = ArrayList() @@ -92,31 +101,25 @@ public open class KotlinCompile(): AbstractCompile() { return } - args.setSourceDirs(sources.map { it.getAbsolutePath() }) + val customSources = args.getSourceDirs(); + if (customSources == null || customSources.isEmpty()) { + args.setSourceDirs(sources.map { it.getAbsolutePath() }) + } - val gradleClasspath = getClasspath() - val effectiveClassPath = (javaSrcRoots + gradleClasspath).makeString(File.pathSeparator) - args.setClasspath(effectiveClassPath) + if (StringUtils.isEmpty(kotlinOptions.classpath)) { + val existingClasspathEntries = getClasspath().filter(KSpec({ it != null && it.exists() })) + val effectiveClassPath = (javaSrcRoots + existingClasspathEntries).makeString(File.pathSeparator) + args.setClasspath(effectiveClassPath) + } val embeddedAnnotations = getAnnotations() + args.outputDir =if (StringUtils.isEmpty(kotlinOptions.outputDir)) { getDestinationDir()?.getPath() } else { kotlinOptions.outputDir } + args.annotations = if (StringUtils.isEmpty(kotlinOptions.annotations)) { embeddedAnnotations.getPath() } else { kotlinOptions.annotations } - args.outputDir = getDestinationDir()?.getPath() - args.noJdkAnnotations = true - args.annotations = embeddedAnnotations.getPath() - args.noStdlib = true - - val logger = Logging.getLogger(getClass()) val messageCollector = GradleMessageCollector(logger) val exitCode = compiler.exec(messageCollector, args) - val annotationsDir = embeddedAnnotations.getParentFile() - try { - FileUtils.deleteDirectory(annotationsDir); - } catch (e : IOException) { - logger.warn("Could not delete temporary annotations directory " + annotationsDir, e) - } - when (exitCode) { ExitCode.COMPILATION_ERROR -> throw GradleException("Compilation error. See log for more details") ExitCode.INTERNAL_ERROR -> throw GradleException("Internal compiler error. See log for more details") @@ -125,20 +128,26 @@ public open class KotlinCompile(): AbstractCompile() { } fun getAnnotations(): File { - val jdkAnnotations: String = "kotlin-jdk-annotations.jar" - val jdkAnnotationsResource = Resources.getResource(jdkAnnotations) ?: - throw GradleException(jdkAnnotations + " not found in Kotlin gradle plugin classpath") + val configuration = getProject() + .getBuildscript() + .getConfigurations() + .getByName(ScriptHandler.CLASSPATH_CONFIGURATION)!! - val jdkAnnotationsTempDir = Files.createTempDir() - val jdkAnnotationsFile = File(jdkAnnotationsTempDir, jdkAnnotations) + val jdkAnnotationsFromClasspath = configuration.find { it.name.startsWith("kotlin-jdk-annotations") } - Files.copy(Resources.newInputStreamSupplier(jdkAnnotationsResource), jdkAnnotationsFile) - return jdkAnnotationsFile + if (jdkAnnotationsFromClasspath != null) { + logger.info("using jdk annontations from [${jdkAnnotationsFromClasspath.getAbsolutePath()}]") + return jdkAnnotationsFromClasspath + } else { + throw GradleException("kotlin-jdk-annotations not found in Kotlin gradle plugin classpath") + } } } public open class KDoc(): SourceTask() { + val logger = Logging.getLogger(getClass()) + /** * Returns the directory to use to output the API docs */ @@ -210,7 +219,6 @@ public open class KDoc(): SourceTask() { val compiler = KDocCompiler() - val logger = Logging.getLogger(getClass()) val messageCollector = GradleMessageCollector(logger) val exitCode = compiler.exec(messageCollector, args); @@ -231,10 +239,10 @@ class GradleMessageCollector(val logger : Logger): MessageCollector { val text = position + message when (severity) { - in CompilerMessageSeverity.VERBOSE -> logger.debug(text) - in CompilerMessageSeverity.ERRORS -> logger.error(text) - CompilerMessageSeverity.INFO -> logger.info(text) - else -> logger.warn(text) + in CompilerMessageSeverity.VERBOSE -> logger.debug(text) + in CompilerMessageSeverity.ERRORS -> logger.error(text) + CompilerMessageSeverity.INFO -> logger.info(text) + else -> logger.warn(text) } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/gradle-plugins/kotlin.properties b/libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/gradle-plugins/kotlin.properties new file mode 100644 index 00000000000..4f8cd030af6 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/gradle-plugins/kotlin.properties @@ -0,0 +1 @@ +implementation-class=org.jetbrains.kotlin.gradle.plugin.KotlinPlugin \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/alfa/build.gradle b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/alfa/build.gradle index 9c5b7f1b94e..76b840fbf4e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/alfa/build.gradle +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/alfa/build.gradle @@ -1,4 +1,3 @@ -import org.jetbrains.kotlin.gradle.plugin.* buildscript { repositories { mavenCentral() @@ -11,7 +10,7 @@ buildscript { } } -apply plugin: KotlinPlugin +apply plugin: "kotlin" sourceSets { deploy @@ -32,6 +31,12 @@ task show << { buildscript.configurations.classpath.each { println it } } + +compileKotlin { + kotlinOptions.annotations = "externalAnnotations" +} + + task wrapper(type: Wrapper) { gradleVersion="1.4" } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/alfa/externalAnnotations/com/google/common/base/annotations.xml b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/alfa/externalAnnotations/com/google/common/base/annotations.xml new file mode 100644 index 00000000000..be8ddab04a3 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/alfa/externalAnnotations/com/google/common/base/annotations.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/alfa/src/main/kotlin/helloWorld.kt b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/alfa/src/main/kotlin/helloWorld.kt index 710e6b06dc4..b3e99bbdd59 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/alfa/src/main/kotlin/helloWorld.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/alfa/src/main/kotlin/helloWorld.kt @@ -13,8 +13,8 @@ class KotlinGreetingJoiner(val greeter : Greeter) { } fun getJoinedGreeting() : String? { - val joiner = Joiner.on(" and ")?.skipNulls(); - return "${greeter.getGreeting()} ${joiner?.join(names)}" + val joiner = Joiner.on(" and ").skipNulls(); + return "${greeter.getGreeting()} ${joiner.join(names)}" } }