Provide a default scriptDefinition for script
This commit is contained in:
+8
-1
@@ -16,7 +16,10 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.cli.common.script
|
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
|
import kotlin.concurrent.write
|
||||||
|
|
||||||
class CliScriptDefinitionProvider : LazyScriptDefinitionProvider() {
|
class CliScriptDefinitionProvider : LazyScriptDefinitionProvider() {
|
||||||
@@ -26,6 +29,10 @@ class CliScriptDefinitionProvider : LazyScriptDefinitionProvider() {
|
|||||||
override val currentDefinitions: Sequence<KotlinScriptDefinition> =
|
override val currentDefinitions: Sequence<KotlinScriptDefinition> =
|
||||||
definitionsFromSources.asSequence().flatMap { it } + definitions.asSequence()
|
definitionsFromSources.asSequence().flatMap { it } + definitions.asSequence()
|
||||||
|
|
||||||
|
override fun getDefaultScriptDefinition(): KotlinScriptDefinition {
|
||||||
|
return StandardScriptDefinition
|
||||||
|
}
|
||||||
|
|
||||||
fun setScriptDefinitions(newDefinitions: List<KotlinScriptDefinition>) {
|
fun setScriptDefinitions(newDefinitions: List<KotlinScriptDefinition>) {
|
||||||
lock.write {
|
lock.write {
|
||||||
definitions.clear()
|
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.KotlinScriptStub;
|
||||||
import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes;
|
import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes;
|
||||||
import org.jetbrains.kotlin.script.KotlinScriptDefinition;
|
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.List;
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
import static kotlin.LazyThreadSafetyMode.PUBLICATION;
|
import static kotlin.LazyThreadSafetyMode.PUBLICATION;
|
||||||
|
|
||||||
public class KtScript extends KtNamedDeclarationStub<KotlinScriptStub> implements KtDeclarationContainer {
|
public class KtScript extends KtNamedDeclarationStub<KotlinScriptStub> implements KtDeclarationContainer {
|
||||||
public final Lazy<KotlinScriptDefinition> kotlinScriptDefinition = LazyKt.lazy(PUBLICATION, () -> Objects.requireNonNull(
|
public final Lazy<KotlinScriptDefinition> kotlinScriptDefinition = LazyKt.lazy(PUBLICATION, () -> {
|
||||||
KotlinScriptDefinitionProviderKt.getScriptDefinition(getContainingKtFile()),
|
ScriptDefinitionProvider definitionsProvider = ScriptDefinitionProvider.Companion.getInstance(getProject());
|
||||||
() -> "Should not parse a script without definition: " + getContainingKtFile().getVirtualFile().getPath()
|
KotlinScriptDefinition definition = definitionsProvider.findScriptDefinition(getContainingKtFile().getName());
|
||||||
));
|
return definition != null ? definition : definitionsProvider.getDefaultScriptDefinition();
|
||||||
|
});
|
||||||
|
|
||||||
public KtScript(@NotNull ASTNode node) {
|
public KtScript(@NotNull ASTNode node) {
|
||||||
super(node);
|
super(node);
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ import kotlin.concurrent.write
|
|||||||
interface ScriptDefinitionProvider {
|
interface ScriptDefinitionProvider {
|
||||||
fun findScriptDefinition(fileName: String): KotlinScriptDefinition?
|
fun findScriptDefinition(fileName: String): KotlinScriptDefinition?
|
||||||
fun isScript(fileName: String): Boolean
|
fun isScript(fileName: String): Boolean
|
||||||
|
fun getDefaultScriptDefinition(): KotlinScriptDefinition
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
fun getInstance(project: Project): ScriptDefinitionProvider =
|
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.KotlinTestUtils
|
||||||
import org.jetbrains.kotlin.test.TestJdkKind
|
import org.jetbrains.kotlin.test.TestJdkKind
|
||||||
import org.jetbrains.kotlin.test.testFramework.KtUsefulTestCase
|
import org.jetbrains.kotlin.test.testFramework.KtUsefulTestCase
|
||||||
import org.jetbrains.kotlin.util.KotlinFrontEndException
|
|
||||||
import org.jetbrains.kotlin.utils.PathUtil
|
import org.jetbrains.kotlin.utils.PathUtil
|
||||||
import org.junit.Assert
|
import org.junit.Assert
|
||||||
import java.io.File
|
import java.io.File
|
||||||
@@ -312,16 +311,10 @@ class ScriptTemplateTest : KtUsefulTestCase() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun testScriptWithNoMatchingTemplate() {
|
fun testScriptWithNoMatchingTemplate() {
|
||||||
try {
|
val messageCollector = TestMessageCollector()
|
||||||
compileScript("fib.kts", ScriptWithDifferentFileNamePattern::class, null)
|
val aClass =
|
||||||
Assert.fail("should throw compilation error")
|
compileScript("without_params.kts", ScriptWithDifferentFileNamePattern::class, null, messageCollector = messageCollector)
|
||||||
}
|
Assert.assertNotNull("Compilation failed:\n$messageCollector", aClass)
|
||||||
catch (e: KotlinFrontEndException) {
|
|
||||||
if (e.message?.contains("Should not parse a script without definition") != true) {
|
|
||||||
// unexpected error
|
|
||||||
throw e
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun compileScript(
|
private fun compileScript(
|
||||||
|
|||||||
@@ -106,6 +106,11 @@ class ScriptDefinitionsManager(private val project: Project) : LazyScriptDefinit
|
|||||||
updateDefinitions()
|
updateDefinitions()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getDefaultScriptDefinition(): KotlinScriptDefinition {
|
||||||
|
return StandardIdeScriptDefinition(project)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
fun isInExpectedLocation(ktFile: KtFile, scriptDefinition: KotlinScriptDefinition): Boolean {
|
fun isInExpectedLocation(ktFile: KtFile, scriptDefinition: KotlinScriptDefinition): Boolean {
|
||||||
if (ScratchFileService.isInScratchRoot(ktFile.virtualFile)) return true
|
if (ScratchFileService.isInScratchRoot(ktFile.virtualFile)) return true
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user