Provide a default scriptDefinition for script

This commit is contained in:
Natalia Selezneva
2018-07-19 09:48:17 +03:00
parent c802428326
commit 736361e345
5 changed files with 24 additions and 18 deletions
@@ -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