diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/functionalExpressions.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/functionalExpressions.kt index 5cb4cc6c624f..41e2deba4d77 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/functionalExpressions.kt +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/functionalExpressions.kt @@ -10,6 +10,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.GrFunctionalExpression import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition import org.jetbrains.plugins.groovy.lang.psi.util.GroovyCommonClassNames.GROOVY_LANG_CLOSURE import org.jetbrains.plugins.groovy.lang.resolve.ResolveUtil +import org.jetbrains.plugins.groovy.lang.resolve.api.JustTypeArgument import org.jetbrains.plugins.groovy.lang.resolve.delegatesTo.getDelegatesToInfo import org.jetbrains.plugins.groovy.lang.resolve.processors.ClassHint import org.jetbrains.plugins.groovy.lang.resolve.shouldProcessLocals @@ -81,7 +82,7 @@ private fun GrFunctionalExpression.processDelegate(processor: PsiScopeProcessor, classToDelegate: PsiType?): Boolean { if (classToDelegate == null) return true - val delegateState = state.put(ClassHint.THIS_TYPE, classToDelegate).put(ClassHint.RESOLVE_CONTEXT, this) + val delegateState = state.put(ClassHint.RECEIVER, JustTypeArgument(classToDelegate)).put(ClassHint.RESOLVE_CONTEXT, this) return ResolveUtil.processAllDeclarations(classToDelegate, processor, delegateState, place) } diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/BaseMethodResolveResult.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/BaseMethodResolveResult.kt index 8823876db217..38a071d882e4 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/BaseMethodResolveResult.kt +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/BaseMethodResolveResult.kt @@ -14,7 +14,7 @@ import org.jetbrains.plugins.groovy.lang.resolve.api.ErasedArgument import org.jetbrains.plugins.groovy.lang.resolve.api.GroovyMethodCandidate import org.jetbrains.plugins.groovy.lang.resolve.impl.GdkMethodCandidate import org.jetbrains.plugins.groovy.lang.resolve.impl.MethodCandidateImpl -import org.jetbrains.plugins.groovy.lang.resolve.processors.ClassHint.THIS_TYPE +import org.jetbrains.plugins.groovy.lang.resolve.processors.ClassHint.RECEIVER import org.jetbrains.plugins.groovy.lang.resolve.processors.inference.buildQualifier import org.jetbrains.plugins.groovy.util.recursionAwareLazy @@ -36,7 +36,7 @@ open class BaseMethodResolveResult( } protected val myCandidate: GroovyMethodCandidate by recursionAwareLazy { - MethodCandidateImpl(state[THIS_TYPE], method, contextSubstitutor, arguments, place) + MethodCandidateImpl(state[RECEIVER], method, contextSubstitutor, arguments, place) } final override fun getCandidate(): GroovyMethodCandidate? = myRealCandidate diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/MethodCandidateImpl.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/MethodCandidateImpl.kt index 839c93f013a0..6107c388cea9 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/MethodCandidateImpl.kt +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/MethodCandidateImpl.kt @@ -5,19 +5,22 @@ import com.intellij.psi.PsiElement import com.intellij.psi.PsiMethod import com.intellij.psi.PsiSubstitutor import com.intellij.psi.PsiType +import org.jetbrains.plugins.groovy.lang.resolve.api.Argument import org.jetbrains.plugins.groovy.lang.resolve.api.ArgumentMapping import org.jetbrains.plugins.groovy.lang.resolve.api.Arguments import org.jetbrains.plugins.groovy.lang.resolve.api.GroovyMethodCandidate import org.jetbrains.plugins.groovy.util.recursionAwareLazy class MethodCandidateImpl( - override val receiverType: PsiType?, + private val receiver: Argument?, override val method: PsiMethod, erasureSubstitutor: PsiSubstitutor, arguments: Arguments?, context: PsiElement ) : GroovyMethodCandidate { + override val receiverType: PsiType? get() = receiver?.type + override val argumentMapping: ArgumentMapping? by recursionAwareLazy { arguments?.let { argumentMapping(method, erasureSubstitutor, it, context) diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/ClassHint.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/ClassHint.java index 015f18e7a806..1bad182cac3e 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/ClassHint.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/ClassHint.java @@ -1,11 +1,11 @@ -// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package org.jetbrains.plugins.groovy.lang.resolve.processors; import com.intellij.openapi.util.Key; import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiType; import com.intellij.psi.scope.ElementClassHint; import com.intellij.psi.scope.ElementClassHint.DeclarationKind; +import org.jetbrains.plugins.groovy.lang.resolve.api.Argument; import java.util.EnumSet; @@ -16,7 +16,7 @@ import static com.intellij.psi.scope.ElementClassHint.DeclarationKind.*; */ public interface ClassHint { Key RESOLVE_CONTEXT = Key.create("RESOLVE_CONTEXT"); - Key THIS_TYPE = Key.create("THIS_TYPE"); + Key RECEIVER = Key.create("groovy.resolve.receiver"); Key STATIC_CONTEXT = Key.create("groovy.resolve.static.context"); ElementClassHint EMPTY = kind -> false; diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/inference/inference.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/inference/inference.kt index b31d2bf9d838..15d744f467ab 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/inference/inference.kt +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/inference/inference.kt @@ -49,9 +49,9 @@ fun buildQualifier(ref: GrReferenceExpression?, state: ResolveState): Argument { return ExpressionArgument(qualifierExpression) } - val resolvedThis = state[ClassHint.THIS_TYPE] - if (resolvedThis != null) { - return JustTypeArgument(resolvedThis) + val receiver = state[ClassHint.RECEIVER] + if (receiver != null) { + return receiver } val type = ref?.let(::getQualifierType) diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/receiver.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/receiver.kt index 8518f4ceb1de..77f6b6d53e0a 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/receiver.kt +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/receiver.kt @@ -10,13 +10,14 @@ import org.jetbrains.plugins.groovy.lang.psi.impl.GrTraitType import org.jetbrains.plugins.groovy.lang.psi.impl.GroovyPsiManager import org.jetbrains.plugins.groovy.lang.resolve.ResolveUtil.processClassDeclarations import org.jetbrains.plugins.groovy.lang.resolve.ResolveUtil.processNonCodeMembers +import org.jetbrains.plugins.groovy.lang.resolve.api.JustTypeArgument import org.jetbrains.plugins.groovy.lang.resolve.impl.GroovyMapPropertyImpl import org.jetbrains.plugins.groovy.lang.resolve.processors.ClassHint import org.jetbrains.plugins.groovy.lang.resolve.processors.ClassHint.STATIC_CONTEXT fun PsiType?.processReceiverType(processor: PsiScopeProcessor, state: ResolveState, place: PsiElement): Boolean { if (this == null) return true - val newState = state.put(ClassHint.THIS_TYPE, this) + val newState = state.put(ClassHint.RECEIVER, JustTypeArgument(this)) if (!doProcessReceiverType(processor, newState, place)) return false return !state.processNonCodeMembers() || processNonCodeMembers(this, processor, place, newState) }