diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptClassMemberScope.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptClassMemberScope.kt index 39a6aab0d8b..d7949b3681d 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptClassMemberScope.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptClassMemberScope.kt @@ -55,7 +55,8 @@ class LazyScriptClassMemberScope( private fun createScriptParameters(constructor: ConstructorDescriptorImpl): List { val file = scriptDescriptor.scriptInfo.script.getContainingKtFile() - val scriptDefinition = KotlinScriptDefinitionProvider.getInstance(file.project).findScriptDefinition(file) + val scriptDefinition = KotlinScriptDefinitionProvider.getInstance(file.project).findScriptDefinition(file) ?: + throw RuntimeException("file ${file.name} is not a script") return scriptDefinition.getScriptParameters(scriptDescriptor).mapIndexed { index, scriptParameter -> ValueParameterDescriptorImpl( constructor, null, index, Annotations.EMPTY, scriptParameter.name, scriptParameter.type, diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptDescriptor.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptDescriptor.kt index 56d3723e20a..5df1d003814 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptDescriptor.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptDescriptor.kt @@ -26,8 +26,8 @@ import org.jetbrains.kotlin.resolve.lazy.ResolveSession import org.jetbrains.kotlin.resolve.lazy.data.KtScriptInfo import org.jetbrains.kotlin.resolve.lazy.declarations.ClassMemberDeclarationProvider import org.jetbrains.kotlin.resolve.source.toSourceElement +import org.jetbrains.kotlin.script.KotlinScriptDefinition import org.jetbrains.kotlin.script.KotlinScriptDefinitionProvider -import org.jetbrains.kotlin.script.ScriptParameter import org.jetbrains.kotlin.script.ScriptPriorities import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.TypeSubstitutor @@ -55,36 +55,33 @@ class LazyScriptDescriptor( override fun getPriority() = priority + private val scriptDefinition: KotlinScriptDefinition + by lazy { + val file = scriptInfo.script.getContainingKtFile() + KotlinScriptDefinitionProvider.getInstance(file.project).findScriptDefinition(file) ?: + throw RuntimeException("file ${file.name} is not a script") + } + override fun substitute(substitutor: TypeSubstitutor) = this - override fun accept(visitor: DeclarationDescriptorVisitor, data: D): R { - return visitor.visitScriptDescriptor(this, data) - } + override fun accept(visitor: DeclarationDescriptorVisitor, data: D): R = + visitor.visitScriptDescriptor(this, data) - override fun createMemberScope( - c: LazyClassContext, - declarationProvider: ClassMemberDeclarationProvider): LazyScriptClassMemberScope { - return LazyScriptClassMemberScope( + override fun createMemberScope( c: LazyClassContext, declarationProvider: ClassMemberDeclarationProvider): LazyScriptClassMemberScope = + LazyScriptClassMemberScope( // Must be a ResolveSession for scripts c as ResolveSession, declarationProvider, this, c.trace ) - } override fun getUnsubstitutedPrimaryConstructor() = super.getUnsubstitutedPrimaryConstructor()!! - override fun getInjectedSupertypes(): List? { - val file = scriptInfo.script.getContainingKtFile() - val scriptDefinition = KotlinScriptDefinitionProvider.getInstance(file.project).findScriptDefinition(file) - val superclasses = scriptDefinition.getScriptSupertypes(this) - return if (superclasses.isEmpty()) null else superclasses - } + override fun getInjectedSupertypes(): List? = + scriptDefinition.getScriptSupertypes(this).let { if (it.isEmpty()) null else it } override fun getScriptParametersToPassToSuperclass(): List> { - val file = scriptInfo.script.getContainingKtFile() - val scriptDefinition = KotlinScriptDefinitionProvider.getInstance(file.project).findScriptDefinition(file) val scriptParams = scriptDefinition.getScriptParameters(this) return scriptDefinition.getScriptParametersToPassToSuperclass(this).map { name -> Pair(name, diff --git a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.kt b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.kt index f4ec3626f2a..f5d060f278b 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.kt @@ -14,51 +14,35 @@ * limitations under the License. */ -package org.jetbrains.kotlin.script; +package org.jetbrains.kotlin.script -import com.intellij.openapi.components.ServiceManager; -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; -import org.jetbrains.annotations.NotNull; +import com.intellij.openapi.components.ServiceManager +import com.intellij.openapi.project.Project +import com.intellij.psi.PsiFile -import java.util.ArrayList; -import java.util.List; +class KotlinScriptDefinitionProvider { + private val definitions: MutableList = arrayListOf(StandardScriptDefinition) -public class KotlinScriptDefinitionProvider { - private final List definitions = new ArrayList(); + fun findScriptDefinition(psiFile: PsiFile): KotlinScriptDefinition? = definitions.firstOrNull { it.isScript(psiFile) } - public static KotlinScriptDefinitionProvider getInstance(Project project) { - return ServiceManager.getService(project, KotlinScriptDefinitionProvider.class); + fun isScript(psiFile: PsiFile): Boolean = findScriptDefinition(psiFile) != null + + fun addScriptDefinition(scriptDefinition: KotlinScriptDefinition) { + definitions.add(0, scriptDefinition) } - public KotlinScriptDefinitionProvider() { - definitions.add(StandardScriptDefinition.INSTANCE); + fun setScriptDefinitions(definitions: List) { + this.definitions.clear() + this.definitions.addAll(definitions) } - public KotlinScriptDefinition findScriptDefinition(PsiFile psiFile) { - for (KotlinScriptDefinition definition : definitions) { - if (definition.isScript(psiFile)) { - return definition; - } - } - - return null; + fun removeScriptDefinition(scriptDefinition: KotlinScriptDefinition) { + definitions.remove(scriptDefinition) } - public boolean isScript(PsiFile psiFile) { - return findScriptDefinition(psiFile) != null; - } - - public void addScriptDefinition(@NotNull KotlinScriptDefinition scriptDefinition) { - definitions.add(0, scriptDefinition); - } - - public void removeScriptDefinition(@NotNull KotlinScriptDefinition scriptDefinition) { - definitions.remove(scriptDefinition); - } - - public void setScriptDefinitions(@NotNull List definitions) { - this.definitions.clear(); - this.definitions.addAll(definitions); + companion object { + @JvmStatic + fun getInstance(project: Project): KotlinScriptDefinitionProvider = + ServiceManager.getService(project, KotlinScriptDefinitionProvider::class.java) } }