mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
[groovy] resolve: obtain receiver argument from resolve state
GitOrigin-RevId: de65ade760361a2f7df4faf773247cb55ed8d014
This commit is contained in:
committed by
intellij-monorepo-bot
parent
667446d71d
commit
5afc99451b
+2
-1
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
+2
-2
@@ -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
|
||||
|
||||
+4
-1
@@ -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)
|
||||
|
||||
+3
-3
@@ -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;
|
||||
|
||||
+3
-3
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user