Don't call getClassDescriptor for local declarations (KT-15259)

#KT-15259 Open
This commit is contained in:
Nikolay Krasko
2016-12-16 16:28:40 +03:00
parent 8fe9de1d35
commit 6ca5ba3615
7 changed files with 46 additions and 3 deletions
@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.idea.caches.resolve
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.ClassDescriptorWithResolutionScopes
import org.jetbrains.kotlin.idea.project.ResolveElementCache
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
@@ -91,9 +92,17 @@ class CodeFragmentAnalyzer(
val scopeForContextElement: LexicalScope?
val dataFlowInfo: DataFlowInfo
fun getClassDescriptor(classOrObject: KtClassOrObject): ClassDescriptor? {
if (!KtPsiUtil.isLocal(classOrObject)) {
return resolveSession.getClassDescriptor(classOrObject, NoLookupLocation.FROM_IDE)
}
return resolveToElement(classOrObject)[BindingContext.DECLARATION_TO_DESCRIPTOR, classOrObject] as ClassDescriptor?
}
when (context) {
is KtPrimaryConstructor -> {
val descriptor = resolveSession.getClassDescriptor(context.getContainingClassOrObject(), NoLookupLocation.FROM_IDE) as ClassDescriptorWithResolutionScopes
val descriptor = (getClassDescriptor(context.getContainingClassOrObject()) as? ClassDescriptorWithResolutionScopes) ?: return null
scopeForContextElement = descriptor.scopeForInitializerResolution
dataFlowInfo = DataFlowInfo.EMPTY
@@ -107,7 +116,7 @@ class CodeFragmentAnalyzer(
dataFlowInfo = DataFlowInfo.EMPTY
}
is KtClassOrObject -> {
val descriptor = resolveSession.getClassDescriptor(context, NoLookupLocation.FROM_IDE) as ClassDescriptorWithResolutionScopes
val descriptor = (getClassDescriptor(context) as? ClassDescriptorWithResolutionScopes) ?: return null
scopeForContextElement = descriptor.scopeForMemberDeclarationResolution
dataFlowInfo = DataFlowInfo.EMPTY