Preliminary declaration visitor: create for top-most declaration which is not class

This commit is contained in:
Mikhail Glukhikh
2015-10-28 19:29:10 +03:00
parent 932985f0c1
commit 17b275af23
@@ -17,9 +17,11 @@
package org.jetbrains.kotlin.types.expressions package org.jetbrains.kotlin.types.expressions
import org.jetbrains.kotlin.descriptors.VariableDescriptor import org.jetbrains.kotlin.descriptors.VariableDescriptor
import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtExpression
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.BindingTrace import org.jetbrains.kotlin.resolve.BindingTrace
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
@@ -41,11 +43,13 @@ class PreliminaryDeclarationVisitor(val declaration: KtDeclaration): AssignedVar
expression.getStrictParentOfType<KtDeclaration>()?.let { createForDeclaration(it, trace) } expression.getStrictParentOfType<KtDeclaration>()?.let { createForDeclaration(it, trace) }
} }
private fun topMostNonClassDeclaration(declaration: KtDeclaration) =
declaration.parentsWithSelf.filterIsInstance<KtDeclaration>().findLast { it !is KtClassOrObject } ?: declaration
fun createForDeclaration(declaration: KtDeclaration, trace: BindingTrace) { fun createForDeclaration(declaration: KtDeclaration, trace: BindingTrace) {
// TODO: find top-most declaration (but not class!!!) val visitorOwner = topMostNonClassDeclaration(declaration)
if (trace.get(BindingContext.PRELIMINARY_VISITOR, declaration) != null) return if (trace.get(BindingContext.PRELIMINARY_VISITOR, visitorOwner) != null) return
// Can this declaration be synthetic? If yes, it would be better not to record it trace.record(BindingContext.PRELIMINARY_VISITOR, visitorOwner, PreliminaryDeclarationVisitor(visitorOwner))
trace.record(BindingContext.PRELIMINARY_VISITOR, declaration, PreliminaryDeclarationVisitor(declaration));
} }
fun getVisitorByVariable(variableDescriptor: VariableDescriptor, bindingContext: BindingContext): PreliminaryDeclarationVisitor? { fun getVisitorByVariable(variableDescriptor: VariableDescriptor, bindingContext: BindingContext): PreliminaryDeclarationVisitor? {