KT-60749 Scripting: default definition as a fallback
This commit effectively reverts changes made in the scope of KT-60193, namelyc9eebffband2d50bd68. ^KT-60749 fixed
This commit is contained in:
committed by
Space Team
parent
69a35970eb
commit
419381af7f
+8
-1
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.scripting.definitions
|
||||
import com.intellij.ide.highlighter.JavaFileType
|
||||
import com.intellij.injected.editor.VirtualFileWindow
|
||||
import com.intellij.openapi.application.ApplicationManager
|
||||
import com.intellij.openapi.diagnostic.Logger
|
||||
import com.intellij.openapi.fileTypes.FileTypeRegistry
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.openapi.util.Computable
|
||||
@@ -23,6 +24,7 @@ import kotlin.contracts.ExperimentalContracts
|
||||
import kotlin.contracts.contract
|
||||
import kotlin.script.experimental.api.SourceCode
|
||||
|
||||
|
||||
inline fun <T> runReadAction(crossinline runnable: () -> T): T {
|
||||
return ApplicationManager.getApplication().runReadAction(Computable { runnable() })
|
||||
}
|
||||
@@ -61,10 +63,15 @@ fun VirtualFile.findScriptDefinition(project: Project): ScriptDefinition? {
|
||||
return findScriptDefinition(project, VirtualFileScriptSource(this))
|
||||
}
|
||||
|
||||
fun findScriptDefinition(project: Project, script: SourceCode): ScriptDefinition? {
|
||||
fun findScriptDefinition(project: Project, script: SourceCode): ScriptDefinition {
|
||||
val scriptDefinitionProvider = ScriptDefinitionProvider.getInstance(project)
|
||||
?: error("Unable to get script definition: ScriptDefinitionProvider is not configured.")
|
||||
return scriptDefinitionProvider.findDefinition(script)
|
||||
?: scriptDefinitionProvider.getDefaultDefinition()
|
||||
.also {
|
||||
Logger.getInstance("org.jetbrains.kotlin.scripting.definitions")
|
||||
.debug("Default definition is used for ${script.locationId}")
|
||||
}
|
||||
}
|
||||
|
||||
private const val JAVA_CLASS_FILE_TYPE_DOT_DEFAULT_EXTENSION = ".class"
|
||||
|
||||
+13
-14
@@ -53,7 +53,10 @@ class FirScriptConfiguratorExtensionImpl(
|
||||
val sourceFile = fileBuilder.sourceFile ?: return
|
||||
|
||||
val configuration = getOrLoadConfiguration(sourceFile)
|
||||
check(configuration != null) { "Configuration for ${sourceFile.asString()} wasn't found" }
|
||||
?: run {
|
||||
log.warn("Configuration for ${sourceFile.asString()} wasn't found. FirScriptBuilder wasn't configured.")
|
||||
return
|
||||
}
|
||||
|
||||
// TODO: rewrite/extract decision logic for clarity
|
||||
configuration.getNoDefault(ScriptCompilationConfiguration.baseClass)?.let { baseClass ->
|
||||
@@ -162,23 +165,16 @@ class FirScriptConfiguratorExtensionImpl(
|
||||
|
||||
private fun KtSourceFile.asString() = path ?: name
|
||||
|
||||
private fun logConfiguration(file: KtSourceFile, config: ScriptCompilationConfiguration) {
|
||||
log.debug(
|
||||
"Using configuration: ${file.asString()} => " +
|
||||
"(${config[ScriptCompilationConfiguration.displayName]}, " +
|
||||
"ext=.${config[ScriptCompilationConfiguration.fileExtension]}, " +
|
||||
"pattern=${config[ScriptCompilationConfiguration.filePathPattern]})"
|
||||
)
|
||||
}
|
||||
|
||||
private fun getOrLoadConfiguration(file: KtSourceFile): ScriptCompilationConfiguration? {
|
||||
val service = checkNotNull(session.scriptDefinitionProviderService)
|
||||
val sourceCode = file.toSourceCode()
|
||||
val ktFile = sourceCode?.originalKtFile()
|
||||
return with(service) {
|
||||
ktFile?.let { asKtFile -> configurationFor(asKtFile)?.also { logConfiguration(file, it) } }
|
||||
?: sourceCode?.let { asSourceCode -> configurationFor(asSourceCode)?.also { logConfiguration(file, it) } }
|
||||
val configuration = with(service) {
|
||||
ktFile?.let { asKtFile -> configurationFor(asKtFile) }
|
||||
?: sourceCode?.let { asSourceCode -> configurationFor(asSourceCode) }
|
||||
?: defaultConfiguration()?.also { log.debug("Default configuration loaded for ${file.asString()}") }
|
||||
}
|
||||
return configuration
|
||||
}
|
||||
|
||||
private fun buildContextReceiverWithFqName(classFqn: FqName, customName: Name? = null) =
|
||||
@@ -202,7 +198,7 @@ class FirScriptConfiguratorExtensionImpl(
|
||||
get() = _knownAnnotationsForSamWithReceiver
|
||||
|
||||
companion object {
|
||||
private val log = Logger.getInstance(FirScriptConfiguratorExtensionImpl::class.java)
|
||||
private val log: Logger get() = Logger.getInstance(FirScriptConfiguratorExtensionImpl::class.java)
|
||||
|
||||
fun getFactory(hostConfiguration: ScriptingHostConfiguration): Factory {
|
||||
return Factory { session -> FirScriptConfiguratorExtensionImpl(session, hostConfiguration) }
|
||||
@@ -222,6 +218,9 @@ private fun FirScriptDefinitionProviderService.configurationFor(file: KtFile): S
|
||||
private fun FirScriptDefinitionProviderService.configurationFor(sourceCode: SourceCode): ScriptCompilationConfiguration? =
|
||||
definitionProvider?.findDefinition(sourceCode)?.compilationConfiguration
|
||||
|
||||
private fun FirScriptDefinitionProviderService.defaultConfiguration(): ScriptCompilationConfiguration? =
|
||||
definitionProvider?.getDefaultDefinition()?.compilationConfiguration
|
||||
|
||||
fun KtSourceFile.toSourceCode(): SourceCode? = when (this) {
|
||||
is KtPsiSourceFile -> (psiFile as? KtFile)?.let(::KtFileScriptSource) ?: VirtualFileScriptSource(psiFile.virtualFile)
|
||||
is KtVirtualFileSourceFile -> VirtualFileScriptSource(virtualFile)
|
||||
|
||||
Reference in New Issue
Block a user