[groovy] correct parameter type inside method signature parameter

GitOrigin-RevId: 295c16246cb3e6df4a62f7dc2487f934eb1a3d8a
This commit is contained in:
Daniil Ovchinnikov
2020-01-30 20:06:45 +00:00
committed by intellij-monorepo-bot
parent 618dd1f40d
commit e310ef23f2
8 changed files with 26 additions and 21 deletions
@@ -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
@@ -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<PsiCallParameter>
) : DelegateArgumentMapping<PsiCallParameter>(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)
@@ -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<PsiCallParameter>
) : GroovyMethodCandidate {
override val receiverType: PsiType? get() = null
override val argumentMapping: ArgumentMapping<PsiCallParameter>? = GdkArgumentMapping(method, receiverArgument, originalMapping)
override val argumentMapping: ArgumentMapping<PsiCallParameter>? = GdkArgumentMapping(method, receiverArgument, context, originalMapping)
}
@@ -20,7 +20,7 @@ class MethodCandidateImpl(
override val argumentMapping: ArgumentMapping<PsiCallParameter>? by recursionAwareLazy {
arguments?.let {
MethodSignature(method, erasureSubstitutor).applyTo(it, context)
MethodSignature(method, erasureSubstitutor, context).applyTo(it, context)
}
}
}
@@ -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<PsiCallParameter> {
override val isVararg: Boolean by lazyPub {
@@ -22,7 +20,7 @@ internal class MethodSignature(
override val parameters: List<PsiCallParameter> by lazyPub {
method.parameterList.parameters.map { psi ->
PsiCallParameterImpl(psi, substitutor)
PsiCallParameterImpl(psi, substitutor, context)
}
}
@@ -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
}
}
@@ -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<Argument, CallParameter>, 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
@@ -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<CallSignature<*>> by lazyPub {
myMethodReference.resolve(false).mapNotNullTo(SmartList()) { result ->
(result.element as? PsiMethod)?.let {
MethodSignature(it, result.substitutor)
MethodSignature(it, result.substitutor, myMethodReference)
}
}
}