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)}"
}
}