Introduce common interface for common gradle options

This might be useful for future kotlin build scripts
This commit is contained in:
Alexey Tsvetkov
2016-10-20 19:17:10 +03:00
parent b7d97a3aa2
commit 0af7017836
7 changed files with 109 additions and 127 deletions
@@ -17,16 +17,14 @@
package org.jetbrains.kotlin.generators.arguments package org.jetbrains.kotlin.generators.arguments
import com.sampullara.cli.Argument import com.sampullara.cli.Argument
import org.jetbrains.kotlin.cli.common.arguments.DefaultValues import org.jetbrains.kotlin.cli.common.arguments.*
import org.jetbrains.kotlin.cli.common.arguments.GradleOption
import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.utils.Printer import org.jetbrains.kotlin.utils.Printer
import java.io.File import java.io.File
import java.io.PrintStream import java.io.PrintStream
import kotlin.reflect.KAnnotatedElement import kotlin.reflect.KAnnotatedElement
import kotlin.reflect.KProperty1 import kotlin.reflect.KProperty1
import kotlin.reflect.declaredMemberProperties
import kotlin.reflect.memberProperties import kotlin.reflect.memberProperties
// Additional properties that should be included in interface // Additional properties that should be included in interface
@@ -41,14 +39,23 @@ interface AdditionalGradleProperties {
fun generateKotlinGradleOptions(withPrinterToFile: (targetFile: File, Printer.()->Unit)->Unit) { fun generateKotlinGradleOptions(withPrinterToFile: (targetFile: File, Printer.()->Unit)->Unit) {
val srcDir = File("libraries/tools/kotlin-gradle-plugin/src/main/kotlin") val srcDir = File("libraries/tools/kotlin-gradle-plugin/src/main/kotlin")
val additionalGradleOptions = gradleOptions<AdditionalGradleProperties>()
// common interface
val commonInterfaceFqName = FqName("org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions")
val commonOptions = gradleOptions<CommonCompilerArguments>()
val additionalOptions = gradleOptions<AdditionalGradleProperties>()
withPrinterToFile(File(srcDir, commonInterfaceFqName)) {
generateInterface(commonInterfaceFqName,
commonOptions + additionalOptions)
}
// generate jvm interface // generate jvm interface
val jvmInterfaceFqName = FqName("org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions") val jvmInterfaceFqName = FqName("org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions")
val optionsFromK2JVMCompilerArguments = gradleOptions<K2JVMCompilerArguments>() val jvmOptions = gradleOptions<K2JVMCompilerArguments>()
withPrinterToFile(File(srcDir, jvmInterfaceFqName)) { withPrinterToFile(File(srcDir, jvmInterfaceFqName)) {
generateInterface(jvmInterfaceFqName, generateInterface(jvmInterfaceFqName,
optionsFromK2JVMCompilerArguments + additionalGradleOptions) jvmOptions,
parentType = commonInterfaceFqName)
} }
// generate jvm impl // generate jvm impl
@@ -58,16 +65,16 @@ fun generateKotlinGradleOptions(withPrinterToFile: (targetFile: File, Printer.()
generateImpl(jvmImplFqName, generateImpl(jvmImplFqName,
jvmInterfaceFqName, jvmInterfaceFqName,
k2JvmCompilerArgumentsFqName, k2JvmCompilerArgumentsFqName,
optionsFromK2JVMCompilerArguments) commonOptions + jvmOptions)
} }
// generate js interface // generate js interface
val jsInterfaceFqName = FqName("org.jetbrains.kotlin.gradle.dsl.KotlinJsOptions") val jsInterfaceFqName = FqName("org.jetbrains.kotlin.gradle.dsl.KotlinJsOptions")
val optionsFromK2JSCompilerArguments = gradleOptions<K2JSCompilerArguments>() val jsOptions = gradleOptions<K2JSCompilerArguments>()
withPrinterToFile(File(srcDir, jsInterfaceFqName)) { withPrinterToFile(File(srcDir, jsInterfaceFqName)) {
generateInterface(jsInterfaceFqName, generateInterface(jsInterfaceFqName,
optionsFromK2JSCompilerArguments + jsOptions,
additionalGradleOptions) parentType = commonInterfaceFqName)
} }
val k2JsCompilerArgumentsFqName = FqName(K2JSCompilerArguments::class.qualifiedName!!) val k2JsCompilerArgumentsFqName = FqName(K2JSCompilerArguments::class.qualifiedName!!)
@@ -76,7 +83,7 @@ fun generateKotlinGradleOptions(withPrinterToFile: (targetFile: File, Printer.()
generateImpl(jsImplFqName, generateImpl(jsImplFqName,
jsInterfaceFqName, jsInterfaceFqName,
k2JsCompilerArgumentsFqName, k2JsCompilerArgumentsFqName,
optionsFromK2JSCompilerArguments) commonOptions + jsOptions)
} }
} }
@@ -96,15 +103,16 @@ fun main(args: Array<String>) {
} }
private inline fun <reified T : Any> gradleOptions(): List<KProperty1<T, *>> = private inline fun <reified T : Any> gradleOptions(): List<KProperty1<T, *>> =
T::class.memberProperties.filter { it.findAnnotation<GradleOption>() != null }.sortedBy { it.name } T::class.declaredMemberProperties.filter { it.findAnnotation<GradleOption>() != null }.sortedBy { it.name }
private fun File(baseDir: File, fqName: FqName): File { private fun File(baseDir: File, fqName: FqName): File {
val fileRelativePath = fqName.asString().replace(".", "/") + ".kt" val fileRelativePath = fqName.asString().replace(".", "/") + ".kt"
return File(baseDir, fileRelativePath) return File(baseDir, fileRelativePath)
} }
private fun Printer.generateInterface(type: FqName, properties: List<KProperty1<*, *>>) { private fun Printer.generateInterface(type: FqName, properties: List<KProperty1<*, *>>, parentType: FqName? = null) {
generateDeclaration("interface", type) { val afterType = parentType?.let { " : $it" }
generateDeclaration("interface", type, afterType = afterType) {
for (property in properties) { for (property in properties) {
println() println()
generateDoc(property) generateDoc(property)
@@ -135,7 +143,7 @@ private fun Printer.generateImpl(
} }
println() println()
println("open fun updateArguments(args: $argsType) {") println("internal open fun updateArguments(args: $argsType) {")
withIndent { withIndent {
for (property in properties) { for (property in properties) {
val backingField = property.backingField() val backingField = property.backingField()
@@ -0,0 +1,38 @@
// DO NOT EDIT MANUALLY!
// Generated by org/jetbrains/kotlin/generators/arguments/GenerateGradleOptions.kt
package org.jetbrains.kotlin.gradle.dsl
interface KotlinCommonOptions {
/**
* Allow to use declarations only from the specified version of bundled libraries
* Possible values: "1.0", "1.1"
* Default value: "1.1"
*/
var apiVersion: kotlin.String
/**
* Provide source compatibility with specified language version
* Possible values: "1.0", "1.1"
* Default value: "1.1"
*/
var languageVersion: kotlin.String
/**
* Generate no warnings
* Default value: false
*/
var suppressWarnings: kotlin.Boolean
/**
* Enable verbose logging output
* Default value: false
*/
var verbose: kotlin.Boolean
/**
* A list of additional compiler arguments
* Default value: emptyList()
*/
var freeCompilerArgs: kotlin.collections.List<kotlin.String>
}
@@ -19,7 +19,7 @@ package org.jetbrains.kotlin.gradle.dsl
import groovy.lang.Closure import groovy.lang.Closure
import org.gradle.api.Task import org.gradle.api.Task
interface KotlinCompile<T> : Task { interface KotlinCompile<T : KotlinCommonOptions> : Task {
val kotlinOptions: T val kotlinOptions: T
fun kotlinOptions(fn: T.() -> Unit) { fun kotlinOptions(fn: T.() -> Unit) {
@@ -2,14 +2,7 @@
// Generated by org/jetbrains/kotlin/generators/arguments/GenerateGradleOptions.kt // Generated by org/jetbrains/kotlin/generators/arguments/GenerateGradleOptions.kt
package org.jetbrains.kotlin.gradle.dsl package org.jetbrains.kotlin.gradle.dsl
interface KotlinJsOptions { interface KotlinJsOptions : org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions {
/**
* Allow to use declarations only from the specified version of bundled libraries
* Possible values: "1.0", "1.1"
* Default value: "1.1"
*/
var apiVersion: kotlin.String
/** /**
* Generate kjsm-files (for creating libraries) * Generate kjsm-files (for creating libraries)
@@ -17,13 +10,6 @@ interface KotlinJsOptions {
*/ */
var kjsm: kotlin.Boolean var kjsm: kotlin.Boolean
/**
* Provide source compatibility with specified language version
* Possible values: "1.0", "1.1"
* Default value: "1.1"
*/
var languageVersion: kotlin.String
/** /**
* Whether a main function should be called * Whether a main function should be called
* Possible values: "call", "noCall" * Possible values: "call", "noCall"
@@ -62,28 +48,10 @@ interface KotlinJsOptions {
*/ */
var sourceMap: kotlin.Boolean var sourceMap: kotlin.Boolean
/**
* Generate no warnings
* Default value: false
*/
var suppressWarnings: kotlin.Boolean
/** /**
* Generate JS files for specific ECMA version * Generate JS files for specific ECMA version
* Possible values: "v5" * Possible values: "v5"
* Default value: "v5" * Default value: "v5"
*/ */
var target: kotlin.String var target: kotlin.String
/**
* Enable verbose logging output
* Default value: false
*/
var verbose: kotlin.Boolean
/**
* A list of additional compiler arguments
* Default value: emptyList()
*/
var freeCompilerArgs: kotlin.collections.List<kotlin.String>
} }
@@ -9,16 +9,26 @@ internal abstract class KotlinJsOptionsBase : org.jetbrains.kotlin.gradle.dsl.Ko
get() = apiVersionField ?: "1.1" get() = apiVersionField ?: "1.1"
set(value) { apiVersionField = value } set(value) { apiVersionField = value }
private var kjsmField: kotlin.Boolean? = null
override var kjsm: kotlin.Boolean
get() = kjsmField ?: true
set(value) { kjsmField = value }
private var languageVersionField: kotlin.String? = null private var languageVersionField: kotlin.String? = null
override var languageVersion: kotlin.String override var languageVersion: kotlin.String
get() = languageVersionField ?: "1.1" get() = languageVersionField ?: "1.1"
set(value) { languageVersionField = value } set(value) { languageVersionField = value }
private var suppressWarningsField: kotlin.Boolean? = null
override var suppressWarnings: kotlin.Boolean
get() = suppressWarningsField ?: false
set(value) { suppressWarningsField = value }
private var verboseField: kotlin.Boolean? = null
override var verbose: kotlin.Boolean
get() = verboseField ?: false
set(value) { verboseField = value }
private var kjsmField: kotlin.Boolean? = null
override var kjsm: kotlin.Boolean
get() = kjsmField ?: true
set(value) { kjsmField = value }
private var mainField: kotlin.String? = null private var mainField: kotlin.String? = null
override var main: kotlin.String override var main: kotlin.String
get() = mainField ?: "noCall" get() = mainField ?: "noCall"
@@ -49,48 +59,38 @@ internal abstract class KotlinJsOptionsBase : org.jetbrains.kotlin.gradle.dsl.Ko
get() = sourceMapField ?: false get() = sourceMapField ?: false
set(value) { sourceMapField = value } set(value) { sourceMapField = value }
private var suppressWarningsField: kotlin.Boolean? = null
override var suppressWarnings: kotlin.Boolean
get() = suppressWarningsField ?: false
set(value) { suppressWarningsField = value }
private var targetField: kotlin.String? = null private var targetField: kotlin.String? = null
override var target: kotlin.String override var target: kotlin.String
get() = targetField ?: "v5" get() = targetField ?: "v5"
set(value) { targetField = value } set(value) { targetField = value }
private var verboseField: kotlin.Boolean? = null internal open fun updateArguments(args: org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments) {
override var verbose: kotlin.Boolean
get() = verboseField ?: false
set(value) { verboseField = value }
open fun updateArguments(args: org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments) {
apiVersionField?.let { args.apiVersion = it } apiVersionField?.let { args.apiVersion = it }
kjsmField?.let { args.kjsm = it }
languageVersionField?.let { args.languageVersion = it } languageVersionField?.let { args.languageVersion = it }
suppressWarningsField?.let { args.suppressWarnings = it }
verboseField?.let { args.verbose = it }
kjsmField?.let { args.kjsm = it }
mainField?.let { args.main = it } mainField?.let { args.main = it }
metaInfoField?.let { args.metaInfo = it } metaInfoField?.let { args.metaInfo = it }
moduleKindField?.let { args.moduleKind = it } moduleKindField?.let { args.moduleKind = it }
noStdlibField?.let { args.noStdlib = it } noStdlibField?.let { args.noStdlib = it }
outputFileField?.let { args.outputFile = it } outputFileField?.let { args.outputFile = it }
sourceMapField?.let { args.sourceMap = it } sourceMapField?.let { args.sourceMap = it }
suppressWarningsField?.let { args.suppressWarnings = it }
targetField?.let { args.target = it } targetField?.let { args.target = it }
verboseField?.let { args.verbose = it }
} }
} }
internal fun org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments.fillDefaultValues() { internal fun org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments.fillDefaultValues() {
apiVersion = "1.1" apiVersion = "1.1"
kjsm = true
languageVersion = "1.1" languageVersion = "1.1"
suppressWarnings = false
verbose = false
kjsm = true
main = "noCall" main = "noCall"
metaInfo = true metaInfo = true
moduleKind = "plain" moduleKind = "plain"
noStdlib = true noStdlib = true
outputFile = null outputFile = null
sourceMap = false sourceMap = false
suppressWarnings = false
target = "v5" target = "v5"
verbose = false
} }
@@ -2,14 +2,7 @@
// Generated by org/jetbrains/kotlin/generators/arguments/GenerateGradleOptions.kt // Generated by org/jetbrains/kotlin/generators/arguments/GenerateGradleOptions.kt
package org.jetbrains.kotlin.gradle.dsl package org.jetbrains.kotlin.gradle.dsl
interface KotlinJvmOptions { interface KotlinJvmOptions : org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions {
/**
* Allow to use declarations only from the specified version of bundled libraries
* Possible values: "1.0", "1.1"
* Default value: "1.1"
*/
var apiVersion: kotlin.String
/** /**
* Include Kotlin runtime in to resulting .jar * Include Kotlin runtime in to resulting .jar
@@ -30,13 +23,6 @@ interface KotlinJvmOptions {
*/ */
var jvmTarget: kotlin.String var jvmTarget: kotlin.String
/**
* Provide source compatibility with specified language version
* Possible values: "1.0", "1.1"
* Default value: "1.1"
*/
var languageVersion: kotlin.String
/** /**
* Don't include Java runtime into classpath * Don't include Java runtime into classpath
* Default value: false * Default value: false
@@ -54,22 +40,4 @@ interface KotlinJvmOptions {
* Default value: true * Default value: true
*/ */
var noStdlib: kotlin.Boolean var noStdlib: kotlin.Boolean
/**
* Generate no warnings
* Default value: false
*/
var suppressWarnings: kotlin.Boolean
/**
* Enable verbose logging output
* Default value: false
*/
var verbose: kotlin.Boolean
/**
* A list of additional compiler arguments
* Default value: emptyList()
*/
var freeCompilerArgs: kotlin.collections.List<kotlin.String>
} }
@@ -9,6 +9,21 @@ internal abstract class KotlinJvmOptionsBase : org.jetbrains.kotlin.gradle.dsl.K
get() = apiVersionField ?: "1.1" get() = apiVersionField ?: "1.1"
set(value) { apiVersionField = value } set(value) { apiVersionField = value }
private var languageVersionField: kotlin.String? = null
override var languageVersion: kotlin.String
get() = languageVersionField ?: "1.1"
set(value) { languageVersionField = value }
private var suppressWarningsField: kotlin.Boolean? = null
override var suppressWarnings: kotlin.Boolean
get() = suppressWarningsField ?: false
set(value) { suppressWarningsField = value }
private var verboseField: kotlin.Boolean? = null
override var verbose: kotlin.Boolean
get() = verboseField ?: false
set(value) { verboseField = value }
private var includeRuntimeField: kotlin.Boolean? = null private var includeRuntimeField: kotlin.Boolean? = null
override var includeRuntime: kotlin.Boolean override var includeRuntime: kotlin.Boolean
get() = includeRuntimeField ?: false get() = includeRuntimeField ?: false
@@ -24,11 +39,6 @@ internal abstract class KotlinJvmOptionsBase : org.jetbrains.kotlin.gradle.dsl.K
get() = jvmTargetField ?: "1.6" get() = jvmTargetField ?: "1.6"
set(value) { jvmTargetField = value } set(value) { jvmTargetField = value }
private var languageVersionField: kotlin.String? = null
override var languageVersion: kotlin.String
get() = languageVersionField ?: "1.1"
set(value) { languageVersionField = value }
private var noJdkField: kotlin.Boolean? = null private var noJdkField: kotlin.Boolean? = null
override var noJdk: kotlin.Boolean override var noJdk: kotlin.Boolean
get() = noJdkField ?: false get() = noJdkField ?: false
@@ -44,39 +54,29 @@ internal abstract class KotlinJvmOptionsBase : org.jetbrains.kotlin.gradle.dsl.K
get() = noStdlibField ?: true get() = noStdlibField ?: true
set(value) { noStdlibField = value } set(value) { noStdlibField = value }
private var suppressWarningsField: kotlin.Boolean? = null internal open fun updateArguments(args: org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments) {
override var suppressWarnings: kotlin.Boolean
get() = suppressWarningsField ?: false
set(value) { suppressWarningsField = value }
private var verboseField: kotlin.Boolean? = null
override var verbose: kotlin.Boolean
get() = verboseField ?: false
set(value) { verboseField = value }
open fun updateArguments(args: org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments) {
apiVersionField?.let { args.apiVersion = it } apiVersionField?.let { args.apiVersion = it }
languageVersionField?.let { args.languageVersion = it }
suppressWarningsField?.let { args.suppressWarnings = it }
verboseField?.let { args.verbose = it }
includeRuntimeField?.let { args.includeRuntime = it } includeRuntimeField?.let { args.includeRuntime = it }
jdkHomeField?.let { args.jdkHome = it } jdkHomeField?.let { args.jdkHome = it }
jvmTargetField?.let { args.jvmTarget = it } jvmTargetField?.let { args.jvmTarget = it }
languageVersionField?.let { args.languageVersion = it }
noJdkField?.let { args.noJdk = it } noJdkField?.let { args.noJdk = it }
noReflectField?.let { args.noReflect = it } noReflectField?.let { args.noReflect = it }
noStdlibField?.let { args.noStdlib = it } noStdlibField?.let { args.noStdlib = it }
suppressWarningsField?.let { args.suppressWarnings = it }
verboseField?.let { args.verbose = it }
} }
} }
internal fun org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments.fillDefaultValues() { internal fun org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments.fillDefaultValues() {
apiVersion = "1.1" apiVersion = "1.1"
languageVersion = "1.1"
suppressWarnings = false
verbose = false
includeRuntime = false includeRuntime = false
jdkHome = null jdkHome = null
jvmTarget = "1.6" jvmTarget = "1.6"
languageVersion = "1.1"
noJdk = false noJdk = false
noReflect = true noReflect = true
noStdlib = true noStdlib = true
suppressWarnings = false
verbose = false
} }