Provide a default scriptDefinition for script
This commit is contained in:
+8
-1
@@ -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<KotlinScriptDefinition> =
|
||||
definitionsFromSources.asSequence().flatMap { it } + definitions.asSequence()
|
||||
|
||||
override fun getDefaultScriptDefinition(): KotlinScriptDefinition {
|
||||
return StandardScriptDefinition
|
||||
}
|
||||
|
||||
fun setScriptDefinitions(newDefinitions: List<KotlinScriptDefinition>) {
|
||||
lock.write {
|
||||
definitions.clear()
|
||||
|
||||
@@ -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<KotlinScriptStub> implements KtDeclarationContainer {
|
||||
public final Lazy<KotlinScriptDefinition> kotlinScriptDefinition = LazyKt.lazy(PUBLICATION, () -> Objects.requireNonNull(
|
||||
KotlinScriptDefinitionProviderKt.getScriptDefinition(getContainingKtFile()),
|
||||
() -> "Should not parse a script without definition: " + getContainingKtFile().getVirtualFile().getPath()
|
||||
));
|
||||
public final Lazy<KotlinScriptDefinition> 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);
|
||||
|
||||
@@ -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 =
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user