Pass provided script configuration to refining code
when script compilation configuration refinement happening during parsing, the updated configuration passed to the script compiler/REPL compile function is now used. #KT-44580 fixed
This commit is contained in:
+13
-6
@@ -6,7 +6,6 @@
|
||||
package org.jetbrains.kotlin.scripting.compiler.plugin.definitions
|
||||
|
||||
import com.intellij.openapi.components.ServiceManager
|
||||
import com.intellij.openapi.diagnostic.Logger
|
||||
import com.intellij.openapi.project.Project
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
import org.jetbrains.kotlin.scripting.definitions.ScriptDependenciesProvider
|
||||
@@ -15,28 +14,36 @@ import org.jetbrains.kotlin.scripting.resolve.KtFileScriptSource
|
||||
import org.jetbrains.kotlin.scripting.resolve.ScriptCompilationConfigurationResult
|
||||
import org.jetbrains.kotlin.scripting.resolve.ScriptReportSink
|
||||
import org.jetbrains.kotlin.scripting.resolve.refineScriptCompilationConfiguration
|
||||
import java.io.File
|
||||
import java.util.concurrent.locks.ReentrantReadWriteLock
|
||||
import kotlin.concurrent.read
|
||||
import kotlin.concurrent.write
|
||||
import kotlin.script.experimental.api.ResultWithDiagnostics
|
||||
import kotlin.script.experimental.api.ScriptCompilationConfiguration
|
||||
|
||||
class CliScriptDependenciesProvider(project: Project) : ScriptDependenciesProvider(project) {
|
||||
private val cacheLock = ReentrantReadWriteLock()
|
||||
private val cache = hashMapOf<String, ScriptCompilationConfigurationResult?>()
|
||||
|
||||
override fun getScriptConfigurationResult(file: KtFile): ScriptCompilationConfigurationResult? = cacheLock.read {
|
||||
calculateRefinedConfiguration(file)
|
||||
calculateRefinedConfiguration(file, null)
|
||||
}
|
||||
|
||||
private fun calculateRefinedConfiguration(file: KtFile): ScriptCompilationConfigurationResult? {
|
||||
override fun getScriptConfigurationResult(
|
||||
file: KtFile,
|
||||
providedConfiguration: ScriptCompilationConfiguration?
|
||||
): ScriptCompilationConfigurationResult? = cacheLock.read {
|
||||
calculateRefinedConfiguration(file, providedConfiguration)
|
||||
}
|
||||
|
||||
private fun calculateRefinedConfiguration(
|
||||
file: KtFile, providedConfiguration: ScriptCompilationConfiguration?
|
||||
): ScriptCompilationConfigurationResult? {
|
||||
val path = file.virtualFilePath
|
||||
val cached = cache[path]
|
||||
return if (cached != null) cached
|
||||
else {
|
||||
val scriptDef = file.findScriptDefinition()
|
||||
if (scriptDef != null) {
|
||||
val result = refineScriptCompilationConfiguration(KtFileScriptSource(file), scriptDef, project)
|
||||
val result = refineScriptCompilationConfiguration(KtFileScriptSource(file), scriptDef, project, providedConfiguration)
|
||||
|
||||
ServiceManager.getService(project, ScriptReportSink::class.java)?.attachReports(file.virtualFile, result.reports)
|
||||
|
||||
|
||||
+4
-2
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.psi.KtFile
|
||||
import org.jetbrains.kotlin.scripting.definitions.ScriptDependenciesProvider
|
||||
import java.io.File
|
||||
import kotlin.script.experimental.api.ResultWithDiagnostics
|
||||
import kotlin.script.experimental.api.ScriptCompilationConfiguration
|
||||
import kotlin.script.experimental.api.asSuccess
|
||||
import kotlin.script.experimental.host.FileBasedScriptSource
|
||||
|
||||
@@ -32,7 +33,8 @@ data class ScriptsCompilationDependencies(
|
||||
fun collectScriptsCompilationDependencies(
|
||||
configuration: CompilerConfiguration,
|
||||
project: Project,
|
||||
initialSources: Iterable<KtFile>
|
||||
initialSources: Iterable<KtFile>,
|
||||
providedConfiguration: ScriptCompilationConfiguration? = null
|
||||
): ScriptsCompilationDependencies {
|
||||
val collectedClassPath = ArrayList<File>()
|
||||
val collectedSources = ArrayList<KtFile>()
|
||||
@@ -44,7 +46,7 @@ fun collectScriptsCompilationDependencies(
|
||||
while (true) {
|
||||
val newRemainingSources = ArrayList<KtFile>()
|
||||
for (source in remainingSources) {
|
||||
when (val refinedConfiguration = importsProvider.getScriptConfigurationResult(source)) {
|
||||
when (val refinedConfiguration = importsProvider.getScriptConfigurationResult(source, providedConfiguration)) {
|
||||
null -> {}
|
||||
is ResultWithDiagnostics.Failure -> {
|
||||
collectedSourceDependencies.add(ScriptsCompilationDependencies.SourceDependencies(source, refinedConfiguration))
|
||||
|
||||
+2
-1
@@ -19,10 +19,10 @@ import org.jetbrains.kotlin.codegen.state.GenerationState
|
||||
import org.jetbrains.kotlin.descriptors.ScriptDescriptor
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
import org.jetbrains.kotlin.resolve.calls.tower.ImplicitsExtensionsResolutionFilter
|
||||
import org.jetbrains.kotlin.scripting.compiler.plugin.repl.ReplImplicitsExtensionsResolutionFilter
|
||||
import org.jetbrains.kotlin.scripting.compiler.plugin.repl.JvmReplCompilerStageHistory
|
||||
import org.jetbrains.kotlin.scripting.compiler.plugin.repl.JvmReplCompilerState
|
||||
import org.jetbrains.kotlin.scripting.compiler.plugin.repl.ReplCodeAnalyzerBase
|
||||
import org.jetbrains.kotlin.scripting.compiler.plugin.repl.ReplImplicitsExtensionsResolutionFilter
|
||||
import org.jetbrains.kotlin.scripting.definitions.ScriptDependenciesProvider
|
||||
import org.jetbrains.kotlin.scripting.resolve.skipExtensionsResolutionForImplicits
|
||||
import org.jetbrains.kotlin.scripting.resolve.skipExtensionsResolutionForImplicitsExceptInnermost
|
||||
@@ -90,6 +90,7 @@ open class KJvmReplCompilerBase<AnalyzerT : ReplCodeAnalyzerBase> protected cons
|
||||
val (sourceFiles, sourceDependencies) = collectRefinedSourcesAndUpdateEnvironment(
|
||||
context,
|
||||
snippetKtFile,
|
||||
initialConfiguration,
|
||||
messageCollector
|
||||
)
|
||||
|
||||
|
||||
+4
-2
@@ -50,7 +50,7 @@ class ScriptJvmCompilerIsolated(val hostConfiguration: ScriptingHostConfiguratio
|
||||
initialConfiguration, hostConfiguration, messageCollector, disposable
|
||||
)
|
||||
|
||||
compileImpl(script, context, messageCollector)
|
||||
compileImpl(script, context, initialConfiguration, messageCollector)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -74,7 +74,7 @@ class ScriptJvmCompilerFromEnvironment(val environment: KotlinCoreEnvironment) :
|
||||
try {
|
||||
environment.configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, messageCollector)
|
||||
|
||||
compileImpl(script, context, messageCollector)
|
||||
compileImpl(script, context, initialConfiguration, messageCollector)
|
||||
} finally {
|
||||
if (parentMessageCollector != null)
|
||||
environment.configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, parentMessageCollector)
|
||||
@@ -105,6 +105,7 @@ private fun withScriptCompilationCache(
|
||||
private fun compileImpl(
|
||||
script: SourceCode,
|
||||
context: SharedScriptCompilationContext,
|
||||
initialConfiguration: ScriptCompilationConfiguration,
|
||||
messageCollector: ScriptDiagnosticsMessageCollector
|
||||
): ResultWithDiagnostics<CompiledScript> {
|
||||
val mainKtFile =
|
||||
@@ -121,6 +122,7 @@ private fun compileImpl(
|
||||
val (sourceFiles, sourceDependencies) = collectRefinedSourcesAndUpdateEnvironment(
|
||||
context,
|
||||
mainKtFile,
|
||||
initialConfiguration,
|
||||
messageCollector
|
||||
)
|
||||
|
||||
|
||||
+4
-2
@@ -32,11 +32,11 @@ import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||
import org.jetbrains.kotlin.extensions.AnnotationBasedExtension
|
||||
import org.jetbrains.kotlin.extensions.StorageComponentContainerContributor
|
||||
import org.jetbrains.kotlin.resolve.sam.SamWithReceiverResolver
|
||||
import org.jetbrains.kotlin.platform.TargetPlatform
|
||||
import org.jetbrains.kotlin.platform.jvm.isJvm
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
import org.jetbrains.kotlin.psi.KtModifierListOwner
|
||||
import org.jetbrains.kotlin.resolve.sam.SamWithReceiverResolver
|
||||
import org.jetbrains.kotlin.scripting.compiler.plugin.ScriptingCompilerConfigurationComponentRegistrar
|
||||
import org.jetbrains.kotlin.scripting.compiler.plugin.dependencies.ScriptsCompilationDependencies
|
||||
import org.jetbrains.kotlin.scripting.compiler.plugin.dependencies.collectScriptsCompilationDependencies
|
||||
@@ -273,6 +273,7 @@ private fun createInitialCompilerConfiguration(
|
||||
internal fun collectRefinedSourcesAndUpdateEnvironment(
|
||||
context: SharedScriptCompilationContext,
|
||||
mainKtFile: KtFile,
|
||||
initialConfiguration: ScriptCompilationConfiguration,
|
||||
messageCollector: ScriptDiagnosticsMessageCollector
|
||||
): Pair<List<KtFile>, List<ScriptsCompilationDependencies.SourceDependencies>> {
|
||||
val sourceFiles = arrayListOf(mainKtFile)
|
||||
@@ -280,7 +281,8 @@ internal fun collectRefinedSourcesAndUpdateEnvironment(
|
||||
collectScriptsCompilationDependencies(
|
||||
context.environment.configuration,
|
||||
context.environment.project,
|
||||
sourceFiles
|
||||
sourceFiles,
|
||||
initialConfiguration
|
||||
)
|
||||
|
||||
context.environment.updateClasspath(classpath.map(::JvmClasspathRoot))
|
||||
|
||||
Reference in New Issue
Block a user