Support kotlin-android-sdk-annotations in gradle plugin

This commit is contained in:
Nikita Skvortsov
2013-08-08 21:09:15 +04:00
parent 6bb1474ee8
commit 405465fd25
16 changed files with 171 additions and 100 deletions
@@ -1,29 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<root> <root>
<item name="org.gradle.api.NamedDomainObjectCollection T getByName(java.lang.String)"> <item name="org.gradle.api.NamedDomainObjectCollection T getByName(java.lang.String)">
<annotation name="org.jetbrains.annotations.NotNull" /> <annotation name="org.jetbrains.annotations.NotNull" />
</item> </item>
<item name="org.gradle.api.Plugin void apply(T)"> <item name="org.gradle.api.Plugin void apply(T)">
<annotation name="jet.runtime.typeinfo.KotlinSignature"> <annotation name="jet.runtime.typeinfo.KotlinSignature">
<val name="value" val="&quot;fun apply(p0 : T) : Unit&quot;" /> <val name="value" val="&quot;fun apply(p0 : T) : Unit&quot;" />
</annotation> </annotation>
</item> </item>
<item name="org.gradle.api.Project org.gradle.api.file.ConfigurableFileCollection files(java.lang.Object...)"> <item name="org.gradle.api.Project org.gradle.api.file.ConfigurableFileCollection files(java.lang.Object...)">
<annotation name="org.jetbrains.annotations.NotNull" /> <annotation name="org.jetbrains.annotations.NotNull" />
</item> </item>
<item name="org.gradle.api.Project org.gradle.api.initialization.dsl.ScriptHandler getBuildscript()"> <item name="org.gradle.api.Project org.gradle.api.initialization.dsl.ScriptHandler getBuildscript()">
<annotation name="jet.runtime.typeinfo.KotlinSignature"> <annotation name="jet.runtime.typeinfo.KotlinSignature">
<val name="value" val="&quot;fun getBuildscript() : ScriptHandler&quot;" /> <val name="value" val="&quot;fun getBuildscript() : ScriptHandler&quot;" />
</annotation> </annotation>
</item> </item>
<item name="org.gradle.api.Project org.gradle.api.logging.Logger getLogger()"> <item name="org.gradle.api.Project org.gradle.api.logging.Logger getLogger()">
<annotation name="org.jetbrains.annotations.NotNull" /> <annotation name="org.jetbrains.annotations.NotNull" />
</item> </item>
<item name="org.gradle.api.Project org.gradle.api.plugins.Convention getConvention()"> <item name="org.gradle.api.Project org.gradle.api.plugins.Convention getConvention()">
<annotation name="org.jetbrains.annotations.NotNull" /> <annotation name="org.jetbrains.annotations.NotNull" />
</item> </item>
<item name="org.gradle.api.Project org.gradle.api.plugins.PluginContainer getPlugins()"> <item name='org.gradle.api.Project org.gradle.api.plugins.ExtensionContainer getExtensions()'>
<annotation name="org.jetbrains.annotations.NotNull" /> <annotation name='org.jetbrains.annotations.NotNull'/>
</item> </item>
<item name="org.gradle.api.Project org.gradle.api.plugins.PluginContainer getPlugins()">
<annotation name="org.jetbrains.annotations.NotNull" />
</item>
</root> </root>
@@ -0,0 +1,8 @@
<root>
<item name='org.gradle.api.artifacts.Configuration org.gradle.api.artifacts.ResolvedConfiguration getResolvedConfiguration()'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
<item name='org.gradle.api.artifacts.ConfigurationContainer org.gradle.api.artifacts.Configuration detachedConfiguration(org.gradle.api.artifacts.Dependency...)'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
</root>
@@ -0,0 +1,5 @@
<root>
<item name='org.gradle.api.artifacts.dsl.DependencyHandler org.gradle.api.artifacts.Dependency create(java.lang.Object)'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
</root>
@@ -4,4 +4,7 @@
<val name="value" val="&quot;fun getConfigurations() : ConfigurationContainer&quot;"/> <val name="value" val="&quot;fun getConfigurations() : ConfigurationContainer&quot;"/>
</annotation> </annotation>
</item> </item>
<item name='org.gradle.api.initialization.dsl.ScriptHandler org.gradle.api.artifacts.dsl.DependencyHandler getDependencies()'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
</root> </root>
@@ -33,6 +33,10 @@ import com.android.builder.model.BuildType
import com.android.builder.BuilderConstants import com.android.builder.BuilderConstants
import com.android.build.gradle.api.TestVariant import com.android.build.gradle.api.TestVariant
import org.gradle.api.plugins.JavaPlugin import org.gradle.api.plugins.JavaPlugin
import org.gradle.api.artifacts.dsl.DependencyHandler
import org.gradle.api.artifacts.ConfigurationContainer
import org.gradle.api.artifacts.Dependency
import java.util.HashSet
open class KotlinPlugin: Plugin<Project> { open class KotlinPlugin: Plugin<Project> {
@@ -44,6 +48,9 @@ open class KotlinPlugin: Plugin<Project> {
configureSourceSetDefaults(project as ProjectInternal, javaBasePlugin, javaPluginConvention) configureSourceSetDefaults(project as ProjectInternal, javaBasePlugin, javaPluginConvention)
configureKDoc(project, javaPluginConvention) configureKDoc(project, javaPluginConvention)
val version = project.getProperties()!!.get("kotlin.gradle.plugin.version") as String
project.getExtensions().add(KotlinCompile.DEFAULT_ANNOTATIONS, GradleUtils.resolveDependencies(project, "org.jetbrains.kotlin:kotlin-jdk-annotations:$version"))
} }
@@ -159,6 +166,9 @@ open class KotlinAndroidPlugin: Plugin<Project> {
} }
}) })
val version = project.getProperties()!!.get("kotlin.gradle.plugin.version") as String
project.getExtensions().add(KotlinCompile.DEFAULT_ANNOTATIONS, GradleUtils.resolveDependencies(project, "org.jetbrains.kotlin:kotlin-jdk-annotations:$version",
"org.jetbrains.kotlin:kotlin-android-sdk-annotations:$version"));
} }
private fun processVariants(variants: DefaultDomainObjectSet<out BaseVariant>, project: Project, androidExt: BaseExtension): Unit { private fun processVariants(variants: DefaultDomainObjectSet<out BaseVariant>, project: Project, androidExt: BaseExtension): Unit {
@@ -258,3 +268,22 @@ open class KSpec<T: Any?>(val predicate: (T) -> Boolean): Spec<T> {
return p0 != null && predicate(p0) return p0 != null && predicate(p0)
} }
} }
open class GradleUtils() {
class object {
public fun resolveDependencies(project: Project, vararg coordinates: String): Collection<File> {
val dependencyHandler : DependencyHandler = project.getBuildscript().getDependencies()
val configurationsContainer : ConfigurationContainer = project.getBuildscript().getConfigurations()
val deps = HashSet<Dependency>()
for (coordinate in coordinates) {
deps.add(dependencyHandler.create(coordinate))
}
val array : Array<Dependency?> = deps.toArray(Array<Dependency?>(deps.size(),{null}))
val configuration = configurationsContainer.detachedConfiguration(*array)
return configuration.getResolvedConfiguration().getFiles(KSpec({ dep -> true }))!!
}
}
}
@@ -27,6 +27,10 @@ import org.apache.commons.io.FileUtils
public open class KotlinCompile(): AbstractCompile() { public open class KotlinCompile(): AbstractCompile() {
class object {
val DEFAULT_ANNOTATIONS = "org.jebrains.kotlin.gradle.defaultAnnotations"
}
val srcDirsRoots = HashSet<File>() val srcDirsRoots = HashSet<File>()
val compiler = K2JVMCompiler() val compiler = K2JVMCompiler()
val logger = Logging.getLogger(getClass()) val logger = Logging.getLogger(getClass())
@@ -105,7 +109,7 @@ public open class KotlinCompile(): AbstractCompile() {
val embeddedAnnotations = getAnnotations() val embeddedAnnotations = getAnnotations()
val userAnnotations = (kotlinOptions.annotations ?: "").split(File.pathSeparatorChar).toList() val userAnnotations = (kotlinOptions.annotations ?: "").split(File.pathSeparatorChar).toList()
val allAnnotations = if (kotlinOptions.noJdkAnnotations) userAnnotations else userAnnotations.plus(embeddedAnnotations.getPath()) val allAnnotations = if (kotlinOptions.noJdkAnnotations) userAnnotations else userAnnotations.plus(embeddedAnnotations.map {it.getPath()})
args.annotations = allAnnotations.makeString(File.pathSeparator) args.annotations = allAnnotations.makeString(File.pathSeparator)
args.noStdlib = true args.noStdlib = true
@@ -124,19 +128,14 @@ public open class KotlinCompile(): AbstractCompile() {
FileUtils.copyDirectory(kotlinDestinationDir, getDestinationDir()) FileUtils.copyDirectory(kotlinDestinationDir, getDestinationDir())
} }
fun getAnnotations(): File { fun getAnnotations(): Collection<File> {
val configuration = getProject() val annotations = getProject().getExtensions().getByName(DEFAULT_ANNOTATIONS) as Collection<File>
.getBuildscript()
.getConfigurations()
.getByName(ScriptHandler.CLASSPATH_CONFIGURATION)!!
val jdkAnnotationsFromClasspath = configuration.find { it.name.startsWith("kotlin-jdk-annotations") } if (!annotations.isEmpty()) {
logger.info("using default annontations from [${annotations.map {it.getPath()}}]")
if (jdkAnnotationsFromClasspath != null) { return annotations
logger.info("using jdk annontations from [${jdkAnnotationsFromClasspath.getAbsolutePath()}]")
return jdkAnnotationsFromClasspath
} else { } else {
throw GradleException("kotlin-jdk-annotations not found in Kotlin gradle plugin classpath") throw GradleException("Default annotations not found in Kotlin gradle plugin classpath")
} }
} }
} }
@@ -30,11 +30,12 @@ class BasicKotlinGradleIT {
Test fun testSimpleCompile() { Test fun testSimpleCompile() {
val projectDir = File(workingDir, "alfa") val projectDir = File(workingDir, "alfa")
val pathToKotlinPlugin = "-PpathToKotlinPlugin=" + File("local-repo").getAbsolutePath() val pathToKotlinPlugin = "-PpathToKotlinPlugin=${File("local-repo").getAbsolutePath()}"
val version = "-Pkotlin.gradle.plugin.version=0.1-SNAPSHOT"
val cmd = if (SystemInfo.isWindows) val cmd = if (SystemInfo.isWindows)
listOf("cmd", "/C", "gradlew.bat", "compileDeployKotlin", "build", pathToKotlinPlugin, "--no-daemon", "--debug") listOf("cmd", "/C", "gradlew.bat", "compileDeployKotlin", "build", pathToKotlinPlugin, version, "--no-daemon", "--debug")
else else
listOf("/bin/bash", "./gradlew", "compileDeployKotlin", "build", pathToKotlinPlugin, "--no-daemon", "--debug") listOf("/bin/bash", "./gradlew", "compileDeployKotlin", "build", pathToKotlinPlugin, version, "--no-daemon", "--debug")
val builder = ProcessBuilder(cmd) val builder = ProcessBuilder(cmd)
builder.directory(projectDir) builder.directory(projectDir)
@@ -1,18 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<root> <root>
<item name='org.gradle.api.Plugin void apply(T)'> <item name="org.gradle.api.NamedDomainObjectCollection T getByName(java.lang.String)">
<annotation name='jet.runtime.typeinfo.KotlinSignature'> <annotation name="org.jetbrains.annotations.NotNull" />
<val name="value" val="&quot;fun apply(p0 : T) : Unit&quot;"/>
</annotation>
</item> </item>
<item name='org.gradle.api.Project org.gradle.api.plugins.PluginContainer getPlugins()'> <item name="org.gradle.api.Plugin void apply(T)">
<annotation name="jet.runtime.typeinfo.KotlinSignature">
<val name="value" val="&quot;fun apply(p0 : T) : Unit&quot;" />
</annotation>
</item>
<item name="org.gradle.api.Project org.gradle.api.file.ConfigurableFileCollection files(java.lang.Object...)">
<annotation name="org.jetbrains.annotations.NotNull" />
</item>
<item name="org.gradle.api.Project org.gradle.api.initialization.dsl.ScriptHandler getBuildscript()">
<annotation name="jet.runtime.typeinfo.KotlinSignature">
<val name="value" val="&quot;fun getBuildscript() : ScriptHandler&quot;" />
</annotation>
</item>
<item name="org.gradle.api.Project org.gradle.api.logging.Logger getLogger()">
<annotation name="org.jetbrains.annotations.NotNull" />
</item>
<item name="org.gradle.api.Project org.gradle.api.plugins.Convention getConvention()">
<annotation name="org.jetbrains.annotations.NotNull" />
</item>
<item name='org.gradle.api.Project org.gradle.api.plugins.ExtensionContainer getExtensions()'>
<annotation name='org.jetbrains.annotations.NotNull'/> <annotation name='org.jetbrains.annotations.NotNull'/>
</item> </item>
<item name='org.gradle.api.Project org.gradle.api.plugins.Convention getConvention()'> <item name="org.gradle.api.Project org.gradle.api.plugins.PluginContainer getPlugins()">
<annotation name='org.jetbrains.annotations.NotNull'/> <annotation name="org.jetbrains.annotations.NotNull" />
</item> </item>
<item name='org.gradle.api.Project org.gradle.api.initialization.dsl.ScriptHandler getBuildscript()'> </root>
<annotation name='jet.runtime.typeinfo.KotlinSignature'>
<val name="value" val="&quot;fun getBuildscript() : ScriptHandler&quot;"/>
</annotation>
</item>
</root>
@@ -2,4 +2,7 @@
<item name='org.gradle.api.artifacts.Configuration org.gradle.api.artifacts.ResolvedConfiguration getResolvedConfiguration()'> <item name='org.gradle.api.artifacts.Configuration org.gradle.api.artifacts.ResolvedConfiguration getResolvedConfiguration()'>
<annotation name='org.jetbrains.annotations.NotNull'/> <annotation name='org.jetbrains.annotations.NotNull'/>
</item> </item>
<item name='org.gradle.api.artifacts.ConfigurationContainer org.gradle.api.artifacts.Configuration detachedConfiguration(org.gradle.api.artifacts.Dependency...)'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
</root> </root>
@@ -2,4 +2,7 @@
<item name='org.gradle.api.file.FileCollection org.gradle.api.file.FileCollection filter(org.gradle.api.specs.Spec&lt;? super java.io.File&gt;)'> <item name='org.gradle.api.file.FileCollection org.gradle.api.file.FileCollection filter(org.gradle.api.specs.Spec&lt;? super java.io.File&gt;)'>
<annotation name='org.jetbrains.annotations.NotNull'/> <annotation name='org.jetbrains.annotations.NotNull'/>
</item> </item>
<item name='org.gradle.api.file.SourceDirectorySet java.util.Set&lt;java.io.File&gt; getSrcDirs()'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
</root> </root>
@@ -5,8 +5,6 @@
</annotation> </annotation>
</item> </item>
<item name='org.gradle.api.initialization.dsl.ScriptHandler org.gradle.api.artifacts.dsl.DependencyHandler getDependencies()'> <item name='org.gradle.api.initialization.dsl.ScriptHandler org.gradle.api.artifacts.dsl.DependencyHandler getDependencies()'>
<annotation name='jet.runtime.typeinfo.KotlinSignature'> <annotation name='org.jetbrains.annotations.NotNull'/>
<val name="value" val="&quot;fun getDependencies() : DependencyHandler&quot;"/>
</annotation>
</item> </item>
</root> </root>
@@ -1,15 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<root> <root>
<item name='org.gradle.api.internal.HasConvention org.gradle.api.plugins.Convention getConvention()'> <item name="org.gradle.api.internal.AbstractTask org.gradle.api.Project getProject()">
<annotation name='jet.runtime.typeinfo.KotlinSignature'> <annotation name="jet.runtime.typeinfo.KotlinSignature">
<val name="value" val="&quot;fun getConvention() : Convention&quot;"/> <val name="value" val="&quot;fun getProject() : Project&quot;" />
</annotation> </annotation>
</item> </item>
<item name='org.gradle.api.internal.AbstractTask org.gradle.api.logging.Logger getLogger()'> <item name="org.gradle.api.internal.AbstractTask org.gradle.api.logging.Logger getLogger()">
<annotation name='org.jetbrains.annotations.NotNull'/> <annotation name="org.jetbrains.annotations.NotNull" />
</item> </item>
<item name='org.gradle.api.internal.AbstractTask org.gradle.api.Project getProject()'> <item name="org.gradle.api.internal.HasConvention org.gradle.api.plugins.Convention getConvention()">
<annotation name='jet.runtime.typeinfo.KotlinSignature'> <annotation name="jet.runtime.typeinfo.KotlinSignature">
<val name="value" val="&quot;fun getProject() : Project&quot;"/> <val name="value" val="&quot;fun getConvention() : Convention&quot;" />
</annotation> </annotation>
</item> </item>
</root> </root>
@@ -1,22 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<root> <root>
<item name='org.gradle.api.plugins.Convention java.util.Map&lt;java.lang.String,java.lang.Object&gt; getPlugins()'> <item name="org.gradle.api.plugins.Convention T getPlugin(java.lang.Class&lt;T&gt;)">
<annotation name='jet.runtime.typeinfo.KotlinSignature'> <annotation name="org.jetbrains.annotations.NotNull" />
<val name="value" val="&quot;fun getPlugins() : MutableMap&lt;String, Any&gt;&quot;"/> </item>
</annotation> <item name="org.gradle.api.plugins.Convention java.util.Map&lt;java.lang.String,java.lang.Object&gt; getPlugins()">
</item> <annotation name="jet.runtime.typeinfo.KotlinSignature">
<item name='org.gradle.api.plugins.Convention org.gradle.api.internal.DynamicObject getExtensionsAsDynamicObject()'> <val name="value" val="&quot;fun getPlugins() : MutableMap&lt;String, Any&gt;&quot;" />
<annotation name='org.jetbrains.annotations.NotNull'/> </annotation>
<annotation name='jet.runtime.typeinfo.KotlinSignature'> </item>
<val name="value" val="&quot;fun getExtensionsAsDynamicObject() : DynamicObject&quot;"/> <item name="org.gradle.api.plugins.Convention org.gradle.api.internal.DynamicObject getExtensionsAsDynamicObject()">
</annotation> <annotation name="org.jetbrains.annotations.NotNull" />
</item> <annotation name="jet.runtime.typeinfo.KotlinSignature">
<item name='org.gradle.api.plugins.PluginContainer org.gradle.api.Plugin apply(java.lang.String)'> <val name="value" val="&quot;fun getExtensionsAsDynamicObject() : DynamicObject&quot;" />
<annotation name='org.jetbrains.annotations.NotNull'/> </annotation>
</item> </item>
<item name='org.gradle.api.plugins.PluginContainer T apply(java.lang.Class&lt;T&gt;)'> <item name="org.gradle.api.plugins.ExtensionAware org.gradle.api.plugins.ExtensionContainer getExtensions()">
<annotation name='org.jetbrains.annotations.NotNull'/> <annotation name="org.jetbrains.annotations.NotNull" />
</item> </item>
<item name='org.gradle.api.plugins.Convention T getPlugin(java.lang.Class&lt;T&gt;)'> <item name="org.gradle.api.plugins.PluginContainer T apply(java.lang.Class&lt;T&gt;)">
<annotation name='org.jetbrains.annotations.NotNull'/> <annotation name="org.jetbrains.annotations.NotNull" />
</item> </item>
</root> <item name="org.gradle.api.plugins.PluginContainer org.gradle.api.Plugin apply(java.lang.String)">
<annotation name="org.jetbrains.annotations.NotNull" />
</item>
</root>
+2 -5
View File
@@ -25,11 +25,6 @@
<artifactId>kotlin-stdlib</artifactId> <artifactId>kotlin-stdlib</artifactId>
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-jdk-annotations</artifactId>
<version>${project.version}</version>
</dependency>
<dependency> <dependency>
<groupId>org.jetbrains.kotlin</groupId> <groupId>org.jetbrains.kotlin</groupId>
<artifactId>gradle-api</artifactId> <artifactId>gradle-api</artifactId>
@@ -91,6 +86,8 @@
<postBuildHookScript>verify</postBuildHookScript> <!-- no extension required --> <postBuildHookScript>verify</postBuildHookScript> <!-- no extension required -->
<extraArtifacts> <extraArtifacts>
<extraArtifact>org.jetbrains.kotlin:kotlin-gradle-plugin-core:${project.version}</extraArtifact> <extraArtifact>org.jetbrains.kotlin:kotlin-gradle-plugin-core:${project.version}</extraArtifact>
<extraArtifact>org.jetbrains.kotlin:kotlin-jdk-annotations:${project.version}</extraArtifact>
<extraArtifact>org.jetbrains.kotlin:kotlin-android-sdk-annotations:${project.version}</extraArtifact>
</extraArtifacts> </extraArtifacts>
</configuration> </configuration>
<executions> <executions>
@@ -12,7 +12,7 @@ import org.gradle.api.logging.Logging
import java.util.Properties import java.util.Properties
import java.io.FileNotFoundException import java.io.FileNotFoundException
open abstract class KotlinBasePluginWrapper: Plugin<Project> { abstract class KotlinBasePluginWrapper: Plugin<Project> {
val log = Logging.getLogger(getClass())!! val log = Logging.getLogger(getClass())!!
@@ -31,8 +31,9 @@ open abstract class KotlinBasePluginWrapper: Plugin<Project> {
props.load(inputStream); props.load(inputStream);
val projectVersion = props.get("project.version") val projectVersion = props.get("project.version") as String
log.debug("Found project version [" + projectVersion + "]") log.debug("Found project version [$projectVersion]")
project.getExtensions().getExtraProperties()?.set("kotlin.gradle.plugin.version", projectVersion)
log.debug("Creating configuration and dependency") log.debug("Creating configuration and dependency")
val kotlinPluginCoreCoordinates = "org.jetbrains.kotlin:kotlin-gradle-plugin-core:" + projectVersion val kotlinPluginCoreCoordinates = "org.jetbrains.kotlin:kotlin-gradle-plugin-core:" + projectVersion
@@ -16,7 +16,7 @@ open class MainActivity2: Activity() {
var next: Button = findViewById(R.id.Button02) as Button var next: Button = findViewById(R.id.Button02) as Button
next.setOnClickListener(object: View.OnClickListener { next.setOnClickListener(object: View.OnClickListener {
public override fun onClick(view: View?): Unit { public override fun onClick(view: View): Unit {
val intent: Intent = Intent() val intent: Intent = Intent()
setResult(Activity.RESULT_OK, intent) setResult(Activity.RESULT_OK, intent)
finish() finish()