Script refactoring, frontend: Treat scripts as classes (as opposed to function bodies)

ScriptDescriptor implements ClassDescriptor
Scripts are accessible in IDE via stub index
Replace special treatment of scripts with generic mechanism in several cases
Scripts to longer generate 'rv' property for storing result value (changes in repl required)
This commit is contained in:
Pavel V. Talanov
2015-11-17 15:09:01 +03:00
parent aebcebe8ca
commit efa4bf1d74
27 changed files with 198 additions and 580 deletions
@@ -43,6 +43,7 @@ import org.jetbrains.kotlin.resolve.*
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo
import org.jetbrains.kotlin.resolve.lazy.*
import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyClassDescriptor
import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyScriptDescriptor
import org.jetbrains.kotlin.resolve.scopes.LexicalScope
import org.jetbrains.kotlin.utils.addToStdlib.check
@@ -491,8 +492,7 @@ public class ResolveElementCache(
private fun initializerAdditionalResolve(resolveSession: ResolveSession, classInitializer: KtClassInitializer, file: KtFile, statementFilter: StatementFilter): BindingTrace {
val trace = createDelegatingTrace(classInitializer)
val classOrObject = classInitializer.getParentOfType<KtClassOrObject>(true)!!
val classOrObjectDescriptor = resolveSession.resolveToDescriptor(classOrObject) as LazyClassDescriptor
val classOrObjectDescriptor = resolveSession.resolveToDescriptor(classInitializer.containingDeclaration) as LazyClassDescriptor
val bodyResolver = createBodyResolver(resolveSession, trace, file, statementFilter)
bodyResolver.resolveAnonymousInitializer(DataFlowInfo.EMPTY, classInitializer, classOrObjectDescriptor)
@@ -550,7 +550,7 @@ public class ResolveElementCache(
override fun getDeclaringScope(declaration: KtDeclaration): LexicalScope? = declaringScopes(declaration)
override fun getScripts(): MutableMap<KtScript, ScriptDescriptor> = hashMapOf()
override fun getScripts(): MutableMap<KtScript, LazyScriptDescriptor> = hashMapOf()
override fun getOuterDataFlowInfo(): DataFlowInfo = DataFlowInfo.EMPTY
@@ -22,19 +22,14 @@ import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.resolve.lazy.declarations.PackageMemberDeclarationProvider
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.idea.stubindex.KotlinFullClassNameIndex
import org.jetbrains.kotlin.idea.stubindex.PackageIndexUtil
import org.jetbrains.kotlin.resolve.lazy.data.JetClassLikeInfo
import org.jetbrains.kotlin.resolve.lazy.data.JetClassInfoUtil
import org.jetbrains.kotlin.resolve.lazy.ResolveSessionUtils
import java.util.ArrayList
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
import org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelFunctionByPackageIndex
import com.intellij.psi.stubs.StringStubIndexExtension
import org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelPropertyByPackageIndex
import org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelPropertyFqnNameIndex
import org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelFunctionFqnNameIndex
import org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelClassByPackageIndex
import org.jetbrains.kotlin.idea.stubindex.*
import org.jetbrains.kotlin.resolve.lazy.data.JetScriptInfo
public class StubBasedPackageMemberDeclarationProvider(
private val fqName: FqName,
@@ -65,8 +60,13 @@ public class StubBasedPackageMemberDeclarationProvider(
}
override fun getClassOrObjectDeclarations(name: Name): Collection<JetClassLikeInfo> {
return KotlinFullClassNameIndex.getInstance().get(childName(name), project, searchScope)
.map { JetClassInfoUtil.createClassLikeInfo(it) }
val result = ArrayList<JetClassLikeInfo>()
KotlinFullClassNameIndex.getInstance().get(childName(name), project, searchScope)
.mapTo(result) { JetClassInfoUtil.createClassLikeInfo(it) }
KotlinScriptFqnIndex.instance.get(childName(name), project, searchScope)
.mapTo(result) { JetScriptInfo(it) }
return result
}
override fun getFunctionDeclarations(name: Name): Collection<KtNamedFunction> {