From e310ef23f23205fcee66c5e6dc457445040284fc Mon Sep 17 00:00:00 2001 From: Daniil Ovchinnikov Date: Thu, 30 Jan 2020 22:12:01 +0300 Subject: [PATCH] [groovy] correct parameter type inside method signature parameter GitOrigin-RevId: 295c16246cb3e6df4a62f7dc2487f934eb1a3d8a --- .../groovy/lang/resolve/BaseMethodResolveResult.kt | 2 +- .../groovy/lang/resolve/impl/GdkArgumentMapping.kt | 8 +++----- .../groovy/lang/resolve/impl/GdkMethodCandidate.kt | 4 +++- .../lang/resolve/impl/MethodCandidateImpl.kt | 2 +- .../groovy/lang/resolve/impl/MethodSignature.kt | 10 ++++------ .../lang/resolve/impl/PsiCallParameterImpl.kt | 14 +++++++++++--- .../plugins/groovy/lang/resolve/impl/distance.kt | 3 +-- .../lang/typing/GroovyMethodReferenceType.kt | 4 ++-- 8 files changed, 26 insertions(+), 21 deletions(-) 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 0da9abc2e8d3..5d8a308e6c6c 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 @@ -48,7 +48,7 @@ open class BaseMethodResolveResult( protected open fun createMethodCandidate(method: PsiMethod, place: PsiElement, state: ResolveState): GroovyMethodCandidate { val mapping = myCandidate.argumentMapping return if (mapping != null && method is GrGdkMethod) { - GdkMethodCandidate(method.staticMethod, buildQualifier(place as? GrReferenceExpression, state), mapping) + GdkMethodCandidate(method.staticMethod, buildQualifier(place as? GrReferenceExpression, state), place, mapping) } else { myCandidate diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/GdkArgumentMapping.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/GdkArgumentMapping.kt index 1a2684916f29..c557dabe569a 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/GdkArgumentMapping.kt +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/GdkArgumentMapping.kt @@ -1,15 +1,13 @@ // Copyright 2000-2020 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.impl -import com.intellij.psi.PsiMethod -import com.intellij.psi.PsiParameter -import com.intellij.psi.PsiSubstitutor -import com.intellij.psi.PsiType +import com.intellij.psi.* import org.jetbrains.plugins.groovy.lang.resolve.api.* class GdkArgumentMapping( method: PsiMethod, private val receiverArgument: Argument, + private val context: PsiElement, delegate: ArgumentMapping ) : DelegateArgumentMapping(delegate) { @@ -19,7 +17,7 @@ class GdkArgumentMapping( override fun targetParameter(argument: Argument): PsiCallParameter? { return if (argument == receiverArgument) { - PsiCallParameterImpl(receiverParameter, PsiSubstitutor.EMPTY) + PsiCallParameterImpl(receiverParameter, PsiSubstitutor.EMPTY, context) } else { super.targetParameter(argument) diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/GdkMethodCandidate.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/GdkMethodCandidate.kt index 5e7d22211a79..c0d0e65f6ca4 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/GdkMethodCandidate.kt +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/GdkMethodCandidate.kt @@ -1,6 +1,7 @@ // Copyright 2000-2020 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.impl +import com.intellij.psi.PsiElement import com.intellij.psi.PsiMethod import com.intellij.psi.PsiType import org.jetbrains.plugins.groovy.lang.resolve.api.Argument @@ -11,10 +12,11 @@ import org.jetbrains.plugins.groovy.lang.resolve.api.PsiCallParameter class GdkMethodCandidate( override val method: PsiMethod, receiverArgument: Argument, + context: PsiElement, originalMapping: ArgumentMapping ) : GroovyMethodCandidate { override val receiverType: PsiType? get() = null - override val argumentMapping: ArgumentMapping? = GdkArgumentMapping(method, receiverArgument, originalMapping) + override val argumentMapping: ArgumentMapping? = GdkArgumentMapping(method, receiverArgument, context, originalMapping) } 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 8c75c9ef393b..ed386172ac08 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 @@ -20,7 +20,7 @@ class MethodCandidateImpl( override val argumentMapping: ArgumentMapping? by recursionAwareLazy { arguments?.let { - MethodSignature(method, erasureSubstitutor).applyTo(it, context) + MethodSignature(method, erasureSubstitutor, context).applyTo(it, context) } } } diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/MethodSignature.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/MethodSignature.kt index eff011a3c09e..42e0dbd7ae9d 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/MethodSignature.kt +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/MethodSignature.kt @@ -6,14 +6,12 @@ import com.intellij.util.lazyPub import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil import org.jetbrains.plugins.groovy.lang.psi.util.isEffectivelyVarArgs -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.CallSignature -import org.jetbrains.plugins.groovy.lang.resolve.api.PsiCallParameter +import org.jetbrains.plugins.groovy.lang.resolve.api.* internal class MethodSignature( private val method: PsiMethod, - private val substitutor: PsiSubstitutor + private val substitutor: PsiSubstitutor, + context: PsiElement ) : CallSignature { override val isVararg: Boolean by lazyPub { @@ -22,7 +20,7 @@ internal class MethodSignature( override val parameters: List by lazyPub { method.parameterList.parameters.map { psi -> - PsiCallParameterImpl(psi, substitutor) + PsiCallParameterImpl(psi, substitutor, context) } } diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/PsiCallParameterImpl.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/PsiCallParameterImpl.kt index eb636632b9d2..b4bd1388b305 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/PsiCallParameterImpl.kt +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/PsiCallParameterImpl.kt @@ -1,18 +1,26 @@ // Copyright 2000-2020 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.impl +import com.intellij.psi.PsiElement import com.intellij.psi.PsiParameter import com.intellij.psi.PsiSubstitutor import com.intellij.psi.PsiType +import com.intellij.psi.impl.PsiClassImplUtil +import com.intellij.util.recursionSafeLazy import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameter import org.jetbrains.plugins.groovy.lang.resolve.api.PsiCallParameter class PsiCallParameterImpl( override val psi: PsiParameter, - private val substitutor: PsiSubstitutor + private val substitutor: PsiSubstitutor, + private val context: PsiElement ) : PsiCallParameter { - override val type: PsiType get() = substitutor.substitute(psi.type) + override val type: PsiType? by recursionSafeLazy { + PsiClassImplUtil.correctType(substitutor.substitute(psi.type), context.resolveScope) + } + override val parameterName: String? get() = psi.name + override val isOptional: Boolean get() = psi is GrParameter && psi.isOptional -} \ No newline at end of file +} diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/distance.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/distance.kt index c40752f73edc..7a5d90dd7a55 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/distance.kt +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/distance.kt @@ -3,7 +3,6 @@ package org.jetbrains.plugins.groovy.lang.resolve.impl import com.intellij.lang.jvm.types.JvmPrimitiveTypeKind import com.intellij.psi.* -import com.intellij.psi.impl.PsiClassImplUtil.correctType import com.intellij.psi.util.InheritanceUtil import org.jetbrains.plugins.groovy.lang.psi.util.GroovyCommonClassNames import org.jetbrains.plugins.groovy.lang.resolve.api.Argument @@ -56,7 +55,7 @@ fun positionalParametersDistance(map: Map, context: Psi var result = 0L for ((argument, parameter) in map) { val runtimeType = argument.runtimeType ?: continue - val parameterType = correctType(parameter.type, context.resolveScope) ?: continue + val parameterType = parameter.type ?: continue result += parameterDistance(runtimeType, parameterType, context) } return result diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/typing/GroovyMethodReferenceType.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/typing/GroovyMethodReferenceType.kt index a4e1d4dea7c5..4adc2d91b548 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/typing/GroovyMethodReferenceType.kt +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/typing/GroovyMethodReferenceType.kt @@ -9,13 +9,13 @@ import org.jetbrains.plugins.groovy.lang.resolve.api.CallSignature import org.jetbrains.plugins.groovy.lang.resolve.impl.MethodSignature internal class GroovyMethodReferenceType( - myMethodReference: GrReferenceExpression + private val myMethodReference: GrReferenceExpression ) : GroovyClosureType(myMethodReference) { override val signatures: List> by lazyPub { myMethodReference.resolve(false).mapNotNullTo(SmartList()) { result -> (result.element as? PsiMethod)?.let { - MethodSignature(it, result.substitutor) + MethodSignature(it, result.substitutor, myMethodReference) } } }