From ca71b2fe900bf0509466679461837809a1224178 Mon Sep 17 00:00:00 2001 From: Natalia Selezneva Date: Thu, 14 Nov 2019 13:33:32 +0300 Subject: [PATCH] Add script configuration dependencies to script classpath It was missing during configuration refinement thought new scripting API and during loading script configuration on Gradle project import Do not pass additional classpath to configuration classpath: this may only affects Gradle with New scripting API (because it isn't used from other places) In additional classpath kotlin-compiler and kotlin-stdlib was passed and there is no needs for this during loading Script Definitions through new scripting API ^KT-34626 Fixed --- .../core/script/ScriptDefinitionsManager.kt | 17 ++-------- .../KotlinGradleBuildScriptsDataService.kt | 26 ++++++++++----- .../definition/defaultTemplate/template.kt | 3 -- .../emptyAsyncResolver/template/template.kt | 33 ++++++++++--------- .../scripting/resolve/ScriptContentLoader.kt | 9 ----- .../resolve/refineCompilationConfiguration.kt | 23 +++++++++++-- 6 files changed, 58 insertions(+), 53 deletions(-) diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDefinitionsManager.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDefinitionsManager.kt index 308e40638cd..4efb84700f2 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDefinitionsManager.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDefinitionsManager.kt @@ -1,17 +1,6 @@ /* - * 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. + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ package org.jetbrains.kotlin.idea.core.script @@ -235,7 +224,7 @@ fun loadDefinitionsFromTemplates( // as a compatibility measure, the asm based reading of annotations should be implemented to filter classes before classloading val template = loader.loadClass(templateClassName).kotlin val hostConfiguration = ScriptingHostConfiguration(baseHostConfiguration) { - configurationDependencies(JvmDependency(classpath)) + configurationDependencies(JvmDependency(templateClasspath)) } when { template.annotations.firstIsInstanceOrNull() != null -> { diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleBuildScriptsDataService.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleBuildScriptsDataService.kt index c15e8479973..c68920cad90 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleBuildScriptsDataService.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleBuildScriptsDataService.kt @@ -29,12 +29,16 @@ import org.jetbrains.kotlin.idea.core.script.configuration.getGradleScriptInputs import org.jetbrains.kotlin.scripting.definitions.findScriptDefinition import org.jetbrains.kotlin.scripting.resolve.ScriptCompilationConfigurationWrapper import org.jetbrains.kotlin.scripting.resolve.VirtualFileScriptSource +import org.jetbrains.kotlin.scripting.resolve.adjustByDefinition import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult import org.jetbrains.plugins.gradle.model.data.GradleSourceSetData import org.jetbrains.plugins.gradle.settings.GradleExecutionSettings import org.jetbrains.plugins.gradle.util.GradleConstants import java.io.File -import kotlin.script.experimental.dependencies.ScriptDependencies +import kotlin.script.experimental.api.* +import kotlin.script.experimental.jvm.JvmDependency +import kotlin.script.experimental.jvm.jdkHome +import kotlin.script.experimental.jvm.jvm class KotlinGradleBuildScriptsDataService : AbstractProjectDataService() { override fun getTargetDataKey(): Key = GradleSourceSetData.KEY @@ -67,21 +71,25 @@ class KotlinGradleBuildScriptsDataService : AbstractProjectDataService) + +@Suppress("UNCHECKED_CAST") +object TemplateDefinition : ScriptCompilationConfiguration( + { + baseClass(Base::class) + ide { + acceptedLocations(ScriptAcceptedLocation.Everywhere) + } } -} - -@ScriptExpectedLocations([ScriptExpectedLocation.Everywhere]) -@ScriptTemplateDefinition(TestDependenciesResolver::class, scriptFilePattern = "script.kts") -open class Template: Base() +) open class Base { val i = 3 diff --git a/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/resolve/ScriptContentLoader.kt b/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/resolve/ScriptContentLoader.kt index cdcbcffb216..2a765f8491f 100644 --- a/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/resolve/ScriptContentLoader.kt +++ b/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/resolve/ScriptContentLoader.kt @@ -12,7 +12,6 @@ import java.io.File import kotlin.script.dependencies.ScriptContents import kotlin.script.experimental.dependencies.DependenciesResolver import kotlin.script.experimental.dependencies.DependenciesResolver.ResolveResult.Failure -import kotlin.script.experimental.dependencies.ScriptDependencies import kotlin.script.experimental.dependencies.ScriptReport class ScriptContentLoader(private val project: Project) { @@ -54,14 +53,6 @@ class ScriptContentLoader(private val project: Project) { (scriptDef as? KotlinScriptDefinitionFromAnnotatedTemplate)?.environment.orEmpty() } -fun ScriptDependencies.adjustByDefinition( - scriptDef: KotlinScriptDefinition -): ScriptDependencies { - val additionalClasspath = (scriptDef as? KotlinScriptDefinitionFromAnnotatedTemplate)?.templateClasspath ?: return this - if (additionalClasspath.isEmpty()) return this - return copy(classpath = additionalClasspath + classpath) -} - fun Throwable.asResolveFailure(scriptDef: KotlinScriptDefinition): Failure { val prefix = "${scriptDef.dependencyResolver::class.simpleName} threw exception ${this::class.simpleName}:\n " return Failure(ScriptReport(prefix + (message ?: ""), ScriptReport.Severity.FATAL)) diff --git a/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/resolve/refineCompilationConfiguration.kt b/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/resolve/refineCompilationConfiguration.kt index fdc88295b15..9f2cd601919 100644 --- a/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/resolve/refineCompilationConfiguration.kt +++ b/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/resolve/refineCompilationConfiguration.kt @@ -229,7 +229,10 @@ fun refineScriptCompilationConfiguration( .onSuccess { it.refineBeforeCompiling(script, collectedData) }.onSuccess { - ScriptCompilationConfigurationWrapper.FromCompilationConfiguration(ktFileSource, it).asSuccess() + ScriptCompilationConfigurationWrapper.FromCompilationConfiguration( + ktFileSource, + it.adjustByDefinition(definition) + ).asSuccess() } } else { val file = script.getVirtualFile(definition) @@ -260,12 +263,28 @@ fun refineScriptCompilationConfiguration( else ScriptCompilationConfigurationWrapper.FromLegacy( ktFileSource, - result.dependencies?.adjustByDefinition(definition.legacyDefinition), + result.dependencies?.adjustByDefinition(definition), definition ).asSuccess(result.reports.mapToDiagnostics()) } } +fun ScriptDependencies.adjustByDefinition(definition: ScriptDefinition): ScriptDependencies { + val additionalClasspath = additionalClasspath(definition) + if (additionalClasspath.isEmpty()) return this + + return copy(classpath = additionalClasspath + classpath) +} + +fun ScriptCompilationConfiguration.adjustByDefinition(definition: ScriptDefinition): ScriptCompilationConfiguration { + return this.withUpdatedClasspath(additionalClasspath(definition)) +} + +private fun additionalClasspath(definition: ScriptDefinition): List { + return (definition.asLegacyOrNull()?.templateClasspath + ?: definition.hostConfiguration[ScriptingHostConfiguration.configurationDependencies].toClassPathOrEmpty()) +} + internal fun makeScriptContents( file: VirtualFile, legacyDefinition: KotlinScriptDefinition,