Map compiler arguments to Gradle inputs.
This commit is contained in:
+5
-1
@@ -22,7 +22,7 @@ import org.jetbrains.kotlin.cli.common.arguments.CommonToolArguments
|
|||||||
import org.jetbrains.kotlin.compilerRunner.ArgumentUtils
|
import org.jetbrains.kotlin.compilerRunner.ArgumentUtils
|
||||||
|
|
||||||
interface CompilerArgumentAware<T : CommonToolArguments> {
|
interface CompilerArgumentAware<T : CommonToolArguments> {
|
||||||
@get:Input
|
@get:Internal
|
||||||
val serializedCompilerArguments: List<String>
|
val serializedCompilerArguments: List<String>
|
||||||
get() = ArgumentUtils.convertArgumentsToStringList(prepareCompilerArguments())
|
get() = ArgumentUtils.convertArgumentsToStringList(prepareCompilerArguments())
|
||||||
|
|
||||||
@@ -32,6 +32,10 @@ interface CompilerArgumentAware<T : CommonToolArguments> {
|
|||||||
.also { setupCompilerArgs(it, defaultsOnly = true) }
|
.also { setupCompilerArgs(it, defaultsOnly = true) }
|
||||||
.let(ArgumentUtils::convertArgumentsToStringList)
|
.let(ArgumentUtils::convertArgumentsToStringList)
|
||||||
|
|
||||||
|
@get:Input
|
||||||
|
val filteredArgumentsMap: Map<String, String>
|
||||||
|
get() = CompilerArgumentsGradleInput.createInputsMap(prepareCompilerArguments())
|
||||||
|
|
||||||
fun createCompilerArgs(): T
|
fun createCompilerArgs(): T
|
||||||
fun setupCompilerArgs(args: T, defaultsOnly: Boolean = false)
|
fun setupCompilerArgs(args: T, defaultsOnly: Boolean = false)
|
||||||
}
|
}
|
||||||
|
|||||||
+72
@@ -0,0 +1,72 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2017 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* 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 org.jetbrains.kotlin.gradle.internal
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.cli.common.arguments.*
|
||||||
|
import kotlin.reflect.KProperty
|
||||||
|
import kotlin.reflect.KProperty1
|
||||||
|
import kotlin.reflect.full.memberProperties
|
||||||
|
|
||||||
|
internal object CompilerArgumentsGradleInput {
|
||||||
|
fun <T : CommonToolArguments> createInputsMap(args: T): Map<String, String> {
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
val argumentProperties =
|
||||||
|
args::class.members.mapNotNull { member ->
|
||||||
|
(member as? KProperty1<T, *>)?.takeIf { it.annotations.any { ann -> ann is Argument } }
|
||||||
|
} +
|
||||||
|
(CommonToolArguments::freeArgs as KProperty1<T, *>)
|
||||||
|
|
||||||
|
val filteredProperties = argumentProperties.filterNot { it in ignoredProperties }
|
||||||
|
|
||||||
|
fun inputItem(property: KProperty1<out T, *>): Pair<String, String> {
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
val value = (property as KProperty1<T, *>).get(args)
|
||||||
|
return property.name to if (value is Array<*>)
|
||||||
|
value.asList().toString()
|
||||||
|
else
|
||||||
|
value.toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
return filteredProperties.associate(::inputItem).toSortedMap()
|
||||||
|
}
|
||||||
|
|
||||||
|
// We ignore some file properties e.g. to instead include their values into the Gradle file property checks,
|
||||||
|
// which, unlike String checks, run with specified path sensitivity;
|
||||||
|
private val ignoredProperties = setOf<KProperty<*>>(
|
||||||
|
K2JVMCompilerArguments::destination, // handled by destinationDir
|
||||||
|
K2JVMCompilerArguments::classpath, // handled by classpath of the Gradle tasks
|
||||||
|
K2JVMCompilerArguments::friendPaths, // is part of the classpath
|
||||||
|
K2JVMCompilerArguments::jdkHome, // JDK can be both placed differently and contain different files on user machines
|
||||||
|
K2JVMCompilerArguments::buildFile, // in Gradle build, these XMLs are transient and provide no useful info
|
||||||
|
K2JVMCompilerArguments::pluginOptions, // handled specially in the task
|
||||||
|
K2JVMCompilerArguments::pluginClasspaths, // handled in the task as classpath
|
||||||
|
|
||||||
|
K2JSCompilerArguments::outputFile, // already handled by Gradle task property
|
||||||
|
K2JSCompilerArguments::libraries, // defined by by classpath and friendDependency of the Gradle task
|
||||||
|
K2JSCompilerArguments::sourceMapBaseDirs, // defined by sources
|
||||||
|
K2JSCompilerArguments::friendModules, // handled by Gradle task friendDependency property
|
||||||
|
K2JSCompilerArguments::pluginOptions, // handled specially in the task
|
||||||
|
K2JSCompilerArguments::pluginClasspaths, // handled in the task as classpath
|
||||||
|
|
||||||
|
K2MetadataCompilerArguments::classpath, // handled by classpath of the Gradle task
|
||||||
|
K2MetadataCompilerArguments::destination, // handled by destinationDir
|
||||||
|
K2MetadataCompilerArguments::pluginOptions, // handled specially in the task
|
||||||
|
K2MetadataCompilerArguments::pluginClasspaths, // handled in the task as classpath
|
||||||
|
|
||||||
|
K2JSDceArguments::outputDirectory // handled by destinationDir
|
||||||
|
)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user