Pick up script language level from used stdlib in a gradle's classpath

^KT-41283 Fixed
This commit is contained in:
Vladimir Dolzhenko
2020-08-26 14:09:58 +00:00
parent 949c67078d
commit 54d3c5fb0a
7 changed files with 87 additions and 35 deletions
@@ -16,7 +16,8 @@ class GradleKotlinScriptDefinitionWrapper(
hostConfiguration: ScriptingHostConfiguration,
legacyDefinition: KotlinScriptDefinitionFromAnnotatedTemplate,
gradleVersion: String,
) : ScriptDefinition.FromLegacy(hostConfiguration, legacyDefinition) {
defaultCompilerOptions: Iterable<String>
) : ScriptDefinition.FromLegacy(hostConfiguration, legacyDefinition, defaultCompilerOptions) {
override val compilationConfiguration by lazy {
ScriptCompilationConfigurationFromDefinition(
hostConfiguration,
@@ -15,7 +15,8 @@ class GradleKotlinScriptDefinitionWrapper(
hostConfiguration: ScriptingHostConfiguration,
legacyDefinition: KotlinScriptDefinitionFromAnnotatedTemplate,
gradleVersion: String,
) : ScriptDefinition.FromLegacy(hostConfiguration, legacyDefinition) {
defaultCompilerOptions: Iterable<String>
) : ScriptDefinition.FromLegacy(hostConfiguration, legacyDefinition, defaultCompilerOptions) {
override val compilationConfiguration by lazy {
ScriptCompilationConfigurationFromDefinition(
hostConfiguration,
@@ -11,6 +11,7 @@ import com.intellij.openapi.project.Project
import com.intellij.util.EnvironmentUtil
import com.intellij.util.PathUtil
import org.gradle.util.GradleVersion
import org.jetbrains.kotlin.config.LanguageVersion
import org.jetbrains.kotlin.idea.KotlinIdeaGradleBundle
import org.jetbrains.kotlin.idea.core.script.*
import org.jetbrains.kotlin.idea.scripting.gradle.importing.KotlinDslSyncListener
@@ -125,6 +126,19 @@ class GradleScriptDefinitionsContributor(private val project: Project) : ScriptD
file?.name?.startsWith("kotlin-compiler-embeddable") == true || file?.name?.startsWith("kotlin-stdlib") == true
}?.firstOrNull()?.let(::listOf).orEmpty()
}
private val kotlinStdLibSelector = Regex("^(kotlin-compiler-embeddable|kotlin-stdlib)-(\\d+\\.\\d+).*\\.jar\$")
fun findStdLibLanguageVersion(classpath: List<File>): LanguageVersion? {
return classpath.map { it.parentFile }.toSet().map {
it.listFiles { file ->
kotlinStdLibSelector.find(file.name) != null
}.firstOrNull()?.let { file ->
val matchResult = kotlinStdLibSelector.find(file.name) ?: return@let null
LanguageVersion.fromVersionString(matchResult.groupValues[2])
}
}.firstOrNull()
}
}
override val id: String = "Gradle Kotlin DSL"
@@ -236,12 +250,16 @@ class GradleScriptDefinitionsContributor(private val project: Project) : ScriptD
projectPath,
GradleConstants.SYSTEM_ID
)
val defaultCompilerOptions = findStdLibLanguageVersion(templateClasspath)?.let {
listOf("-language-version", it.versionString)
} ?: emptyList<String>()
val hostConfiguration = createHostConfiguration(projectPath, gradleHome, javaHome, gradleExeSettings)
return loadDefinitionsFromTemplates(
listOf(templateClass),
templateClasspath,
hostConfiguration,
additionalClassPath
additionalClassPath,
defaultCompilerOptions
).map {
it.asLegacyOrNull<KotlinScriptDefinitionFromAnnotatedTemplate>()?.let { legacyDef ->
// Expand scope for old gradle script definition
@@ -249,7 +267,8 @@ class GradleScriptDefinitionsContributor(private val project: Project) : ScriptD
GradleKotlinScriptDefinitionWrapper(
it.hostConfiguration,
legacyDef,
version
version,
defaultCompilerOptions
)
} ?: it
}