diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegatedPropertyResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegatedPropertyResolver.java index 483b6cbf769..7475c6fdeb8 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegatedPropertyResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegatedPropertyResolver.java @@ -145,7 +145,7 @@ public class DelegatedPropertyResolver { KtPsiFactory psiFactory = KtPsiFactory(delegateExpression); List arguments = Collections.singletonList(createExpressionForProperty(psiFactory)); - ExpressionReceiver receiver = new ExpressionReceiver(delegateExpression, delegateType); + ExpressionReceiver receiver = ExpressionReceiver.create(delegateExpression, delegateType, trace.getBindingContext()); Pair> resolutionResult = fakeCallResolver.makeAndResolveFakeCallInContext(receiver, context, arguments, PROPERTY_DELEGATED_FUNCTION_NAME, delegateExpression); @@ -261,7 +261,7 @@ public class DelegatedPropertyResolver { } Name functionName = isGet ? GETTER_NAME : SETTER_NAME; - ExpressionReceiver receiver = new ExpressionReceiver(delegateExpression, delegateType); + ExpressionReceiver receiver = ExpressionReceiver.create(delegateExpression, delegateType, trace.getBindingContext()); Pair> resolutionResult = fakeCallResolver.makeAndResolveFakeCallInContext(receiver, context, arguments, functionName, delegateExpression); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallExpressionResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallExpressionResolver.java index 332a45d8230..50ad3770970 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallExpressionResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallExpressionResolver.java @@ -348,7 +348,9 @@ public class CallExpressionResolver { } QualifierReceiver qualifierReceiver = (QualifierReceiver) context.trace.get(BindingContext.QUALIFIER, element.getReceiver()); - ReceiverValue receiver = qualifierReceiver == null ? new ExpressionReceiver(element.getReceiver(), receiverType) : qualifierReceiver; + ReceiverValue receiver = qualifierReceiver == null ? + ExpressionReceiver.create(element.getReceiver(), receiverType, context.trace.getBindingContext()) : + qualifierReceiver; boolean lastStage = element.getQualified() == expression; assert lastStage == (element == elementChain.getLast()); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java index 17758d2ddd0..23104524e6e 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java @@ -315,7 +315,7 @@ public class CallResolver { } KotlinType calleeType = expressionTypingServices.safeGetType( context.scope, calleeExpression, expectedType, context.dataFlowInfo, context.trace); - ExpressionReceiver expressionReceiver = new ExpressionReceiver(calleeExpression, calleeType); + ExpressionReceiver expressionReceiver = ExpressionReceiver.create(calleeExpression, calleeType, context.trace.getBindingContext()); Call call = new CallTransformer.CallForImplicitInvoke(context.call.getExplicitReceiver(), expressionReceiver, context.call); TracingStrategyForInvoke tracingForInvoke = new TracingStrategyForInvoke(calleeExpression, call, calleeType); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallTransformer.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallTransformer.java index f18d705e20c..8d301d0c99b 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallTransformer.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallTransformer.java @@ -235,7 +235,8 @@ public class CallTransformer { KtExpression calleeExpression = task.call.getCalleeExpression(); if (calleeExpression == null) return Collections.emptyList(); - ExpressionReceiver variableReceiver = new ExpressionReceiver(calleeExpression, variableResolvedCall.getResultingDescriptor().getType()); + ExpressionReceiver variableReceiver = ExpressionReceiver.create( + calleeExpression, variableResolvedCall.getResultingDescriptor().getType(), context.trace.getBindingContext()); Call functionCall = new CallForImplicitInvoke(context.explicitExtensionReceiverForInvoke, variableReceiver, task.call); DelegatingBindingTrace variableCallTrace = context.candidateCall.getTrace(); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CandidateResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CandidateResolver.kt index 33cf15724b0..d2c5923bc36 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CandidateResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CandidateResolver.kt @@ -364,7 +364,7 @@ public class CandidateResolver( expectedType: KotlinType, actualType: KotlinType, context: ResolutionContext<*>): KotlinType? { - val receiverToCast = ExpressionReceiver(KtPsiUtil.safeDeparenthesize(expression), actualType) + val receiverToCast = ExpressionReceiver.create(KtPsiUtil.safeDeparenthesize(expression), actualType, context.trace.bindingContext) val variants = smartCastManager.getSmartCastVariantsExcludingReceiver(context, receiverToCast) for (possibleType in variants) { if (KotlinTypeChecker.DEFAULT.isSubtypeOf(possibleType, expectedType)) { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/receivers/ExpressionReceiver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/receivers/ExpressionReceiver.java index f618556ceaa..e86b48ad505 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/receivers/ExpressionReceiver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/receivers/ExpressionReceiver.java @@ -18,10 +18,19 @@ package org.jetbrains.kotlin.resolve.scopes.receivers; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.psi.KtExpression; +import org.jetbrains.kotlin.resolve.BindingContext; import org.jetbrains.kotlin.types.KotlinType; public class ExpressionReceiver extends AbstractReceiverValue implements ReceiverValue { + public static ExpressionReceiver create( + @NotNull KtExpression expression, + @NotNull KotlinType type, + @NotNull BindingContext bindingContext + ) { + return new ExpressionReceiver(expression, type); + } + private final KtExpression expression; public ExpressionReceiver(@NotNull KtExpression expression, @NotNull KotlinType type) { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java index e7f148d0d9e..9f4248dea16 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java @@ -760,7 +760,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { // Type check the base expression KotlinTypeInfo typeInfo = facade.safeGetTypeInfo(baseExpression, context); KotlinType type = ExpressionTypingUtils.safeGetType(typeInfo); - ExpressionReceiver receiver = new ExpressionReceiver(baseExpression, type); + ExpressionReceiver receiver = ExpressionReceiver.create(baseExpression, type, context.trace.getBindingContext()); Call call = CallMaker.makeCall(receiver, expression); @@ -1495,7 +1495,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { KotlinType arrayType = ExpressionTypingUtils.safeGetType(arrayTypeInfo); ExpressionTypingContext context = oldContext.replaceDataFlowInfo(arrayTypeInfo.getDataFlowInfo()); - ExpressionReceiver receiver = new ExpressionReceiver(arrayExpression, arrayType); + ExpressionReceiver receiver = ExpressionReceiver.create(arrayExpression, arrayType, context.trace.getBindingContext()); if (!isGet) assert rightHandSide != null; Call call = isGet diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingUtils.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingUtils.java index c1b9438020e..b8bcd346681 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingUtils.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingUtils.java @@ -71,19 +71,15 @@ public class ExpressionTypingUtils { return receiverValue; } - @Nullable - public static ExpressionReceiver getExpressionReceiver(@NotNull KtExpression expression, @Nullable KotlinType type) { - if (type == null) return null; - return new ExpressionReceiver(expression, type); - } - @Nullable public static ExpressionReceiver getExpressionReceiver( @NotNull ExpressionTypingFacade facade, @NotNull KtExpression expression, ExpressionTypingContext context ) { - return getExpressionReceiver(expression, facade.getTypeInfo(expression, context).getType()); + KotlinType type = facade.getTypeInfo(expression, context).getType(); + if (type == null) return null; + return ExpressionReceiver.create(expression, type, context.trace.getBindingContext()); } @NotNull @@ -93,7 +89,7 @@ public class ExpressionTypingUtils { ExpressionTypingContext context ) { KotlinType type = safeGetType(facade.safeGetTypeInfo(expression, context)); - return new ExpressionReceiver(expression, type); + return ExpressionReceiver.create(expression, type, context.trace.getBindingContext()); } @NotNull diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorForStatements.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorForStatements.java index c077c27f0c9..8a9e5efef8f 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorForStatements.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorForStatements.java @@ -250,7 +250,7 @@ public class ExpressionTypingVisitorForStatements extends ExpressionTypingVisito temporary.commit(); return rightInfo.clearType(); } - ExpressionReceiver receiver = new ExpressionReceiver(left, leftType); + ExpressionReceiver receiver = ExpressionReceiver.create(left, leftType, context.trace.getBindingContext()); // We check that defined only one of '+=' and '+' operations, and call it (in the case '+' we then also assign) // Check for '+=' diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/CallType.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/CallType.kt index 9d09e86154d..0f417b177c7 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/CallType.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/CallType.kt @@ -248,7 +248,7 @@ public fun CallTypeAndReceiver<*, *>.receiverTypes( val receiverValues = if (receiverExpression != null) { val expressionType = bindingContext.getType(receiverExpression) - expressionType?.let { listOf(ExpressionReceiver(receiverExpression, expressionType)) } ?: return emptyList() + expressionType?.let { listOf(ExpressionReceiver.create(receiverExpression, expressionType, bindingContext)) } ?: return emptyList() } else { val resolutionScope = contextElement.getResolutionScope(bindingContext, resolutionFacade) diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/ShadowedDeclarationsFilter.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/ShadowedDeclarationsFilter.kt index 9c5b3e59fd3..b96f5ea93fb 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/ShadowedDeclarationsFilter.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/ShadowedDeclarationsFilter.kt @@ -63,7 +63,7 @@ public class ShadowedDeclarationsFilter( val explicitReceiverValue = receiverExpression?.let { val type = bindingContext.getType(it) ?: return null - ExpressionReceiver(it, type) + ExpressionReceiver.create(it, type, bindingContext) } ?: ReceiverValue.NO_RECEIVER return ShadowedDeclarationsFilter(bindingContext, resolutionFacade, context, explicitReceiverValue) } diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt index 3b58b1dab1a..6b259c70228 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt @@ -370,7 +370,8 @@ abstract class CompletionSession( val runtimeType = evaluator(explicitReceiver) if (runtimeType == null || runtimeType == type) return null - val (variants, notImportedExtensions) = collectReferenceVariants(descriptorKindFilter!!, nameExpression!!, ExpressionReceiver(explicitReceiver, runtimeType)) + val expressionReceiver = ExpressionReceiver.create(explicitReceiver, runtimeType, bindingContext) + val (variants, notImportedExtensions) = collectReferenceVariants(descriptorKindFilter!!, nameExpression!!, expressionReceiver) val filteredVariants = filterVariantsForRuntimeReceiverType(variants, referenceVariants.imported) val filteredNotImportedExtensions = filterVariantsForRuntimeReceiverType(notImportedExtensions, referenceVariants.notImportedExtensions) diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/IterableTypesDetection.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/IterableTypesDetection.kt index 8f75333a51e..60df6682dd9 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/IterableTypesDetection.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/IterableTypesDetection.kt @@ -72,8 +72,8 @@ public class IterableTypesDetection( if (!canBeIterable(type)) return null val expression = KtPsiFactory(project).createExpression("fake") - val expressionReceiver = ExpressionReceiver(expression, type.type) val context = ExpressionTypingContext.newContext(BindingTraceContext(), scope, DataFlowInfo.EMPTY, TypeUtils.NO_EXPECTED_TYPE) + val expressionReceiver = ExpressionReceiver.create(expression, type.type, context.trace.bindingContext) val elementType = forLoopConventionsChecker.checkIterableConvention(expressionReceiver, context) return elementType?.let { FuzzyType(it, type.freeParameters) } } diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/descriptorUtils.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/descriptorUtils.kt index ef241c1358d..da2823c4a5f 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/descriptorUtils.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/descriptorUtils.kt @@ -44,7 +44,7 @@ fun DeclarationDescriptorWithVisibility.isVisible( val receiver = element.getReceiverExpression() val type = receiver?.let { bindingContext.getType(it) } - val explicitReceiver = type?.let { ExpressionReceiver(receiver!!, it) } + val explicitReceiver = type?.let { ExpressionReceiver.create(receiver!!, it, bindingContext) } if (explicitReceiver != null) { val normalizeReceiver = ExpressionTypingUtils.normalizeReceiverValueForVisibility(explicitReceiver, bindingContext)