diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/receivers/ExpressionReceiver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/receivers/ExpressionReceiver.kt index 85708f0dc81..edeccc03027 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/receivers/ExpressionReceiver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/receivers/ExpressionReceiver.kt @@ -28,6 +28,8 @@ interface ExpressionReceiver : ReceiverValue { private open class ExpressionReceiverImpl( override val expression: KtExpression, type: KotlinType ): AbstractReceiverValue(type), ExpressionReceiver { + override fun replaceType(newType: KotlinType) = ExpressionReceiverImpl(expression, newType) + override fun toString() = "$type {$expression: ${expression.text}}" } @@ -35,13 +37,17 @@ interface ExpressionReceiver : ReceiverValue { override val classDescriptor: ClassDescriptor, expression: KtExpression, type: KotlinType - ) : ExpressionReceiverImpl(expression, type), ThisClassReceiver + ) : ExpressionReceiverImpl(expression, type), ThisClassReceiver { + override fun replaceType(newType: KotlinType) = ThisExpressionClassReceiver(classDescriptor, expression, newType) + } private class SuperExpressionReceiver( override val thisType: KotlinType, expression: KtExpression, type: KotlinType - ) : ExpressionReceiverImpl(expression, type), SuperCallReceiverValue + ) : ExpressionReceiverImpl(expression, type), SuperCallReceiverValue { + override fun replaceType(newType: KotlinType) = SuperExpressionReceiver(thisType, expression, newType) + } fun create( expression: KtExpression, diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/receivers/Qualifier.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/receivers/Qualifier.kt index 58880ad45cd..4b6684f899a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/receivers/Qualifier.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/receivers/Qualifier.kt @@ -125,4 +125,6 @@ class ClassValueReceiver(val classQualifier: ClassifierQualifier, private val ty override val expression: KtExpression get() = classQualifier.expression + + override fun replaceType(newType: KotlinType) = ClassValueReceiver(classQualifier, newType) } diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/smartcasts/smartCastUtil.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/smartcasts/smartCastUtil.kt index 7764f36628a..d242581d66e 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/smartcasts/smartCastUtil.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/smartcasts/smartCastUtil.kt @@ -26,4 +26,5 @@ fun getReceiverValueWithSmartCast( private class SmartCastReceiverValue(private val type: KotlinType) : ReceiverValue { override fun getType() = type + override fun replaceType(newType: KotlinType) = SmartCastReceiverValue(newType) } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/Visibilities.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/Visibilities.java index f86be0737fb..1a0a18dbafa 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/Visibilities.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/Visibilities.java @@ -396,6 +396,12 @@ public class Visibilities { public KotlinType getType() { throw new IllegalStateException("This method should not be called"); } + + @NotNull + @Override + public ReceiverValue replaceType(@NotNull KotlinType newType) { + throw new IllegalStateException("This method should not be called"); + } }; /** @@ -408,6 +414,12 @@ public class Visibilities { public KotlinType getType() { throw new IllegalStateException("This method should not be called"); } + + @NotNull + @Override + public ReceiverValue replaceType(@NotNull KotlinType newType) { + throw new IllegalStateException("This method should not be called"); + } }; // This constant is not intended to use somewhere else from @@ -418,6 +430,12 @@ public class Visibilities { public KotlinType getType() { throw new IllegalStateException("This method should not be called"); } + + @NotNull + @Override + public ReceiverValue replaceType(@NotNull KotlinType newType) { + throw new IllegalStateException("This method should not be called"); + } }; public static boolean isPrivate(@NotNull Visibility visibility) { diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/receivers/ExtensionReceiver.java b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/receivers/ExtensionReceiver.java index 3fc6e15c0db..bedf4b95a01 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/receivers/ExtensionReceiver.java +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/receivers/ExtensionReceiver.java @@ -35,6 +35,12 @@ public class ExtensionReceiver extends AbstractReceiverValue implements Implicit return descriptor; } + @NotNull + @Override + public ReceiverValue replaceType(@NotNull KotlinType newType) { + return new ExtensionReceiver(descriptor, newType); + } + @Override public String toString() { return getType() + ": Ext {" + descriptor + "}"; diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/receivers/ImplicitClassReceiver.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/receivers/ImplicitClassReceiver.kt index 457ccb36aa1..3cf2c94fe71 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/receivers/ImplicitClassReceiver.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/receivers/ImplicitClassReceiver.kt @@ -17,6 +17,8 @@ package org.jetbrains.kotlin.resolve.scopes.receivers import org.jetbrains.kotlin.descriptors.ClassDescriptor +import org.jetbrains.kotlin.types.KotlinType +import java.lang.UnsupportedOperationException /** * Describes any "this" receiver inside a class @@ -39,4 +41,7 @@ open class ImplicitClassReceiver(final override val classDescriptor: ClassDescri override fun hashCode() = classDescriptor.hashCode() override fun toString() = "Class{$type}" + + override fun replaceType(newType: KotlinType) = + throw UnsupportedOperationException("Replace type should not be called for this receiver") } diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/receivers/ReceiverValue.java b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/receivers/ReceiverValue.java index 0188cc9b6c0..a5c6a6e9205 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/receivers/ReceiverValue.java +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/receivers/ReceiverValue.java @@ -23,4 +23,7 @@ public interface ReceiverValue extends Receiver { @NotNull KotlinType getType(); + + @NotNull + ReceiverValue replaceType(@NotNull KotlinType newType); } diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/receivers/TransientReceiver.java b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/receivers/TransientReceiver.java index 61004aef192..89bdb1b5135 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/receivers/TransientReceiver.java +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/receivers/TransientReceiver.java @@ -32,4 +32,10 @@ public class TransientReceiver extends AbstractReceiverValue { public String toString() { return "{Transient} : " + getType(); } + + @NotNull + @Override + public ReceiverValue replaceType(@NotNull KotlinType newType) { + return new TransientReceiver(newType); + } }