diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java index 305149cdbcc..3ad9c7a7b91 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java @@ -960,6 +960,11 @@ public class DescriptorResolver { if (receiverTypeRef != null) { receiverType = typeResolver.resolveType(scopeForDeclarationResolutionWithTypeParameters, receiverTypeRef, trace, true); } + + List contextReceiverTypeRefs = variableDeclaration.getContextReceiverTypeReferences(); + for (KtTypeReference contextReceiverTypeRef: contextReceiverTypeRefs) { + typeResolver.resolveType(scopeForDeclarationResolutionWithTypeParameters, contextReceiverTypeRef, trace, true); + } } ReceiverParameterDescriptor receiverDescriptor; diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt index fce68e65772..59db49d7223 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt @@ -197,6 +197,9 @@ class FunctionDescriptorResolver( if (function is KtFunctionLiteral) expectedFunctionType.getReceiverType() else null } + function.contextReceiverTypeReferences.onEach { + typeResolver.resolveType(headerScope, it, trace, true) + } val valueParameterDescriptors = createValueParameterDescriptors(function, functionDescriptor, headerScope, trace, expectedFunctionType, inferenceSession) diff --git a/compiler/psi/src/org/jetbrains/kotlin/psi/KtCallableDeclaration.java b/compiler/psi/src/org/jetbrains/kotlin/psi/KtCallableDeclaration.java index 356b2f48778..b4d1875c76b 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/psi/KtCallableDeclaration.java +++ b/compiler/psi/src/org/jetbrains/kotlin/psi/KtCallableDeclaration.java @@ -32,6 +32,9 @@ public interface KtCallableDeclaration extends KtNamedDeclaration, KtTypeParamet @Nullable KtTypeReference getReceiverTypeReference(); + @NotNull + List getContextReceiverTypeReferences(); + @Nullable KtTypeReference getTypeReference(); diff --git a/compiler/psi/src/org/jetbrains/kotlin/psi/KtConstructor.kt b/compiler/psi/src/org/jetbrains/kotlin/psi/KtConstructor.kt index 42b2191a7f0..0a33e4edae7 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/psi/KtConstructor.kt +++ b/compiler/psi/src/org/jetbrains/kotlin/psi/KtConstructor.kt @@ -40,6 +40,8 @@ abstract class KtConstructor> : KtDeclarationStub = emptyList() + override fun getTypeReference() = null @Throws(IncorrectOperationException::class) diff --git a/compiler/psi/src/org/jetbrains/kotlin/psi/KtDestructuringDeclarationEntry.java b/compiler/psi/src/org/jetbrains/kotlin/psi/KtDestructuringDeclarationEntry.java index 9cc18d84c36..10232b07751 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/psi/KtDestructuringDeclarationEntry.java +++ b/compiler/psi/src/org/jetbrains/kotlin/psi/KtDestructuringDeclarationEntry.java @@ -75,6 +75,12 @@ public class KtDestructuringDeclarationEntry extends KtNamedDeclarationNotStubbe return null; } + @NotNull + @Override + public List getContextReceiverTypeReferences() { + return Collections.emptyList(); + } + @Nullable @Override public KtTypeParameterList getTypeParameterList() { diff --git a/compiler/psi/src/org/jetbrains/kotlin/psi/KtFunctionNotStubbed.java b/compiler/psi/src/org/jetbrains/kotlin/psi/KtFunctionNotStubbed.java index 3b10d30f6ee..37bcfda9f29 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/psi/KtFunctionNotStubbed.java +++ b/compiler/psi/src/org/jetbrains/kotlin/psi/KtFunctionNotStubbed.java @@ -62,6 +62,12 @@ public abstract class KtFunctionNotStubbed extends KtTypeParameterListOwnerNotSt return null; } + @NotNull + @Override + public List getContextReceiverTypeReferences() { + return Collections.emptyList(); + } + @Override @Nullable public KtTypeReference getTypeReference() { diff --git a/compiler/psi/src/org/jetbrains/kotlin/psi/KtNamedFunction.java b/compiler/psi/src/org/jetbrains/kotlin/psi/KtNamedFunction.java index 15741d2c165..2b457d2c788 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/psi/KtNamedFunction.java +++ b/compiler/psi/src/org/jetbrains/kotlin/psi/KtNamedFunction.java @@ -183,6 +183,37 @@ public class KtNamedFunction extends KtTypeParameterListOwnerStub getContextReceiverTypeReferences() { + KotlinFunctionStub stub = getStub(); + if (stub != null) { + List childContextReceivers = getStubOrPsiChildrenAsList(KtStubElementTypes.CONTEXT_RECEIVER); + if (!childContextReceivers.isEmpty()) { + return childContextReceivers.get(0).typeReferences(); + } + else { + return Collections.emptyList(); + } + } + return getContextReceiverTypeRefsByTree(); + } + + @NotNull + private List getContextReceiverTypeRefsByTree() { + PsiElement child = getFirstChild(); + while (child != null) { + IElementType tt = child.getNode().getElementType(); + if (tt == KtTokens.LPAR || tt == KtTokens.COLON) break; + if (child instanceof KtContextReceiver) { + return ((KtContextReceiver) child).typeReferences(); + } + child = child.getNextSibling(); + } + + return Collections.emptyList(); + } + @Nullable private KtTypeReference getReceiverTypeRefByTree() { PsiElement child = getFirstChild(); diff --git a/compiler/psi/src/org/jetbrains/kotlin/psi/KtParameter.java b/compiler/psi/src/org/jetbrains/kotlin/psi/KtParameter.java index d09d68694ac..1254ed631db 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/psi/KtParameter.java +++ b/compiler/psi/src/org/jetbrains/kotlin/psi/KtParameter.java @@ -193,6 +193,12 @@ public class KtParameter extends KtNamedDeclarationStub imp return null; } + @NotNull + @Override + public List getContextReceiverTypeReferences() { + return Collections.emptyList(); + } + @Nullable @Override public KtTypeParameterList getTypeParameterList() { diff --git a/compiler/psi/src/org/jetbrains/kotlin/psi/KtProperty.java b/compiler/psi/src/org/jetbrains/kotlin/psi/KtProperty.java index b710e4612bd..8f3a17bd8ac 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/psi/KtProperty.java +++ b/compiler/psi/src/org/jetbrains/kotlin/psi/KtProperty.java @@ -114,6 +114,38 @@ public class KtProperty extends KtTypeParameterListOwnerStub return getReceiverTypeRefByTree(); } + @NotNull + @Override + public List getContextReceiverTypeReferences() { + KotlinPropertyStub stub = getStub(); + if (stub != null) { + KtContextReceiver contextReceiver = getStubOrPsiChild(KtStubElementTypes.CONTEXT_RECEIVER); + if (contextReceiver != null) { + return contextReceiver.typeReferences(); + } else { + return Collections.emptyList(); + } + } + return getContextReceiverTypeRefsByTree(); + } + + @NotNull + private List getContextReceiverTypeRefsByTree() { + ASTNode node = getNode().getFirstChildNode(); + while (node != null) { + IElementType tt = node.getElementType(); + if (tt == KtTokens.COLON) { + break; + } + if (tt == KtNodeTypes.CONTEXT_RECEIVER) { + KtContextReceiver contextReceiver = (KtContextReceiver) node.getPsi(); + return contextReceiver.typeReferences(); + } + node = node.getTreeNext(); + } + return Collections.emptyList(); + } + @Nullable private KtTypeReference getReceiverTypeRefByTree() { ASTNode node = getNode().getFirstChildNode();