Convert KotlinScriptDefinitionProvider to kotlin - phase 2 - convert; related fixes and refactorings

This commit is contained in:
Ilya Chernikov
2016-05-31 17:39:02 +02:00
parent b9836d8c87
commit d63b53886c
3 changed files with 36 additions and 54 deletions
@@ -55,7 +55,8 @@ class LazyScriptClassMemberScope(
private fun createScriptParameters(constructor: ConstructorDescriptorImpl): List<ValueParameterDescriptor> { private fun createScriptParameters(constructor: ConstructorDescriptorImpl): List<ValueParameterDescriptor> {
val file = scriptDescriptor.scriptInfo.script.getContainingKtFile() 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 -> return scriptDefinition.getScriptParameters(scriptDescriptor).mapIndexed { index, scriptParameter ->
ValueParameterDescriptorImpl( ValueParameterDescriptorImpl(
constructor, null, index, Annotations.EMPTY, scriptParameter.name, scriptParameter.type, constructor, null, index, Annotations.EMPTY, scriptParameter.name, scriptParameter.type,
@@ -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.data.KtScriptInfo
import org.jetbrains.kotlin.resolve.lazy.declarations.ClassMemberDeclarationProvider import org.jetbrains.kotlin.resolve.lazy.declarations.ClassMemberDeclarationProvider
import org.jetbrains.kotlin.resolve.source.toSourceElement import org.jetbrains.kotlin.resolve.source.toSourceElement
import org.jetbrains.kotlin.script.KotlinScriptDefinition
import org.jetbrains.kotlin.script.KotlinScriptDefinitionProvider import org.jetbrains.kotlin.script.KotlinScriptDefinitionProvider
import org.jetbrains.kotlin.script.ScriptParameter
import org.jetbrains.kotlin.script.ScriptPriorities import org.jetbrains.kotlin.script.ScriptPriorities
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.TypeSubstitutor import org.jetbrains.kotlin.types.TypeSubstitutor
@@ -55,36 +55,33 @@ class LazyScriptDescriptor(
override fun getPriority() = priority 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 substitute(substitutor: TypeSubstitutor) = this
override fun <R, D> accept(visitor: DeclarationDescriptorVisitor<R, D>, data: D): R { override fun <R, D> accept(visitor: DeclarationDescriptorVisitor<R, D>, data: D): R =
return visitor.visitScriptDescriptor(this, data) visitor.visitScriptDescriptor(this, data)
}
override fun createMemberScope( override fun createMemberScope( c: LazyClassContext, declarationProvider: ClassMemberDeclarationProvider): LazyScriptClassMemberScope =
c: LazyClassContext, LazyScriptClassMemberScope(
declarationProvider: ClassMemberDeclarationProvider): LazyScriptClassMemberScope {
return LazyScriptClassMemberScope(
// Must be a ResolveSession for scripts // Must be a ResolveSession for scripts
c as ResolveSession, c as ResolveSession,
declarationProvider, declarationProvider,
this, this,
c.trace c.trace
) )
}
override fun getUnsubstitutedPrimaryConstructor() = super.getUnsubstitutedPrimaryConstructor()!! override fun getUnsubstitutedPrimaryConstructor() = super.getUnsubstitutedPrimaryConstructor()!!
override fun getInjectedSupertypes(): List<KotlinType>? { override fun getInjectedSupertypes(): List<KotlinType>? =
val file = scriptInfo.script.getContainingKtFile() scriptDefinition.getScriptSupertypes(this).let { if (it.isEmpty()) null else it }
val scriptDefinition = KotlinScriptDefinitionProvider.getInstance(file.project).findScriptDefinition(file)
val superclasses = scriptDefinition.getScriptSupertypes(this)
return if (superclasses.isEmpty()) null else superclasses
}
override fun getScriptParametersToPassToSuperclass(): List<Pair<Name, KotlinType>> { override fun getScriptParametersToPassToSuperclass(): List<Pair<Name, KotlinType>> {
val file = scriptInfo.script.getContainingKtFile()
val scriptDefinition = KotlinScriptDefinitionProvider.getInstance(file.project).findScriptDefinition(file)
val scriptParams = scriptDefinition.getScriptParameters(this) val scriptParams = scriptDefinition.getScriptParameters(this)
return scriptDefinition.getScriptParametersToPassToSuperclass(this).map { name -> return scriptDefinition.getScriptParametersToPassToSuperclass(this).map { name ->
Pair(name, Pair(name,
@@ -14,51 +14,35 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.kotlin.script; package org.jetbrains.kotlin.script
import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.components.ServiceManager
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project
import com.intellij.psi.PsiFile; import com.intellij.psi.PsiFile
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList; class KotlinScriptDefinitionProvider {
import java.util.List; private val definitions: MutableList<KotlinScriptDefinition> = arrayListOf(StandardScriptDefinition)
public class KotlinScriptDefinitionProvider { fun findScriptDefinition(psiFile: PsiFile): KotlinScriptDefinition? = definitions.firstOrNull { it.isScript(psiFile) }
private final List<KotlinScriptDefinition> definitions = new ArrayList<KotlinScriptDefinition>();
public static KotlinScriptDefinitionProvider getInstance(Project project) { fun isScript(psiFile: PsiFile): Boolean = findScriptDefinition(psiFile) != null
return ServiceManager.getService(project, KotlinScriptDefinitionProvider.class);
fun addScriptDefinition(scriptDefinition: KotlinScriptDefinition) {
definitions.add(0, scriptDefinition)
} }
public KotlinScriptDefinitionProvider() { fun setScriptDefinitions(definitions: List<KotlinScriptDefinition>) {
definitions.add(StandardScriptDefinition.INSTANCE); this.definitions.clear()
this.definitions.addAll(definitions)
} }
public KotlinScriptDefinition findScriptDefinition(PsiFile psiFile) { fun removeScriptDefinition(scriptDefinition: KotlinScriptDefinition) {
for (KotlinScriptDefinition definition : definitions) { definitions.remove(scriptDefinition)
if (definition.isScript(psiFile)) {
return definition;
}
}
return null;
} }
public boolean isScript(PsiFile psiFile) { companion object {
return findScriptDefinition(psiFile) != null; @JvmStatic
} fun getInstance(project: Project): KotlinScriptDefinitionProvider =
ServiceManager.getService(project, KotlinScriptDefinitionProvider::class.java)
public void addScriptDefinition(@NotNull KotlinScriptDefinition scriptDefinition) {
definitions.add(0, scriptDefinition);
}
public void removeScriptDefinition(@NotNull KotlinScriptDefinition scriptDefinition) {
definitions.remove(scriptDefinition);
}
public void setScriptDefinitions(@NotNull List<KotlinScriptDefinition> definitions) {
this.definitions.clear();
this.definitions.addAll(definitions);
} }
} }