Uast: replacing most usages of resolveCallToDeclaration with resolveToPsiMethod

This commit is contained in:
Nicolay Mitropolsky
2020-04-01 12:54:32 +03:00
parent ab36e20b1b
commit c3977d7336
7 changed files with 16 additions and 13 deletions
@@ -48,7 +48,7 @@ class KotlinUBinaryExpression(
override val operatorIdentifier: UIdentifier?
get() = KotlinUIdentifier(sourcePsi.operationReference.getReferencedNameElement(), this)
override fun resolveOperator() = sourcePsi.operationReference.resolveCallToDeclaration() as? PsiMethod
override fun resolveOperator(): PsiMethod? = resolveToPsiMethod(sourcePsi)
override val operator = when (sourcePsi.operationToken) {
KtTokens.EQ -> UastBinaryOperator.ASSIGN
@@ -179,7 +179,7 @@ class KotlinUFunctionCallExpression(
return variants.flatMap {
when (val source = it.toSource()) {
is KtClass -> source.toLightClass()?.constructors?.asSequence().orEmpty()
else -> resolveSource(sourcePsi, it, source)?.let { sequenceOf(it) }.orEmpty()
else -> resolveToPsiMethod(sourcePsi, it, source)?.let { sequenceOf(it) }.orEmpty()
}
}.map { TypedResolveResult(it) }.asIterable()
})
@@ -189,8 +189,7 @@ class KotlinUFunctionCallExpression(
override fun resolve(): PsiMethod? {
val descriptor = resolvedCall?.resultingDescriptor ?: return null
val source = descriptor.toSource()
return resolveSource(sourcePsi, descriptor, source)
return resolveToPsiMethod(sourcePsi, descriptor)
}
override fun accept(visitor: UastVisitor) {
@@ -62,7 +62,7 @@ class KotlinUObjectLiteralExpression(
psi.typeArguments.map { it.typeReference.toPsiType(this, boxed = true) }
}
override fun resolve() = superClassConstructorCall?.resolveCallToDeclaration() as? PsiMethod
override fun resolve() = superClassConstructorCall?.let { resolveToPsiMethod(it) }
override fun getArgumentForParameter(i: Int): UExpression? =
superClassConstructorCall?.let { it.getResolvedCall(it.analyze()) }?.let { getArgumentExpressionByIndex(i, it, this) }
@@ -75,7 +75,7 @@ class KotlinUObjectLiteralExpression(
override val javaPsi: PsiElement? get() = null
override val psi: KtSuperTypeCallEntry get() = sourcePsi
override fun resolve() = (sourcePsi.resolveCallToDeclaration() as? PsiMethod)?.containingClass
override fun resolve() = resolveToPsiMethod(sourcePsi)?.containingClass
override val annotations: List<UAnnotation>
get() = emptyList()
@@ -40,7 +40,7 @@ class KotlinUPostfixExpression(
override val operatorIdentifier: UIdentifier?
get() = KotlinUIdentifier(sourcePsi.operationReference, this)
override fun resolveOperator() = sourcePsi.operationReference.resolveCallToDeclaration() as? PsiMethod
override fun resolveOperator(): PsiMethod? = resolveToPsiMethod(sourcePsi)
override fun resolve(): PsiMethod? = when (sourcePsi.operationToken) {
KtTokens.EXCLEXCL -> operand.tryResolve() as? PsiMethod
@@ -34,7 +34,7 @@ class KotlinUPrefixExpression(
override val operatorIdentifier: UIdentifier?
get() = KotlinUIdentifier(sourcePsi.operationReference, this)
override fun resolveOperator() = sourcePsi.operationReference.resolveCallToDeclaration() as? PsiMethod
override fun resolveOperator(): PsiMethod? = resolveToPsiMethod(sourcePsi)
override val operator = when (sourcePsi.operationToken) {
KtTokens.EXCL -> UastPrefixOperator.LOGICAL_NOT
@@ -187,10 +187,7 @@ open class KotlinUSimpleReferenceExpression(
override val kind: UastCallKind
get() = UastCallKind.METHOD_CALL
override fun resolve(): PsiMethod? {
val source = accessorDescriptor.toSource()
return resolveSource(sourcePsi, accessorDescriptor, source)
}
override fun resolve(): PsiMethod? = resolveToPsiMethod(sourcePsi, accessorDescriptor)
}
private fun KtExpression.readWriteAccess(): ReferenceAccess {
@@ -96,7 +96,14 @@ internal fun DeclarationDescriptor.toSource(): PsiElement? {
}
}
internal fun resolveSource(context: KtElement, descriptor: DeclarationDescriptor, source: PsiElement?): PsiMethod? {
internal fun resolveToPsiMethod(context: KtElement): PsiMethod? =
context.getResolvedCall(context.analyze())?.resultingDescriptor?.let { resolveToPsiMethod(context, it) }
internal fun resolveToPsiMethod(
context: KtElement,
descriptor: DeclarationDescriptor,
source: PsiElement? = descriptor.toSource()
): PsiMethod? {
if (descriptor is ConstructorDescriptor && descriptor.isPrimary
&& source is KtClassOrObject && source.primaryConstructor == null