diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/script/CliScriptDefinitionProvider.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/common/script/CliScriptDefinitionProvider.kt index 9c77c96af4b..fadf8d880a6 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/script/CliScriptDefinitionProvider.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/script/CliScriptDefinitionProvider.kt @@ -16,7 +16,10 @@ package org.jetbrains.kotlin.cli.common.script -import org.jetbrains.kotlin.script.* +import org.jetbrains.kotlin.script.KotlinScriptDefinition +import org.jetbrains.kotlin.script.LazyScriptDefinitionProvider +import org.jetbrains.kotlin.script.ScriptDefinitionsSource +import org.jetbrains.kotlin.script.StandardScriptDefinition import kotlin.concurrent.write class CliScriptDefinitionProvider : LazyScriptDefinitionProvider() { @@ -26,6 +29,10 @@ class CliScriptDefinitionProvider : LazyScriptDefinitionProvider() { override val currentDefinitions: Sequence = definitionsFromSources.asSequence().flatMap { it } + definitions.asSequence() + override fun getDefaultScriptDefinition(): KotlinScriptDefinition { + return StandardScriptDefinition + } + fun setScriptDefinitions(newDefinitions: List) { lock.write { definitions.clear() diff --git a/compiler/psi/src/org/jetbrains/kotlin/psi/KtScript.java b/compiler/psi/src/org/jetbrains/kotlin/psi/KtScript.java index d1fef8692b8..bcbda5cfa71 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/psi/KtScript.java +++ b/compiler/psi/src/org/jetbrains/kotlin/psi/KtScript.java @@ -25,18 +25,18 @@ import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.psi.stubs.KotlinScriptStub; import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes; import org.jetbrains.kotlin.script.KotlinScriptDefinition; -import org.jetbrains.kotlin.script.KotlinScriptDefinitionProviderKt; +import org.jetbrains.kotlin.script.ScriptDefinitionProvider; import java.util.List; -import java.util.Objects; import static kotlin.LazyThreadSafetyMode.PUBLICATION; public class KtScript extends KtNamedDeclarationStub implements KtDeclarationContainer { - public final Lazy kotlinScriptDefinition = LazyKt.lazy(PUBLICATION, () -> Objects.requireNonNull( - KotlinScriptDefinitionProviderKt.getScriptDefinition(getContainingKtFile()), - () -> "Should not parse a script without definition: " + getContainingKtFile().getVirtualFile().getPath() - )); + public final Lazy kotlinScriptDefinition = LazyKt.lazy(PUBLICATION, () -> { + ScriptDefinitionProvider definitionsProvider = ScriptDefinitionProvider.Companion.getInstance(getProject()); + KotlinScriptDefinition definition = definitionsProvider.findScriptDefinition(getContainingKtFile().getName()); + return definition != null ? definition : definitionsProvider.getDefaultScriptDefinition(); + }); public KtScript(@NotNull ASTNode node) { super(node); diff --git a/compiler/psi/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.kt b/compiler/psi/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.kt index 86ff5a3349e..b91e4f91b63 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.kt +++ b/compiler/psi/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.kt @@ -29,6 +29,7 @@ import kotlin.concurrent.write interface ScriptDefinitionProvider { fun findScriptDefinition(fileName: String): KotlinScriptDefinition? fun isScript(fileName: String): Boolean + fun getDefaultScriptDefinition(): KotlinScriptDefinition companion object { fun getInstance(project: Project): ScriptDefinitionProvider = diff --git a/compiler/tests/org/jetbrains/kotlin/scripts/ScriptTemplateTest.kt b/compiler/tests/org/jetbrains/kotlin/scripts/ScriptTemplateTest.kt index e701b09ae31..46e60f133c5 100644 --- a/compiler/tests/org/jetbrains/kotlin/scripts/ScriptTemplateTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/scripts/ScriptTemplateTest.kt @@ -35,7 +35,6 @@ import org.jetbrains.kotlin.test.ConfigurationKind import org.jetbrains.kotlin.test.KotlinTestUtils import org.jetbrains.kotlin.test.TestJdkKind import org.jetbrains.kotlin.test.testFramework.KtUsefulTestCase -import org.jetbrains.kotlin.util.KotlinFrontEndException import org.jetbrains.kotlin.utils.PathUtil import org.junit.Assert import java.io.File @@ -312,16 +311,10 @@ class ScriptTemplateTest : KtUsefulTestCase() { } fun testScriptWithNoMatchingTemplate() { - try { - compileScript("fib.kts", ScriptWithDifferentFileNamePattern::class, null) - Assert.fail("should throw compilation error") - } - catch (e: KotlinFrontEndException) { - if (e.message?.contains("Should not parse a script without definition") != true) { - // unexpected error - throw e - } - } + val messageCollector = TestMessageCollector() + val aClass = + compileScript("without_params.kts", ScriptWithDifferentFileNamePattern::class, null, messageCollector = messageCollector) + Assert.assertNotNull("Compilation failed:\n$messageCollector", aClass) } private fun compileScript( 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 5fccf5112a6..350cc95bd46 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 @@ -106,6 +106,11 @@ class ScriptDefinitionsManager(private val project: Project) : LazyScriptDefinit updateDefinitions() } + override fun getDefaultScriptDefinition(): KotlinScriptDefinition { + return StandardIdeScriptDefinition(project) + } + + @Suppress("DEPRECATION") fun isInExpectedLocation(ktFile: KtFile, scriptDefinition: KotlinScriptDefinition): Boolean { if (ScratchFileService.isInScratchRoot(ktFile.virtualFile)) return true