diff --git a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinition.kt b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinition.kt index 429836d5b03..9e166934cf8 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinition.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinition.kt @@ -26,7 +26,6 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.parsing.KotlinParserDefinition import org.jetbrains.kotlin.psi.KtScript -import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns import org.jetbrains.kotlin.resolve.descriptorUtil.module import org.jetbrains.kotlin.serialization.deserialization.NotFoundClasses import org.jetbrains.kotlin.serialization.deserialization.findNonGenericClassAcrossDependencies @@ -39,6 +38,7 @@ import kotlin.reflect.KClass import kotlin.reflect.KType import kotlin.reflect.KTypeProjection import kotlin.reflect.KVariance +import kotlin.script.StandardScriptTemplate interface KotlinScriptDefinition { val name: String get() = "Kotlin Script" @@ -78,23 +78,7 @@ class KotlinScriptExternalDependenciesUnion(val dependencies: Iterable' parameter - // this is not supposed to be final design - override fun getScriptParameters(scriptDescriptor: ScriptDescriptor): List = - makeStringListScriptParameters(scriptDescriptor, ARGS_NAME) -} - -fun makeStringListScriptParameters(scriptDescriptor: ScriptDescriptor, propertyName: Name): List { - val builtIns = scriptDescriptor.builtIns - val arrayOfStrings = builtIns.getArrayType(Variance.INVARIANT, builtIns.stringType) - return listOf(ScriptParameter(propertyName, arrayOfStrings)) -} - -fun makeReflectedClassScriptParameter(scriptDescriptor: ScriptDescriptor, propertyName: Name, kClass: KClass): ScriptParameter = - ScriptParameter(propertyName, getKotlinType(scriptDescriptor, kClass)) +object StandardScriptDefinition : KotlinScriptDefinitionFromTemplate(StandardScriptTemplate::class) fun getKotlinType(scriptDescriptor: ScriptDescriptor, kClass: KClass): KotlinType = getKotlinTypeByFqName(scriptDescriptor, diff --git a/compiler/frontend/src/org/jetbrains/kotlin/script/scriptDefinitionFromTemplate.kt b/compiler/frontend/src/org/jetbrains/kotlin/script/scriptDefinitionFromTemplate.kt index e8db6cdf9b6..997631b9817 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/script/scriptDefinitionFromTemplate.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/script/scriptDefinitionFromTemplate.kt @@ -35,7 +35,7 @@ import kotlin.reflect.KClass import kotlin.reflect.memberFunctions import kotlin.reflect.primaryConstructor -data class KotlinScriptDefinitionFromTemplate(val template: KClass, +open class KotlinScriptDefinitionFromTemplate(val template: KClass, val resolver: ScriptDependenciesResolver? = null, val scriptFilePattern: String? = null, val environment: Map? = null diff --git a/compiler/testData/diagnostics/tests/annotations/DanglingInScript.txt b/compiler/testData/diagnostics/tests/annotations/DanglingInScript.txt index f248055728b..77797394836 100644 --- a/compiler/testData/diagnostics/tests/annotations/DanglingInScript.txt +++ b/compiler/testData/diagnostics/tests/annotations/DanglingInScript.txt @@ -1,8 +1,8 @@ package -public final class Script { +public final class Script : kotlin.script.StandardScriptTemplate { public constructor Script(/*0*/ args: kotlin.Array) - public final val args: kotlin.Array + public final override /*1*/ /*fake_override*/ val args: kotlin.Array public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String diff --git a/compiler/testData/diagnostics/tests/redeclarations/ScriptAndClassConflict.txt b/compiler/testData/diagnostics/tests/redeclarations/ScriptAndClassConflict.txt index 53e253c43c2..a7872f938a8 100644 --- a/compiler/testData/diagnostics/tests/redeclarations/ScriptAndClassConflict.txt +++ b/compiler/testData/diagnostics/tests/redeclarations/ScriptAndClassConflict.txt @@ -9,9 +9,9 @@ package test { public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } - public final class A { + public final class A : kotlin.script.StandardScriptTemplate { public constructor A(/*0*/ args: kotlin.Array) - public final val args: kotlin.Array + public final override /*1*/ /*fake_override*/ val args: kotlin.Array public final val x: kotlin.Int = 1 public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/testData/diagnostics/tests/script/AccessForwardDeclarationInScript.txt b/compiler/testData/diagnostics/tests/script/AccessForwardDeclarationInScript.txt index b7bce89d5ae..b3b4151179c 100644 --- a/compiler/testData/diagnostics/tests/script/AccessForwardDeclarationInScript.txt +++ b/compiler/testData/diagnostics/tests/script/AccessForwardDeclarationInScript.txt @@ -1,8 +1,8 @@ package -public final class AccessForwardDeclarationInScript { +public final class AccessForwardDeclarationInScript : kotlin.script.StandardScriptTemplate { public constructor AccessForwardDeclarationInScript(/*0*/ args: kotlin.Array) - public final val args: kotlin.Array + public final override /*1*/ /*fake_override*/ val args: kotlin.Array public final val x: kotlin.Int = 2 public final val y: kotlin.Int = 2 public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean diff --git a/compiler/testData/diagnostics/tests/script/ComplexScript.txt b/compiler/testData/diagnostics/tests/script/ComplexScript.txt index b3b5543995a..4ae83741290 100644 --- a/compiler/testData/diagnostics/tests/script/ComplexScript.txt +++ b/compiler/testData/diagnostics/tests/script/ComplexScript.txt @@ -1,8 +1,8 @@ package -public final class ComplexScript { +public final class ComplexScript : kotlin.script.StandardScriptTemplate { public constructor ComplexScript(/*0*/ args: kotlin.Array) - public final val args: kotlin.Array + public final override /*1*/ /*fake_override*/ val args: kotlin.Array public final val y: kotlin.Int = 2 public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public final fun foo(/*0*/ x: kotlin.Int): kotlin.Int diff --git a/compiler/testData/diagnostics/tests/script/NestedInnerClass.txt b/compiler/testData/diagnostics/tests/script/NestedInnerClass.txt index 3a904b5db74..465ceac936c 100644 --- a/compiler/testData/diagnostics/tests/script/NestedInnerClass.txt +++ b/compiler/testData/diagnostics/tests/script/NestedInnerClass.txt @@ -1,8 +1,8 @@ package -public final class NestedInnerClass { +public final class NestedInnerClass : kotlin.script.StandardScriptTemplate { public constructor NestedInnerClass(/*0*/ args: kotlin.Array) - public final val args: kotlin.Array + public final override /*1*/ /*fake_override*/ val args: kotlin.Array public final val property: kotlin.String = "" public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public final fun function(): kotlin.Int diff --git a/compiler/testData/diagnostics/tests/script/SimpleScript.txt b/compiler/testData/diagnostics/tests/script/SimpleScript.txt index 9ff6d104abf..1ba84b1ff22 100644 --- a/compiler/testData/diagnostics/tests/script/SimpleScript.txt +++ b/compiler/testData/diagnostics/tests/script/SimpleScript.txt @@ -1,8 +1,8 @@ package -public final class SimpleScript { +public final class SimpleScript : kotlin.script.StandardScriptTemplate { public constructor SimpleScript(/*0*/ args: kotlin.Array) - public final val args: kotlin.Array + public final override /*1*/ /*fake_override*/ val args: kotlin.Array public final val x: kotlin.Int = 1 public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/testData/diagnostics/tests/script/imports.txt b/compiler/testData/diagnostics/tests/script/imports.txt index 938564139fa..fe0006cb14a 100644 --- a/compiler/testData/diagnostics/tests/script/imports.txt +++ b/compiler/testData/diagnostics/tests/script/imports.txt @@ -1,9 +1,9 @@ package -public final class Imports { +public final class Imports : kotlin.script.StandardScriptTemplate { public constructor Imports(/*0*/ args: kotlin.Array) public final val al: java.util.ArrayList? = null - public final val args: kotlin.Array + public final override /*1*/ /*fake_override*/ val args: kotlin.Array public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String diff --git a/compiler/testData/diagnostics/tests/script/topLevelVariable.txt b/compiler/testData/diagnostics/tests/script/topLevelVariable.txt index ca792f0046a..8b292aec73f 100644 --- a/compiler/testData/diagnostics/tests/script/topLevelVariable.txt +++ b/compiler/testData/diagnostics/tests/script/topLevelVariable.txt @@ -1,9 +1,9 @@ package -public final class TopLevelVariable { +public final class TopLevelVariable : kotlin.script.StandardScriptTemplate { public constructor TopLevelVariable(/*0*/ args: kotlin.Array) public final val a: kotlin.Int - public final val args: kotlin.Array + public final override /*1*/ /*fake_override*/ val args: kotlin.Array public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public final fun foo(): kotlin.Unit public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/testData/diagnostics/tests/script/varInScript.txt b/compiler/testData/diagnostics/tests/script/varInScript.txt index 2f6f9757a83..07050eef627 100644 --- a/compiler/testData/diagnostics/tests/script/varInScript.txt +++ b/compiler/testData/diagnostics/tests/script/varInScript.txt @@ -1,8 +1,8 @@ package -public final class Script { +public final class Script : kotlin.script.StandardScriptTemplate { public constructor Script(/*0*/ args: kotlin.Array) - public final val args: kotlin.Array + public final override /*1*/ /*fake_override*/ val args: kotlin.Array public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public final fun main(): kotlin.Boolean diff --git a/compiler/testData/diagnostics/tests/sourceCompatibility/noLocalDelegatedPropertyInScript.txt b/compiler/testData/diagnostics/tests/sourceCompatibility/noLocalDelegatedPropertyInScript.txt index 244401d2898..71ae5dfc4c6 100644 --- a/compiler/testData/diagnostics/tests/sourceCompatibility/noLocalDelegatedPropertyInScript.txt +++ b/compiler/testData/diagnostics/tests/sourceCompatibility/noLocalDelegatedPropertyInScript.txt @@ -1,8 +1,8 @@ package -public final class Script { +public final class Script : kotlin.script.StandardScriptTemplate { public constructor Script(/*0*/ args: kotlin.Array) - public final val args: kotlin.Array + public final override /*1*/ /*fake_override*/ val args: kotlin.Array public final val prop: kotlin.Int public final val prop2: kotlin.Int public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean diff --git a/compiler/tests/org/jetbrains/kotlin/scripts/ScriptTest2.kt b/compiler/tests/org/jetbrains/kotlin/scripts/ScriptTest2.kt index d1ae7bd423f..a8153106a16 100644 --- a/compiler/tests/org/jetbrains/kotlin/scripts/ScriptTest2.kt +++ b/compiler/tests/org/jetbrains/kotlin/scripts/ScriptTest2.kt @@ -37,6 +37,7 @@ import java.lang.Exception import java.net.URLClassLoader import java.util.concurrent.Future import kotlin.reflect.KClass +import kotlin.script.StandardScriptTemplate // TODO: the contetnts of this file should go into ScriptTest.kt and replace appropriate xml-based functionality, // as soon as the the latter is removed from the codebase @@ -126,6 +127,13 @@ class ScriptTest2 { aClass!!.getConstructor(Array>::class.java).newInstance(arrayOf(arrayOf("one"), arrayOf("two"))) } + @Test + fun testScriptWithStandardTemplate() { + val aClass = compileScript("fib_std.kts", StandardScriptTemplate::class, runIsolated = false) + Assert.assertNotNull(aClass) + aClass!!.getConstructor(Array::class.java).newInstance(arrayOf("4", "other")) + } + private fun compileScript( scriptPath: String, scriptBase: KClass, diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/KotlinScriptResolveScopeProvider.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/KotlinScriptResolveScopeProvider.kt index 8ae5f19f42c..91b0a803e13 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/KotlinScriptResolveScopeProvider.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/KotlinScriptResolveScopeProvider.kt @@ -23,11 +23,19 @@ import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.idea.core.script.KotlinScriptConfigurationManager import org.jetbrains.kotlin.script.KotlinConfigurableScriptDefinition import org.jetbrains.kotlin.script.KotlinScriptDefinitionFromTemplate +import org.jetbrains.kotlin.script.StandardScriptDefinition import org.jetbrains.kotlin.script.getScriptDefinition +import kotlin.script.StandardScriptTemplate class KotlinScriptResolveScopeProvider : ResolveScopeProvider() { override fun getResolveScope(file: VirtualFile, project: Project): GlobalSearchScope? { val scriptDefinition = getScriptDefinition(file, project) ?: return null + + // This is a workaround for completion in scripts and REPL to provide module dependencies + if (scriptDefinition == StandardScriptDefinition || scriptDefinition.template == Any::class) { + return null + } + // TODO: this should get this particular scripts dependencies if (scriptDefinition is KotlinConfigurableScriptDefinition || scriptDefinition is KotlinScriptDefinitionFromTemplate) { // TODO: should include the file itself