diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/callReferenceImpl.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/callReferenceImpl.kt index 372e1ca386e0..5830b25b3e26 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/callReferenceImpl.kt +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/callReferenceImpl.kt @@ -5,12 +5,11 @@ import com.intellij.psi.PsiElement import com.intellij.psi.PsiType import com.intellij.psi.ResolveState import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult -import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.rValueProcessor import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.resolveKinds import org.jetbrains.plugins.groovy.lang.resolve.api.Argument import org.jetbrains.plugins.groovy.lang.resolve.api.Arguments -import org.jetbrains.plugins.groovy.lang.resolve.processReceiverType +import org.jetbrains.plugins.groovy.lang.resolve.processReceiver import org.jetbrains.plugins.groovy.lang.resolve.processors.MethodProcessor fun resolveWithArguments(receiver: Argument, @@ -18,16 +17,14 @@ fun resolveWithArguments(receiver: Argument, arguments: Arguments?, place: PsiElement): List { val state = ResolveState.initial() - val receiverType = receiver.type ?: TypesUtil.getJavaLangObject(place) - val methodProcessor = MethodProcessor(methodName, place, arguments, PsiType.EMPTY_ARRAY) - receiverType.processReceiverType(methodProcessor, state, place) + receiver.processReceiver(methodProcessor, state, place) methodProcessor.applicableCandidates?.let { return it } val propertyProcessor = rValueProcessor(methodName, place, resolveKinds(true)) - receiverType.processReceiverType(propertyProcessor, state, place) + receiver.processReceiver(propertyProcessor, state, place) val properties = propertyProcessor.results if (properties.size == 1) { return properties 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 77f6b6d53e0a..201942f4b812 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 @@ -8,18 +8,28 @@ import com.intellij.psi.util.InheritanceUtil import org.jetbrains.plugins.groovy.lang.psi.impl.GrMapType import org.jetbrains.plugins.groovy.lang.psi.impl.GrTraitType import org.jetbrains.plugins.groovy.lang.psi.impl.GroovyPsiManager +import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil 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.Argument 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 Argument.processReceiver(processor: PsiScopeProcessor, state: ResolveState, place: PsiElement): Boolean { + val receiverType: PsiType = type ?: TypesUtil.getJavaLangObject(place) ?: return true + return receiverType.doProcessReceiverType0(processor, state.put(ClassHint.RECEIVER, this), place) +} + fun PsiType?.processReceiverType(processor: PsiScopeProcessor, state: ResolveState, place: PsiElement): Boolean { if (this == null) return true - val newState = state.put(ClassHint.RECEIVER, JustTypeArgument(this)) - if (!doProcessReceiverType(processor, newState, place)) return false - return !state.processNonCodeMembers() || processNonCodeMembers(this, processor, place, newState) + return doProcessReceiverType0(processor, state.put(ClassHint.RECEIVER, JustTypeArgument(this)), place) +} + +private fun PsiType.doProcessReceiverType0(processor: PsiScopeProcessor, state: ResolveState, place: PsiElement): Boolean { + if (!doProcessReceiverType(processor, state, place)) return false + return !state.processNonCodeMembers() || processNonCodeMembers(this, processor, place, state) } private fun PsiType.doProcessReceiverType(processor: PsiScopeProcessor, state: ResolveState, place: PsiElement): Boolean {