Ignore lookups when typing unqualified super

This commit is contained in:
Zalim Bashorov
2015-08-18 21:15:30 +03:00
parent 30d2d9624a
commit 2f13c89fd8
2 changed files with 18 additions and 14 deletions
@@ -22,6 +22,8 @@ import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.MemberDescriptor
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.JetCallExpression
import org.jetbrains.kotlin.psi.JetDotQualifiedExpression
@@ -47,18 +49,19 @@ public fun resolveUnqualifiedSuperFromExpressionContext(
val calleeExpression = selectorExpression.calleeExpression
if (calleeExpression is JetSimpleNameExpression) {
val calleeName = calleeExpression.getReferencedNameAsName()
val location = NoLookupLocation.WHEN_TYPING
if (isCallingMethodOfAny(selectorExpression, calleeName)) {
return resolveSupertypesForMethodOfAny(supertypes, calleeName, anyType)
return resolveSupertypesForMethodOfAny(supertypes, calleeName, location, anyType)
}
else {
return resolveSupertypesByCalleeName(supertypes, calleeName)
return resolveSupertypesByCalleeName(supertypes, calleeName, location)
}
}
}
is JetSimpleNameExpression -> {
// super.x: x can be a property only
// NB there are no properties in kotlin.Any
return resolveSupertypesByPropertyName(supertypes, selectorExpression.getReferencedNameAsName())
return resolveSupertypesByPropertyName(supertypes, selectorExpression.getReferencedNameAsName(), NoLookupLocation.WHEN_TYPING)
}
}
}
@@ -94,19 +97,19 @@ private fun isCallingMethodOfAnyWithSuper(superExpression: JetSuperExpression):
private fun JetType.isInterface(): Boolean =
TypeUtils.getClassDescriptor(this)?.kind == ClassKind.INTERFACE
private fun resolveSupertypesForMethodOfAny(supertypes: Collection<JetType>, calleeName: Name, anyType: JetType): Collection<JetType> {
val typesWithConcreteOverride = resolveSupertypesByMembers(supertypes, false) { getFunctionMembers(it, calleeName) }
private fun resolveSupertypesForMethodOfAny(supertypes: Collection<JetType>, calleeName: Name, location: LookupLocation, anyType: JetType): Collection<JetType> {
val typesWithConcreteOverride = resolveSupertypesByMembers(supertypes, false) { getFunctionMembers(it, calleeName, location) }
return if (typesWithConcreteOverride.isNotEmpty())
typesWithConcreteOverride
else
anyType.singletonList()
}
private fun resolveSupertypesByCalleeName(supertypes: Collection<JetType>, calleeName: Name): Collection<JetType> =
resolveSupertypesByMembers(supertypes, true) { getFunctionMembers(it, calleeName) + getPropertyMembers(it, calleeName) }
private fun resolveSupertypesByCalleeName(supertypes: Collection<JetType>, calleeName: Name, location: LookupLocation): Collection<JetType> =
resolveSupertypesByMembers(supertypes, true) { getFunctionMembers(it, calleeName, location) + getPropertyMembers(it, calleeName, location) }
private fun resolveSupertypesByPropertyName(supertypes: Collection<JetType>, propertyName: Name): Collection<JetType> =
resolveSupertypesByMembers(supertypes, true) { getPropertyMembers(it, propertyName) }
private fun resolveSupertypesByPropertyName(supertypes: Collection<JetType>, propertyName: Name, location: LookupLocation): Collection<JetType> =
resolveSupertypesByMembers(supertypes, true) { getPropertyMembers(it, propertyName, location) }
private inline fun resolveSupertypesByMembers(
supertypes: Collection<JetType>,
@@ -131,11 +134,11 @@ private inline fun resolveSupertypesByMembers(
else emptyList<JetType>()
}
private fun getFunctionMembers(type: JetType, name: Name): Collection<MemberDescriptor> =
type.memberScope.getFunctions(name)
private fun getFunctionMembers(type: JetType, name: Name, location: LookupLocation): Collection<MemberDescriptor> =
type.memberScope.getFunctions(name, location)
private fun getPropertyMembers(type: JetType, name: Name): Collection<MemberDescriptor> =
type.memberScope.getProperties(name).filterIsInstanceTo(SmartList<MemberDescriptor>())
private fun getPropertyMembers(type: JetType, name: Name, location: LookupLocation): Collection<MemberDescriptor> =
type.memberScope.getProperties(name, location).filterIsInstanceTo(SmartList<MemberDescriptor>())
private fun isConcreteMember(supertype: JetType, memberDescriptor: MemberDescriptor): Boolean {
// "Concrete member" is a function or a property that is not abstract,
@@ -33,5 +33,6 @@ public enum class NoLookupLocation : LookupLocation {
WHEN_GET_DECLARATION_SCOPE,
FOR_ALREADY_TRACKED,
// TODO replace with real location (e.g. FROM_IDE) where it possible
WHEN_GET_ALL_DESCRIPTORS
WHEN_GET_ALL_DESCRIPTORS,
WHEN_TYPING
}