Skip to content

Commit 591910a

Browse files
committed
Kotlin Facet: Import compiler arguments from Gradle project
#KT-15819 Fixed #KT-15929 Fixed
1 parent dafb6f8 commit 591910a

File tree

7 files changed

+72
-15
lines changed

7 files changed

+72
-15
lines changed

.idea/artifacts/KotlinPlugin.xml

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/argumentUtils.kt

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,17 @@ import java.lang.reflect.Field
2222
import java.lang.reflect.Modifier
2323
import java.util.*
2424

25-
fun <A : CommonCompilerArguments> parseArguments(args: Array<String>, arguments: A) {
25+
@JvmOverloads fun <A : CommonCompilerArguments> parseArguments(args: Array<String>, arguments: A, ignoreInvalidArguments: Boolean = false) {
2626
val unparsedArgs = Args.parse(arguments, args, false)
2727
val (unknownExtraArgs, unknownArgs) = unparsedArgs.partition { it.startsWith("-X") }
2828
arguments.unknownExtraFlags = unknownExtraArgs
29-
arguments.freeArgs = unknownArgs
29+
arguments.freeArgs = if (ignoreInvalidArguments) unknownArgs.filterNot { it.startsWith("-") } else unknownArgs
3030

31-
for (argument in arguments.freeArgs) {
32-
if (argument.startsWith("-")) {
33-
throw IllegalArgumentException("Invalid argument: " + argument)
31+
if (!ignoreInvalidArguments) {
32+
for (argument in unknownArgs) {
33+
if (argument.startsWith("-")) {
34+
throw IllegalArgumentException("Invalid argument: " + argument)
35+
}
3436
}
3537
}
3638
}

idea/kotlin-gradle-tooling/kotlin-gradle-tooling.iml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
</content>
88
<orderEntry type="inheritedJdk" />
99
<orderEntry type="sourceFolder" forTests="false" />
10+
<orderEntry type="module" module-name="cli-common" />
1011
<orderEntry type="library" name="gradle-and-groovy-plugin" level="project" />
1112
<orderEntry type="library" name="kotlin-runtime" level="project" />
1213
</component>

idea/kotlin-gradle-tooling/src/KotlinGradleModelBuilder.kt

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,25 +25,46 @@ import java.lang.Exception
2525

2626
interface KotlinGradleModel : Serializable {
2727
val implements: String?
28+
val serializedCompilerArguments: List<String>?
2829
}
2930

30-
class KotlinGradleModelImpl(override val implements: String?) : KotlinGradleModel
31+
class KotlinGradleModelImpl(
32+
override val implements: String?,
33+
override val serializedCompilerArguments: List<String>?
34+
) : KotlinGradleModel
3135

3236
class KotlinGradleModelBuilder : ModelBuilderService {
37+
companion object {
38+
val compileTasks = listOf("compileKotlin", "compileKotlin2Js")
39+
}
40+
3341
override fun getErrorMessageBuilder(project: Project, e: Exception): ErrorMessageBuilder {
3442
return ErrorMessageBuilder.create(project, e, "Gradle import errors").withDescription("Unable to build Kotlin project configuration")
3543
}
3644

3745
override fun canBuild(modelName: String?): Boolean = modelName == KotlinGradleModel::class.java.name
3846

39-
override fun buildAll(modelName: String?, project: Project): Any {
47+
private fun getImplements(project: Project): String? {
4048
val implementsConfiguration = project.configurations.findByName("implement")
4149
if (implementsConfiguration != null) {
4250
val implementsProjectDependency = implementsConfiguration.dependencies.filterIsInstance<ProjectDependency>().firstOrNull()
43-
if (implementsProjectDependency != null) {
44-
return KotlinGradleModelImpl(implementsProjectDependency.dependencyProject.path)
45-
}
51+
if (implementsProjectDependency != null) return implementsProjectDependency.dependencyProject.path
4652
}
47-
return KotlinGradleModelImpl(null)
53+
return null
4854
}
55+
56+
@Suppress("UNCHECKED_CAST")
57+
private fun getCompilerArguments(project: Project): List<String>? {
58+
val compileTask = compileTasks.mapNotNull { project.getTasksByName(it, false).firstOrNull() }.firstOrNull() ?: return null
59+
val taskClass = compileTask.javaClass
60+
return try {
61+
taskClass.getDeclaredMethod("getSerializedCompilerArguments").invoke(compileTask) as List<String>
62+
}
63+
catch (e : NoSuchMethodException) {
64+
null
65+
}
66+
}
67+
68+
override fun buildAll(modelName: String?, project: Project) =
69+
KotlinGradleModelImpl(getImplements(project), getCompilerArguments(project))
4970
}

idea/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleProjectDataService.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,13 @@ import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsPr
2424
import com.intellij.openapi.externalSystem.service.project.manage.AbstractProjectDataService
2525
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil
2626
import com.intellij.openapi.project.Project
27+
import com.intellij.util.text.VersionComparatorUtil
28+
import org.jetbrains.kotlin.cli.common.arguments.*
2729
import org.jetbrains.kotlin.config.CoroutineSupport
2830
import org.jetbrains.kotlin.config.JvmTarget
2931
import org.jetbrains.kotlin.config.TargetPlatformKind
3032
import org.jetbrains.kotlin.extensions.ProjectExtensionDescriptor
31-
import org.jetbrains.kotlin.idea.facet.KotlinFacet
32-
import org.jetbrains.kotlin.idea.facet.configureFacet
33-
import org.jetbrains.kotlin.idea.facet.getOrCreateFacet
34-
import org.jetbrains.kotlin.idea.facet.mavenLibraryId
33+
import org.jetbrains.kotlin.idea.facet.*
3534
import org.jetbrains.kotlin.idea.inspections.gradle.findAll
3635
import org.jetbrains.kotlin.idea.inspections.gradle.findKotlinPluginVersion
3736
import org.jetbrains.kotlin.idea.inspections.gradle.getResolvedKotlinStdlibVersionByModuleData
@@ -88,6 +87,7 @@ class KotlinGradleProjectDataService : AbstractProjectDataService<GradleSourceSe
8887

8988
val kotlinFacet = ideModule.getOrCreateFacet(modelsProvider, false)
9089
kotlinFacet.configureFacet(compilerVersion, coroutinesProperty, platformKind, modelsProvider)
90+
moduleNode.serializedCompilerArguments?.let { parseCompilerArgumentsToFacet(it, kotlinFacet) }
9191
GradleProjectImportHandler.getInstances(project).forEach { it(kotlinFacet, sourceSetNode) }
9292
}
9393
}

idea/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleProjectResolverExtension.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,18 @@ import com.intellij.openapi.externalSystem.model.project.ModuleDependencyData
2323
import com.intellij.openapi.externalSystem.model.project.ProjectData
2424
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil
2525
import com.intellij.openapi.roots.DependencyScope
26+
import com.intellij.openapi.util.Key
2627
import org.gradle.tooling.model.idea.IdeaModule
2728
import org.jetbrains.kotlin.gradle.KotlinGradleModel
2829
import org.jetbrains.kotlin.gradle.KotlinGradleModelBuilder
30+
import org.jetbrains.kotlin.psi.UserDataProperty
2931
import org.jetbrains.plugins.gradle.model.ExternalProject
3032
import org.jetbrains.plugins.gradle.model.data.GradleSourceSetData
3133
import org.jetbrains.plugins.gradle.service.project.AbstractProjectResolverExtension
3234
import org.jetbrains.plugins.gradle.service.project.GradleProjectResolverUtil.getModuleId
3335

36+
var DataNode<ModuleData>.serializedCompilerArguments by UserDataProperty(Key.create<List<String>>("SERIALIZED_COMPILER_ARGUMENTS"))
37+
3438
class KotlinGradleProjectResolverExtension : AbstractProjectResolverExtension() {
3539
override fun getToolingExtensionsClasses(): Set<Class<out Any>> {
3640
return setOf(KotlinGradleModelBuilder::class.java, Unit::class.java)
@@ -44,6 +48,7 @@ class KotlinGradleProjectResolverExtension : AbstractProjectResolverExtension()
4448
ideModule: DataNode<ModuleData>,
4549
ideProject: DataNode<ProjectData>) {
4650
val gradleModel = resolverCtx.getExtraProject(gradleModule, KotlinGradleModel::class.java) ?: return
51+
4752
gradleModel.implements?.let { implementsModuleId ->
4853
val targetModule = findModule(ideProject, implementsModuleId) ?: return
4954
if (resolverCtx.isResolveModulePerSourceSet) {
@@ -54,6 +59,8 @@ class KotlinGradleProjectResolverExtension : AbstractProjectResolverExtension()
5459
}
5560
}
5661

62+
ideModule.serializedCompilerArguments = gradleModel.serializedCompilerArguments
63+
5764
super.populateModuleDependencies(gradleModule, ideModule, ideProject)
5865
}
5966

idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ import com.intellij.openapi.roots.ModuleRootManager
2525
import com.intellij.openapi.roots.ModuleRootModel
2626
import com.intellij.openapi.roots.OrderRootType
2727
import com.intellij.util.text.VersionComparatorUtil
28+
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
2829
import org.jetbrains.kotlin.cli.common.arguments.copyBean
30+
import org.jetbrains.kotlin.cli.common.arguments.parseArguments
2931
import org.jetbrains.kotlin.config.*
3032
import org.jetbrains.kotlin.idea.compiler.configuration.Kotlin2JsCompilerArgumentsHolder
3133
import org.jetbrains.kotlin.idea.compiler.configuration.KotlinCommonCompilerArgumentsHolder
@@ -181,4 +183,27 @@ fun KotlinFacet.configureFacet(
181183
}
182184
compilerInfo.coroutineSupport = coroutineSupport
183185
}
186+
}
187+
188+
fun parseCompilerArgumentsToFacet(arguments: List<String>, kotlinFacet: KotlinFacet) {
189+
val argumentArray = arguments.toTypedArray()
190+
with(kotlinFacet.configuration.settings) {
191+
// todo: merge common arguments with platform-specific ones in facet settings
192+
parseArguments(argumentArray, compilerInfo.commonCompilerArguments!!, ignoreInvalidArguments = true)
193+
194+
when (versionInfo.targetPlatformKind) {
195+
is TargetPlatformKind.Jvm -> {
196+
val jvmTarget = K2JVMCompilerArguments().apply { parseArguments(argumentArray, this) }.jvmTarget
197+
if (jvmTarget != null) {
198+
versionInfo.targetPlatformKind = TargetPlatformKind.Jvm.JVM_PLATFORMS.firstOrNull {
199+
VersionComparatorUtil.compare(it.version.description, jvmTarget) >= 0
200+
} ?: TargetPlatformKind.Jvm.JVM_PLATFORMS.last()
201+
}
202+
}
203+
is TargetPlatformKind.JavaScript -> parseArguments(argumentArray, compilerInfo.k2jsCompilerArguments!!)
204+
else -> {}
205+
}
206+
207+
compilerInfo.compilerSettings!!.additionalArguments = compilerInfo.commonCompilerArguments!!.freeArgs.joinToString(separator = " ")
208+
}
184209
}

0 commit comments

Comments
 (0)