Deduce receiver type of callable reference from LHS, not from descriptor

This commit is contained in:
Alexander Udalov
2015-10-15 13:05:55 +03:00
parent 2cf437c0e2
commit bf4a681589
6 changed files with 59 additions and 8 deletions
@@ -201,6 +201,7 @@ private fun bindPropertyReference(expression: JetCallableReferenceExpression, re
private fun createReflectionTypeForCallableDescriptor(
descriptor: CallableDescriptor,
lhsType: JetType?,
reflectionTypes: ReflectionTypes,
trace: BindingTrace?,
reportOn: JetExpression?
@@ -220,7 +221,10 @@ private fun createReflectionTypeForCallableDescriptor(
return null
}
val receiverType = extensionReceiver?.getType() ?: dispatchReceiver?.getType()
val receiverType =
if (extensionReceiver != null || dispatchReceiver != null)
lhsType ?: extensionReceiver?.type ?: dispatchReceiver?.type
else null
return when (descriptor) {
is FunctionDescriptor ->
@@ -242,16 +246,18 @@ public fun getReflectionTypeForCandidateDescriptor(
descriptor: CallableDescriptor,
reflectionTypes: ReflectionTypes
): JetType? =
createReflectionTypeForCallableDescriptor(descriptor, reflectionTypes, null, null)
createReflectionTypeForCallableDescriptor(descriptor, null, reflectionTypes, null, null)
public fun createReflectionTypeForResolvedCallableReference(
reference: JetCallableReferenceExpression,
lhsType: JetType?,
descriptor: CallableDescriptor,
context: ResolutionContext<*>,
reflectionTypes: ReflectionTypes
): JetType? {
val type = createReflectionTypeForCallableDescriptor(descriptor, reflectionTypes, context.trace, reference.getCallableReference())
?: return null
val type = createReflectionTypeForCallableDescriptor(
descriptor, lhsType, reflectionTypes, context.trace, reference.getCallableReference()
) ?: return null
when (descriptor) {
is FunctionDescriptor -> {
bindFunctionReference(reference, type, context)
@@ -265,6 +271,7 @@ public fun createReflectionTypeForResolvedCallableReference(
public fun getResolvedCallableReferenceShapeType(
reference: JetCallableReferenceExpression,
lhsType: JetType?,
overloadResolutionResults: OverloadResolutionResults<CallableDescriptor>?,
context: ResolutionContext<*>,
expectedTypeUnknown: Boolean,
@@ -275,9 +282,9 @@ public fun getResolvedCallableReferenceShapeType(
when {
overloadResolutionResults == null ->
null
overloadResolutionResults.isSingleResult() ->
overloadResolutionResults.isSingleResult ->
OverloadResolutionResultsUtil.getResultingCall(overloadResolutionResults, context.contextDependency)?.let { call ->
createReflectionTypeForCallableDescriptor(call.getResultingDescriptor(), reflectionTypes, context.trace, reference)
createReflectionTypeForCallableDescriptor(call.resultingDescriptor, lhsType, reflectionTypes, context.trace, reference)
}
expectedTypeUnknown /* && overload resolution was ambiguous */ ->
functionPlaceholders.createFunctionPlaceholderType(emptyList(), false)
@@ -250,7 +250,7 @@ public class ArgumentTypeResolver {
callableReferenceExpression, receiverType, context, ResolveArgumentsMode.SHAPE_FUNCTION_ARGUMENTS,
callResolver);
return CallableReferencesResolutionUtilsKt.getResolvedCallableReferenceShapeType(
callableReferenceExpression, overloadResolutionResults, context, expectedTypeIsUnknown,
callableReferenceExpression, receiverType, overloadResolutionResults, context, expectedTypeIsUnknown,
reflectionTypes, builtIns, functionPlaceholders);
}
@@ -700,7 +700,9 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
context.trace.report(CALLABLE_REFERENCE_TO_OBJECT_MEMBER.on(reference));
}
return CallableReferencesResolutionUtilsKt.createReflectionTypeForResolvedCallableReference(expression, descriptor, context, components.reflectionTypes);
return CallableReferencesResolutionUtilsKt.createReflectionTypeForResolvedCallableReference(
expression, lhsType, descriptor, context, components.reflectionTypes
);
}
@Override