diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/unqualifiedSuper/unqualifiedSuper.kt b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/unqualifiedSuper/unqualifiedSuper.kt index 420f2f8732e..ac2f19804ae 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/unqualifiedSuper/unqualifiedSuper.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/unqualifiedSuper/unqualifiedSuper.kt @@ -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, calleeName: Name, anyType: JetType): Collection { - val typesWithConcreteOverride = resolveSupertypesByMembers(supertypes, false) { getFunctionMembers(it, calleeName) } +private fun resolveSupertypesForMethodOfAny(supertypes: Collection, calleeName: Name, location: LookupLocation, anyType: JetType): Collection { + val typesWithConcreteOverride = resolveSupertypesByMembers(supertypes, false) { getFunctionMembers(it, calleeName, location) } return if (typesWithConcreteOverride.isNotEmpty()) typesWithConcreteOverride else anyType.singletonList() } -private fun resolveSupertypesByCalleeName(supertypes: Collection, calleeName: Name): Collection = - resolveSupertypesByMembers(supertypes, true) { getFunctionMembers(it, calleeName) + getPropertyMembers(it, calleeName) } +private fun resolveSupertypesByCalleeName(supertypes: Collection, calleeName: Name, location: LookupLocation): Collection = + resolveSupertypesByMembers(supertypes, true) { getFunctionMembers(it, calleeName, location) + getPropertyMembers(it, calleeName, location) } -private fun resolveSupertypesByPropertyName(supertypes: Collection, propertyName: Name): Collection = - resolveSupertypesByMembers(supertypes, true) { getPropertyMembers(it, propertyName) } +private fun resolveSupertypesByPropertyName(supertypes: Collection, propertyName: Name, location: LookupLocation): Collection = + resolveSupertypesByMembers(supertypes, true) { getPropertyMembers(it, propertyName, location) } private inline fun resolveSupertypesByMembers( supertypes: Collection, @@ -131,11 +134,11 @@ private inline fun resolveSupertypesByMembers( else emptyList() } -private fun getFunctionMembers(type: JetType, name: Name): Collection = - type.memberScope.getFunctions(name) +private fun getFunctionMembers(type: JetType, name: Name, location: LookupLocation): Collection = + type.memberScope.getFunctions(name, location) -private fun getPropertyMembers(type: JetType, name: Name): Collection = - type.memberScope.getProperties(name).filterIsInstanceTo(SmartList()) +private fun getPropertyMembers(type: JetType, name: Name, location: LookupLocation): Collection = + type.memberScope.getProperties(name, location).filterIsInstanceTo(SmartList()) private fun isConcreteMember(supertype: JetType, memberDescriptor: MemberDescriptor): Boolean { // "Concrete member" is a function or a property that is not abstract, diff --git a/core/descriptors/src/org/jetbrains/kotlin/incremental/components/LookupLocation.kt b/core/descriptors/src/org/jetbrains/kotlin/incremental/components/LookupLocation.kt index 108ed60f681..349ba4117ff 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/incremental/components/LookupLocation.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/incremental/components/LookupLocation.kt @@ -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 }