[groovy] resolve: obtain receiver argument from resolve state

GitOrigin-RevId: de65ade760361a2f7df4faf773247cb55ed8d014
This commit is contained in:
Daniil Ovchinnikov
2019-11-07 02:40:58 +00:00
committed by intellij-monorepo-bot
parent 667446d71d
commit 5afc99451b
6 changed files with 16 additions and 11 deletions
@@ -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)
}
@@ -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
@@ -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)
@@ -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<PsiElement> RESOLVE_CONTEXT = Key.create("RESOLVE_CONTEXT");
Key<PsiType> THIS_TYPE = Key.create("THIS_TYPE");
Key<Argument> RECEIVER = Key.create("groovy.resolve.receiver");
Key<Boolean> STATIC_CONTEXT = Key.create("groovy.resolve.static.context");
ElementClassHint EMPTY = kind -> false;
@@ -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)
@@ -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)
}