diff --git a/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/definitions/definitions.kt b/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/definitions/definitions.kt index 72f8954cfad..460bfd71936 100644 --- a/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/definitions/definitions.kt +++ b/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/definitions/definitions.kt @@ -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 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" diff --git a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/services/FirScriptConfigurationExtensionImpl.kt b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/services/FirScriptConfigurationExtensionImpl.kt index 4f191db7e5c..37b4fbe2d88 100644 --- a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/services/FirScriptConfigurationExtensionImpl.kt +++ b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/services/FirScriptConfigurationExtensionImpl.kt @@ -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)