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
import com.sampullara.cli.Argument
import org.jetbrains.kotlin.cli.common.arguments.DefaultValues
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.cli.common.arguments.*
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.utils.Printer
import java.io.File
import java.io.PrintStream
import kotlin.reflect.KAnnotatedElement
import kotlin.reflect.KProperty1
import kotlin.reflect.declaredMemberProperties
import kotlin.reflect.memberProperties
// Additional properties that should be included in interface
@@ -41,14 +39,23 @@ interface AdditionalGradleProperties {
fun generateKotlinGradleOptions(withPrinterToFile: (targetFile: File, Printer.()->Unit)->Unit) {
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
val jvmInterfaceFqName = FqName("org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions")
val optionsFromK2JVMCompilerArguments = gradleOptions<K2JVMCompilerArguments>()
val jvmOptions = gradleOptions<K2JVMCompilerArguments>()
withPrinterToFile(File(srcDir, jvmInterfaceFqName)) {
generateInterface(jvmInterfaceFqName,
optionsFromK2JVMCompilerArguments + additionalGradleOptions)
jvmOptions,
parentType = commonInterfaceFqName)
}
// generate jvm impl
@@ -58,16 +65,16 @@ fun generateKotlinGradleOptions(withPrinterToFile: (targetFile: File, Printer.()
generateImpl(jvmImplFqName,
jvmInterfaceFqName,
k2JvmCompilerArgumentsFqName,
optionsFromK2JVMCompilerArguments)
commonOptions + jvmOptions)
}
// generate js interface
val jsInterfaceFqName = FqName("org.jetbrains.kotlin.gradle.dsl.KotlinJsOptions")
val optionsFromK2JSCompilerArguments = gradleOptions<K2JSCompilerArguments>()
val jsOptions = gradleOptions<K2JSCompilerArguments>()
withPrinterToFile(File(srcDir, jsInterfaceFqName)) {
generateInterface(jsInterfaceFqName,
optionsFromK2JSCompilerArguments +
additionalGradleOptions)
jsOptions,
parentType = commonInterfaceFqName)
}
val k2JsCompilerArgumentsFqName = FqName(K2JSCompilerArguments::class.qualifiedName!!)
@@ -76,7 +83,7 @@ fun generateKotlinGradleOptions(withPrinterToFile: (targetFile: File, Printer.()
generateImpl(jsImplFqName,
jsInterfaceFqName,
k2JsCompilerArgumentsFqName,
optionsFromK2JSCompilerArguments)
commonOptions + jsOptions)
}
}
@@ -96,15 +103,16 @@ fun main(args: Array<String>) {
}
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 {
val fileRelativePath = fqName.asString().replace(".", "/") + ".kt"
return File(baseDir, fileRelativePath)
}
private fun Printer.generateInterface(type: FqName, properties: List<KProperty1<*, *>>) {
generateDeclaration("interface", type) {
private fun Printer.generateInterface(type: FqName, properties: List<KProperty1<*, *>>, parentType: FqName? = null) {
val afterType = parentType?.let { " : $it" }
generateDeclaration("interface", type, afterType = afterType) {
for (property in properties) {
println()
generateDoc(property)
@@ -135,7 +143,7 @@ private fun Printer.generateImpl(
}
println()
println("open fun updateArguments(args: $argsType) {")
println("internal open fun updateArguments(args: $argsType) {")
withIndent {
for (property in properties) {
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 org.gradle.api.Task
interface KotlinCompile<T> : Task {
interface KotlinCompile<T : KotlinCommonOptions> : Task {
val kotlinOptions: T
fun kotlinOptions(fn: T.() -> Unit) {
@@ -2,14 +2,7 @@
// Generated by org/jetbrains/kotlin/generators/arguments/GenerateGradleOptions.kt
package org.jetbrains.kotlin.gradle.dsl
interface KotlinJsOptions {
/**
* 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
interface KotlinJsOptions : org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions {
/**
* Generate kjsm-files (for creating libraries)
@@ -17,13 +10,6 @@ interface KotlinJsOptions {
*/
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
* Possible values: "call", "noCall"
@@ -62,28 +48,10 @@ interface KotlinJsOptions {
*/
var sourceMap: kotlin.Boolean
/**
* Generate no warnings
* Default value: false
*/
var suppressWarnings: kotlin.Boolean
/**
* Generate JS files for specific ECMA version
* Possible values: "v5"
* Default value: "v5"
*/
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"
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
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 kjsmField: kotlin.Boolean? = null
override var kjsm: kotlin.Boolean
get() = kjsmField ?: true
set(value) { kjsmField = value }
private var mainField: kotlin.String? = null
override var main: kotlin.String
get() = mainField ?: "noCall"
@@ -49,48 +59,38 @@ internal abstract class KotlinJsOptionsBase : org.jetbrains.kotlin.gradle.dsl.Ko
get() = sourceMapField ?: false
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
override var target: kotlin.String
get() = targetField ?: "v5"
set(value) { targetField = 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.K2JSCompilerArguments) {
internal open fun updateArguments(args: org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments) {
apiVersionField?.let { args.apiVersion = it }
kjsmField?.let { args.kjsm = 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 }
metaInfoField?.let { args.metaInfo = it }
moduleKindField?.let { args.moduleKind = it }
noStdlibField?.let { args.noStdlib = it }
outputFileField?.let { args.outputFile = it }
sourceMapField?.let { args.sourceMap = it }
suppressWarningsField?.let { args.suppressWarnings = it }
targetField?.let { args.target = it }
verboseField?.let { args.verbose = it }
}
}
internal fun org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments.fillDefaultValues() {
apiVersion = "1.1"
kjsm = true
languageVersion = "1.1"
suppressWarnings = false
verbose = false
kjsm = true
main = "noCall"
metaInfo = true
moduleKind = "plain"
noStdlib = true
outputFile = null
sourceMap = false
suppressWarnings = false
target = "v5"
verbose = false
}
@@ -2,14 +2,7 @@
// Generated by org/jetbrains/kotlin/generators/arguments/GenerateGradleOptions.kt
package org.jetbrains.kotlin.gradle.dsl
interface KotlinJvmOptions {
/**
* 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
interface KotlinJvmOptions : org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions {
/**
* Include Kotlin runtime in to resulting .jar
@@ -30,13 +23,6 @@ interface KotlinJvmOptions {
*/
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
* Default value: false
@@ -54,22 +40,4 @@ interface KotlinJvmOptions {
* Default value: true
*/
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"
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
override var includeRuntime: kotlin.Boolean
get() = includeRuntimeField ?: false
@@ -24,11 +39,6 @@ internal abstract class KotlinJvmOptionsBase : org.jetbrains.kotlin.gradle.dsl.K
get() = jvmTargetField ?: "1.6"
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
override var noJdk: kotlin.Boolean
get() = noJdkField ?: false
@@ -44,39 +54,29 @@ internal abstract class KotlinJvmOptionsBase : org.jetbrains.kotlin.gradle.dsl.K
get() = noStdlibField ?: true
set(value) { noStdlibField = 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 }
open fun updateArguments(args: org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments) {
internal open fun updateArguments(args: org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments) {
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 }
jdkHomeField?.let { args.jdkHome = it }
jvmTargetField?.let { args.jvmTarget = it }
languageVersionField?.let { args.languageVersion = it }
noJdkField?.let { args.noJdk = it }
noReflectField?.let { args.noReflect = 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() {
apiVersion = "1.1"
languageVersion = "1.1"
suppressWarnings = false
verbose = false
includeRuntime = false
jdkHome = null
jvmTarget = "1.6"
languageVersion = "1.1"
noJdk = false
noReflect = true
noStdlib = true
suppressWarnings = false
verbose = false
}