Merge pull request #38 from bazelbuild/flag_refactor
Flag refactor
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/Args.kt b/kotlin/builder/src/io/bazel/kotlin/builder/Args.kt
new file mode 100644
index 0000000..84f4973
--- /dev/null
+++ b/kotlin/builder/src/io/bazel/kotlin/builder/Args.kt
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2018 The Bazel Authors. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.bazel.kotlin.builder
+
+import com.squareup.moshi.KotlinJsonAdapterFactory
+import com.squareup.moshi.Moshi
+
+typealias ArgMap = Map<String, List<String>>
+
+/**
+ * Get the mandatory single value from a key
+ */
+fun ArgMap.mandatorySingle(key: String): String =
+ optionalSingle(key) ?: throw IllegalArgumentException("$key is not optional")
+
+fun ArgMap.optionalSingle(key: String): String? =
+ optional(key)?.let {
+ when (it.size) {
+ 0 -> throw IllegalArgumentException("$key did not have a value")
+ 1 -> it[0]
+ else -> throw IllegalArgumentException("$key should have a single value")
+ }
+ }
+
+fun ArgMap.mandatory(key: String): Array<String> = optional(key) ?: throw IllegalArgumentException("$key is not optional")
+fun ArgMap.optional(key: String): Array<String>? = this[key]?.toTypedArray()
+
+inline fun <reified T : Any> ArgMap.mandatoryFromJson(key: String): T = optionalFromJson(key) ?: throw IllegalArgumentException("$key is not optional")
+inline fun <reified T : Any> ArgMap.optionalFromJson(key: String): T? = optionalSingle(key)?.let { moshi.adapter(T::class.java).fromJson(it)!! }
+
+@PublishedApi
+internal val moshi = Moshi.Builder().let {
+ it.add(KotlinJsonAdapterFactory())
+ it.build()
+}
+
+/**
+ * Test if a flag is set
+ */
+fun ArgMap.flag(key: String): Boolean = this[key]?.let { true } ?: false
+
+object ArgMaps {
+ fun from(args: List<String>): ArgMap = mutableMapOf<String, MutableList<String>>().also { argsToMap(args, it) }
+
+ fun argsToMap(args: List<String>, argMap: MutableMap<String, MutableList<String>>, isFlag: (String) -> Boolean = { it.startsWith("--") }) {
+ var currentKey: String = args.first().also { require(isFlag(it)) { "first arg must be a flag" } }
+ val currentValue = mutableListOf<String>()
+ val mergeCurrent = {
+ argMap.computeIfAbsent(currentKey, { mutableListOf() }).addAll(currentValue)
+ currentValue.clear()
+ }
+ args.drop(1).forEach {
+ if (it.startsWith("--")) {
+ mergeCurrent()
+ currentKey = it
+ } else {
+ currentValue.add(it)
+ }
+ }.also { mergeCurrent() }
+ }
+}
\ No newline at end of file
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/CommandLineProgram.kt b/kotlin/builder/src/io/bazel/kotlin/builder/CommandLineProgram.kt
index 082d0fe..bfe532a 100644
--- a/kotlin/builder/src/io/bazel/kotlin/builder/CommandLineProgram.kt
+++ b/kotlin/builder/src/io/bazel/kotlin/builder/CommandLineProgram.kt
@@ -15,6 +15,8 @@
*/
package io.bazel.kotlin.builder
+import io.bazel.kotlin.builder.model.Flags
+
/**
* Interface for command line programs.
*
@@ -33,26 +35,9 @@
fun apply(args: List<String>): Int
abstract class Base(
- protected val flags: FlagNameMap = emptyMap()
- ): CommandLineProgram {
- private val mandatoryFlags: List<Flag> = flags.values.filter { it is Flag.Mandatory }
-
+ ) : CommandLineProgram {
private fun createContext(toolchain: KotlinToolchain, args: List<String>): Context {
- val tally = mutableMapOf<Flag, String>()
-
- if (args.size % 2 != 0) {
- throw RuntimeException("args should be k,v pairs")
- }
-
- for (i in 0 until args.size / 2) {
- val flag = args[i * 2]
- val value = args[i * 2 + 1]
- val field = flags[flag] ?: throw RuntimeException("unrecognised arg: " + flag)
- tally[field] = value
- }
-
- mandatoryFlags.forEach { require(tally.containsKey(it)) { "missing mandatory flag ${it.globalFlag}" } }
- return Context(toolchain, tally)
+ return Context(toolchain, Flags(ArgMaps.from(args)))
}
abstract val toolchain: KotlinToolchain
@@ -61,7 +46,7 @@
override fun apply(args: List<String>): Int {
val ctx = createContext(toolchain, args)
var exitCode = 0
- for (action in actions(toolchain,ctx)) {
+ for (action in actions(toolchain, ctx)) {
exitCode = action(ctx)
if (exitCode != 0)
break
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/Context.kt b/kotlin/builder/src/io/bazel/kotlin/builder/Context.kt
index 9dbc1c7..1e04e69 100644
--- a/kotlin/builder/src/io/bazel/kotlin/builder/Context.kt
+++ b/kotlin/builder/src/io/bazel/kotlin/builder/Context.kt
@@ -17,21 +17,20 @@
package io.bazel.kotlin.builder
+import io.bazel.kotlin.builder.model.Flags
import java.util.stream.Stream
class Context internal constructor(
val toolchain: KotlinToolchain,
- private val flags: Map<Flag, String>
+ val flags: Flags
+
) {
private val meta = mutableMapOf<Meta<*>, Any>()
- fun copyOfFlags(vararg fields: Flag): Map<Flag, String> = fields.mapNotNull { f -> flags[f]?.let { f to it } }.toMap()
-
fun apply(vararg consumers: (Context) -> Unit) {
Stream.of(*consumers).forEach { it(this) }
}
- internal operator fun get(flag: Flag): String? = flags[flag]
operator fun <T : Any> get(key: Meta<T>): T? = meta[key] as T?
internal fun <T : Any> putIfAbsent(key: Meta<T>, value: T): T? = meta.putIfAbsent(key, value as Any) as T?
}
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/Flag.kt b/kotlin/builder/src/io/bazel/kotlin/builder/Flag.kt
deleted file mode 100644
index 416ffcc..0000000
--- a/kotlin/builder/src/io/bazel/kotlin/builder/Flag.kt
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright 2018 The Bazel Authors. All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package io.bazel.kotlin.builder
-
-import com.squareup.moshi.JsonAdapter
-import com.squareup.moshi.KotlinJsonAdapterFactory
-import com.squareup.moshi.Moshi
-import kotlin.reflect.KClass
-import kotlin.reflect.full.declaredMemberProperties
-
-sealed class Flag(val globalFlag: String, val kotlinFlag: String? = null) {
- open operator fun get(context: Context): String? = context[this]
-
- inline fun <reified T : Any> renderJsonAndBind(override: JsonAdapter<T>? = null): Meta<T> = object : Meta<T> {
- val adapter = override ?: moshi.adapter(T::class.java)
- override val id: String = "flag $globalFlag"
- override val defaultValue: T? = null
- override fun get(ctx: Context): T? = super.get(ctx) ?: this@Flag[ctx]?.let { adapter.fromJson(it) }
- }
-
- class Optional(globalFlag: String, kotlinFlag: String? = null) : Flag(globalFlag, kotlinFlag)
-
- class Mandatory(globalFlag: String, kotlinFlag: String? = null) : Flag(globalFlag, kotlinFlag) {
- override fun get(context: Context): String = requireNotNull(super.get(context)) { "mandatory flag $globalFlag not present" }
- }
-
- companion object {
- @PublishedApi
- internal val moshi = Moshi.Builder().let {
- it.add(KotlinJsonAdapterFactory())
- it.build()
- }
- }
-}
-
-/**
- * all of the static flag properties declared in a class.
- */
-// works for objects only.
-private fun <T : Any> KClass<T>.allFlags(): Sequence<Flag> {
- val obj = requireNotNull(this.objectInstance) { "only collects flag instances from classes with an object instance" }
- return declaredMemberProperties.asSequence().mapNotNull {
- it.get(obj).takeIf(Flag::class::isInstance).let { it as Flag }
- }
-}
-
-typealias FlagNameMap = Map<String, Flag>
-
-/**
- * Map from flag name to flag collected from the static properteis declared in a class.
- */
-fun <T : Any> KClass<T>.flagsByName(): FlagNameMap = allFlags().associateBy { it.globalFlag }
\ No newline at end of file
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/KotlinBuilder.kt b/kotlin/builder/src/io/bazel/kotlin/builder/KotlinBuilder.kt
index 244686b..606fdbc 100644
--- a/kotlin/builder/src/io/bazel/kotlin/builder/KotlinBuilder.kt
+++ b/kotlin/builder/src/io/bazel/kotlin/builder/KotlinBuilder.kt
@@ -17,15 +17,12 @@
import io.bazel.kotlin.builder.mode.jvm.actions.*
-import io.bazel.kotlin.builder.model.Flags
import java.io.IOException
/**
* Bazel Kotlin Compiler worker.
*/
-object KotlinBuilder : CommandLineProgram.Base(
- flags = Flags::class.flagsByName()
-) {
+object KotlinBuilder : CommandLineProgram.Base() {
override val toolchain: KotlinToolchain = try {
KotlinToolchain()
} catch (e: IOException) {
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/CreateOutputJar.kt b/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/CreateOutputJar.kt
index 7075633..b65f9e6 100644
--- a/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/CreateOutputJar.kt
+++ b/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/CreateOutputJar.kt
@@ -19,8 +19,6 @@
import io.bazel.kotlin.builder.Context
import io.bazel.kotlin.builder.KotlinToolchain
import io.bazel.kotlin.builder.model.CompileDirectories
-import io.bazel.kotlin.builder.model.Flags
-import io.bazel.kotlin.builder.model.PluginDescriptors
import io.bazel.kotlin.builder.utils.executeAndAwaitSuccess
import java.nio.file.Path
@@ -31,7 +29,7 @@
private fun MutableList<String>.addAllFrom(dir: Path) = addAll(arrayOf("-C", dir.toString(), "."))
private fun MutableList<String>.maybeAddAnnotationProcessingGeneratedClasses(ctx: Context) {
- PluginDescriptors[ctx]?.let { pluginDescriptor ->
+ ctx.flags.plugins?.let { pluginDescriptor ->
CompileDirectories[ctx].annotionProcessingClasses.takeIf {
pluginDescriptor.processors.isNotEmpty() && it.toFile().exists()
}?.also { this.addAllFrom(it) }
@@ -42,7 +40,7 @@
try {
mutableListOf(
toolchain.JAR_TOOL_PATH,
- "cf", Flags.OUTPUT_CLASSJAR[ctx]
+ "cf", ctx.flags.outputClassJar
).also { args ->
args.addAllFrom(CompileDirectories[ctx].classes)
args.maybeAddAnnotationProcessingGeneratedClasses(ctx)
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/GenerateJdepsFile.kt b/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/GenerateJdepsFile.kt
index 6229d20..07c851c 100644
--- a/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/GenerateJdepsFile.kt
+++ b/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/GenerateJdepsFile.kt
@@ -20,10 +20,6 @@
import io.bazel.kotlin.builder.Context
import io.bazel.kotlin.builder.KotlinToolchain
import io.bazel.kotlin.builder.mode.jvm.utils.JdepsParser
-import io.bazel.kotlin.builder.model.Flags.CLASSPATH
-import io.bazel.kotlin.builder.model.Flags.LABEL
-import io.bazel.kotlin.builder.model.Flags.OUTPUT_CLASSJAR
-import io.bazel.kotlin.builder.model.Flags.OUTPUT_JDEPS
import io.bazel.kotlin.builder.utils.executeAndWaitOutput
import io.bazel.kotlin.builder.utils.rootCause
import java.io.FileOutputStream
@@ -35,23 +31,22 @@
private val isKotlinImplicit = JdepsParser.pathSuffixMatchingPredicate(toolchain.KOTLIN_LIB_DIR, *toolchain.KOTLIN_STD_LIBS)
override fun invoke(ctx: Context): Int {
- val classJar = OUTPUT_CLASSJAR[ctx]
- val classPath = CLASSPATH[ctx]
- val output = OUTPUT_JDEPS[ctx]
- val label = LABEL[ctx]
-
val jdepsContent: Deps.Dependencies
try {
- jdepsContent = executeAndWaitOutput(10, toolchain.JDEPS_PATH, "-cp", classPath, classJar).let {
- JdepsParser.parse(label, classJar, classPath, it.stream(), isKotlinImplicit)
+ jdepsContent = executeAndWaitOutput(10, toolchain.JDEPS_PATH, "-cp", ctx.flags.classpath, ctx.flags.outputClassJar).let {
+ JdepsParser.parse(
+ ctx.flags.label,
+ ctx.flags.outputClassJar,
+ ctx.flags.classpath,
+ it.stream(), isKotlinImplicit)
}
} catch (e: Exception) {
throw RuntimeException("error reading or parsing jdeps file", e.rootCause)
}
try {
- Paths.get(output).also {
+ Paths.get(ctx.flags.outputJdeps).also {
Files.deleteIfExists(it)
FileOutputStream(Files.createFile(it).toFile()).use {
jdepsContent.writeTo(it)
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/Initialize.kt b/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/Initialize.kt
index 8811fa2..526c333 100644
--- a/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/Initialize.kt
+++ b/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/Initialize.kt
@@ -19,8 +19,10 @@
import io.bazel.kotlin.builder.BuildAction
import io.bazel.kotlin.builder.Context
import io.bazel.kotlin.builder.KotlinToolchain
+import io.bazel.kotlin.builder.model.CompileDirectories
+import io.bazel.kotlin.builder.model.CompilePluginConfig
+import io.bazel.kotlin.builder.model.Metas
import io.bazel.kotlin.builder.utils.PluginArgs
-import io.bazel.kotlin.builder.model.*
import java.nio.file.Files
import java.nio.file.Paths
@@ -39,7 +41,7 @@
}
private fun bindPluginStatus(ctx: Context) {
- CompilePluginConfig[ctx] = PluginDescriptors[ctx]?.let {
+ CompilePluginConfig[ctx] = ctx.flags.plugins?.let {
PluginArgs.from(ctx)?.let {
CompilePluginConfig(hasAnnotationProcessors = true, args = it.toTypedArray())
}
@@ -49,7 +51,7 @@
private fun bindSources(ctx: Context) {
val javaSources = mutableListOf<String>()
val allSources = mutableListOf<String>()
- for (src in requireNotNull(Flags.SOURCES[ctx]).split(":")) {
+ for (src in requireNotNull(ctx.flags.source).split(":")) {
when {
src.endsWith(".java") -> {
javaSources.add(src)
@@ -64,7 +66,7 @@
}
private fun initializeAndBindBindDirectories(ctx: Context) {
- Files.createDirectories(Paths.get(Flags.COMPILER_OUTPUT_BASE[ctx])).let {
+ Files.createDirectories(Paths.get(ctx.flags.compilerOutputBase)).let {
CompileDirectories[ctx] = CompileDirectories(it)
}
}
@@ -73,9 +75,8 @@
* parses the label, sets up the meta elements and returns the target part.
*/
private fun bindLabelComponents(ctx: Context) {
- val label = requireNotNull(Flags.LABEL[ctx])
- val parts = label.split(":")
- require(parts.size == 2) { "the label $label is invalid" }
+ val parts = ctx.flags.label.split(":")
+ require(parts.size == 2) { "the label ${ctx.flags.label} is invalid" }
Metas.PKG[ctx] = parts[0]
Metas.TARGET[ctx] = parts[1]
}
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/JavaMainCompile.kt b/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/JavaMainCompile.kt
index f5483b6..4393818 100644
--- a/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/JavaMainCompile.kt
+++ b/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/JavaMainCompile.kt
@@ -19,10 +19,9 @@
import io.bazel.kotlin.builder.CompileResult
import io.bazel.kotlin.builder.Context
import io.bazel.kotlin.builder.KotlinToolchain
-import io.bazel.kotlin.builder.utils.annotationProcessingGeneratedJavaSources
import io.bazel.kotlin.builder.model.CompileDirectories
-import io.bazel.kotlin.builder.model.Flags
import io.bazel.kotlin.builder.model.Metas
+import io.bazel.kotlin.builder.utils.annotationProcessingGeneratedJavaSources
import io.bazel.kotlin.builder.utils.executeAndAwait
/**
@@ -35,14 +34,14 @@
override fun invoke(ctx: Context): Int {
val javaSources = Metas.JAVA_SOURCES.mustGet(ctx)
- val classpath = Flags.CLASSPATH[ctx]
+
val additionalJavaSources = ctx.annotationProcessingGeneratedJavaSources()?.toList() ?: emptyList()
if (javaSources.isNotEmpty() || additionalJavaSources.isNotEmpty()) {
val classesDirectory = CompileDirectories[ctx].classes
val incrementalData = CompileDirectories[ctx].annotationProcessingIncrementalData
- val args = mutableListOf(toolchain.JAVAC_PATH, "-cp", "$classesDirectory/:$incrementalData/:$classpath", "-d", classesDirectory.toString()).also {
+ val args = mutableListOf(toolchain.JAVAC_PATH, "-cp", "$classesDirectory/:$incrementalData/:${ctx.flags.classpath}", "-d", classesDirectory.toString()).also {
// Kotlin takes care of annotation processing.
it.add("-proc:none")
it.addAll(javaSources)
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/KotlinMainCompile.kt b/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/KotlinMainCompile.kt
index 76e2b22..5f0be66 100644
--- a/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/KotlinMainCompile.kt
+++ b/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/KotlinMainCompile.kt
@@ -23,7 +23,6 @@
import io.bazel.kotlin.builder.mode.jvm.utils.KotlinCompilerOutputProcessor
import io.bazel.kotlin.builder.model.CompileDirectories
import io.bazel.kotlin.builder.model.CompilePluginConfig
-import io.bazel.kotlin.builder.model.Flags
import io.bazel.kotlin.builder.model.Metas
import io.bazel.kotlin.builder.utils.addAll
import io.bazel.kotlin.builder.utils.annotationProcessingGeneratedJavaSources
@@ -33,15 +32,6 @@
// invocations Configured via Kotlin use eager analysis in some corner cases this can result in classpath exceptions from the Java Compiler..
class KotlinMainCompile(toolchain: KotlinToolchain) : BuildAction("compile kotlin classes", toolchain) {
companion object {
- /**
- * Default fields that are directly mappable to kotlin compiler args.
- */
- private val COMPILE_MAPPED_FLAGS = arrayOf(
- Flags.CLASSPATH,
- Flags.KOTLIN_API_VERSION,
- Flags.KOTLIN_LANGUAGE_VERSION,
- Flags.KOTLIN_JVM_TARGET)
-
val Result = CompileResult.Meta("kotlin_compile_result")
}
@@ -54,15 +44,18 @@
val args = mutableListOf<String>()
val compileDirectories = CompileDirectories[ctx]
- ctx.copyOfFlags(*COMPILE_MAPPED_FLAGS).forEach { field, arg ->
- args.add(field.kotlinFlag!!); args.add(arg)
- }
+ args.addAll(
+ "-cp", ctx.flags.classpath,
+ "-api-version", ctx.flags.kotlinApiVersion,
+ "-language-version", ctx.flags.kotlinLanguageVersion,
+ "-jvm-target", ctx.flags.kotlinJvmTarget
+ )
args
.addAll("-module-name", ctx.moduleName)
.addAll("-d", compileDirectories.classes.toString())
- Flags.KOTLIN_PASSTHROUGH_FLAGS[ctx]?.takeIf { it.isNotBlank() }?.also { args.addAll(it.split(" ")) }
+ ctx.flags.kotlinPassthroughFlags?.takeIf { it.isNotBlank() }?.also { args.addAll(it.split(" ")) }
return args
}
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/model/Flags.kt b/kotlin/builder/src/io/bazel/kotlin/builder/model/Flags.kt
index 209be6c..a11283e 100644
--- a/kotlin/builder/src/io/bazel/kotlin/builder/model/Flags.kt
+++ b/kotlin/builder/src/io/bazel/kotlin/builder/model/Flags.kt
@@ -15,31 +15,29 @@
*/
package io.bazel.kotlin.builder.model
-import io.bazel.kotlin.builder.Flag
+import io.bazel.kotlin.builder.*
/**
* The flags supported by the worker.
*/
-object Flags {
- val LABEL = Flag.Mandatory(JavaBuilderFlags.TARGET_LABEL.flag)
- val OUTPUT_CLASSJAR = Flag.Mandatory(JavaBuilderFlags.OUTPUT.flag)
- val SOURCES = Flag.Mandatory(JavaBuilderFlags.SOURCES.flag)
- val CLASSPATH = Flag.Mandatory(JavaBuilderFlags.CLASSPATH.flag, "-cp")
+class Flags(argMap: ArgMap) {
+ val label = argMap.mandatorySingle(JavaBuilderFlags.TARGET_LABEL.flag)
+ val outputClassJar = argMap.mandatorySingle(JavaBuilderFlags.OUTPUT.flag)
+ val source = argMap.mandatorySingle(JavaBuilderFlags.SOURCES.flag)
+ val classpath = argMap.mandatorySingle(JavaBuilderFlags.CLASSPATH.flag)
+ val plugins = argMap.optionalFromJson<PluginDescriptors>("--kt-plugins")
+ val outputJdeps = argMap.mandatorySingle("--output_jdeps")
- val PLUGINS = Flag.Optional("--kt-plugins")
-
- val OUTPUT_JDEPS = Flag.Mandatory("--output_jdeps")
- val COMPILER_OUTPUT_BASE = Flag.Mandatory("--compiler_output_base")
-
- val KOTLIN_API_VERSION = Flag.Optional("--kotlin_api_version", "-api-version")
- val KOTLIN_LANGUAGE_VERSION = Flag.Optional("--kotlin_language_version", "-language-version")
- val KOTLIN_JVM_TARGET = Flag.Optional("--kotlin_jvm_target", "-jvm-target")
+ val compilerOutputBase = argMap.mandatorySingle("--compiler_output_base")
+ val kotlinApiVersion = argMap.mandatorySingle("--kotlin_api_version")
+ val kotlinLanguageVersion = argMap.mandatorySingle("--kotlin_language_version")
+ val kotlinJvmTarget = argMap.mandatorySingle("--kotlin_jvm_target")
/**
* These flags are passed through to the compiler verbatim, the rules ensure they are safe. These flags are to toggle features or they carry a single value
* so the string is tokenized by space.
*/
- val KOTLIN_PASSTHROUGH_FLAGS = Flag.Optional("--kotlin_passthrough_flags")
+ val kotlinPassthroughFlags = argMap.optionalSingle("--kotlin_passthrough_flags")
- val KOTLIN_MODULE_NAME = Flag.Optional("--kotlin_module_name")
+ val kotlinModuleName = argMap.optionalSingle("--kotlin_module_name")
}
\ No newline at end of file
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/model/PluginDescriptors.kt b/kotlin/builder/src/io/bazel/kotlin/builder/model/PluginDescriptors.kt
index 9b2b66c..96a3323 100644
--- a/kotlin/builder/src/io/bazel/kotlin/builder/model/PluginDescriptors.kt
+++ b/kotlin/builder/src/io/bazel/kotlin/builder/model/PluginDescriptors.kt
@@ -16,7 +16,6 @@
package io.bazel.kotlin.builder.model
import com.squareup.moshi.Json
-import io.bazel.kotlin.builder.Meta
data class AnnotationProcessor(
@Json(name = "processor_class") val processorClass: String,
@@ -33,6 +32,4 @@
* The list of Annotation processors.
*/
val processors: List<AnnotationProcessor>
-) {
- companion object : Meta<PluginDescriptors> by Flags.PLUGINS.renderJsonAndBind()
-}
+)
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/utils/MiscUtils.kt b/kotlin/builder/src/io/bazel/kotlin/builder/utils/MiscUtils.kt
index 9ed9b85..1aab958 100644
--- a/kotlin/builder/src/io/bazel/kotlin/builder/utils/MiscUtils.kt
+++ b/kotlin/builder/src/io/bazel/kotlin/builder/utils/MiscUtils.kt
@@ -17,12 +17,11 @@
package io.bazel.kotlin.builder.utils
import io.bazel.kotlin.builder.Context
-import io.bazel.kotlin.builder.model.Flags
import io.bazel.kotlin.builder.model.Metas
-fun <T, C: MutableCollection<T>> C.addAll(vararg entries: T): C = this.also { addAll(entries) }
+fun <T, C : MutableCollection<T>> C.addAll(vararg entries: T): C = this.also { addAll(entries) }
fun String?.supplyIfNullOrBlank(s: () -> String): String = this?.takeIf { it.isNotBlank() } ?: s()
val Context.moduleName: String
- get() = Flags.KOTLIN_MODULE_NAME[this].supplyIfNullOrBlank { "${Metas.PKG[this].trimStart { it == '/' }.replace('/', '_')}-${Metas.TARGET[this]}" }
+ get() = flags.kotlinModuleName.supplyIfNullOrBlank { "${Metas.PKG[this].trimStart { it == '/' }.replace('/', '_')}-${Metas.TARGET[this]}" }
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/utils/PluginUtils.kt b/kotlin/builder/src/io/bazel/kotlin/builder/utils/PluginUtils.kt
index 27f4094..dfe1689 100644
--- a/kotlin/builder/src/io/bazel/kotlin/builder/utils/PluginUtils.kt
+++ b/kotlin/builder/src/io/bazel/kotlin/builder/utils/PluginUtils.kt
@@ -19,7 +19,6 @@
import io.bazel.kotlin.builder.KotlinToolchain.CompilerPlugin
import io.bazel.kotlin.builder.model.CompileDirectories
import io.bazel.kotlin.builder.model.CompilePluginConfig
-import io.bazel.kotlin.builder.model.PluginDescriptors
import java.io.ByteArrayOutputStream
import java.io.ObjectOutputStream
import java.util.*
@@ -63,7 +62,7 @@
companion object {
fun from(ctx: Context): List<String>? =
- PluginDescriptors[ctx]?.let { descriptor ->
+ ctx.flags.plugins?.let { descriptor ->
if (descriptor.processors.isNotEmpty()) {
val compileDirectories = CompileDirectories[ctx]
diff --git a/kotlin/internal/rules.bzl b/kotlin/internal/rules.bzl
index 93047ab..70ef7c8 100644
--- a/kotlin/internal/rules.bzl
+++ b/kotlin/internal/rules.bzl
@@ -85,7 +85,7 @@
utils.actions.write_launcher(
ctx,
transitive_runtime_jars,
- main_class = "com.google.testing.junit.runner.BazelTestRunner",
+ main_class = ctx.attr.main_class,
jvm_flags = launcherJvmFlags + ctx.attr.jvm_flags,
)
return compile.make_providers(
diff --git a/kotlin/kotlin.bzl b/kotlin/kotlin.bzl
index 346db07..e1f564a 100644
--- a/kotlin/kotlin.bzl
+++ b/kotlin/kotlin.bzl
@@ -320,7 +320,7 @@
allow_files = True,
),
"test_class": attr.string(),
- # "main_class": attr.string(),
+ "main_class": attr.string(default="com.google.testing.junit.runner.BazelTestRunner"),
}.items()),
executable = True,
outputs = _binary_outputs,