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 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