Uast: removing deprecated UCallExpressionEx usages

GitOrigin-RevId: b350a2a0be59f19e52f7c78e38583a7ddaf729e5
This commit is contained in:
Nicolay Mitropolsky
2019-04-28 17:10:15 +03:00
committed by intellij-monorepo-bot
parent 68b91cc1bd
commit 2ea59b6b6d
3 changed files with 8 additions and 27 deletions
@@ -77,7 +77,7 @@ private val constructorOrMethodCall = setOf(UastCallKind.CONSTRUCTOR_CALL, UastC
private fun isCallExpressionParameter(argumentExpression: UExpression,
parameterIndex: Int,
callPattern: ElementPattern<UCallExpression>): Boolean {
val call = argumentExpression.uastParent.getUCallExpression(searchLimit = 2) as? UCallExpressionEx ?: return false
val call = argumentExpression.uastParent.getUCallExpression(searchLimit = 2) ?: return false
if (call.kind !in constructorOrMethodCall) return false
return call.getArgumentForParameter(parameterIndex) == unwrapPolyadic(argumentExpression) && callPattern.accepts(call)
}
@@ -206,29 +206,11 @@ fun UCallExpression.getParameterForArgument(arg: UExpression): PsiParameter? {
val psiMethod = resolve() ?: return null
val parameters = psiMethod.parameterList.parameters
if (this is UCallExpressionEx)
return parameters.withIndex().find { (i, p) ->
val argumentForParameter = getArgumentForParameter(i) ?: return@find false
if (argumentForParameter == arg) return@find true
if (arg is ULambdaExpression && arg.sourcePsi?.parent == argumentForParameter.sourcePsi) return@find true // workaround for KT-25297
if (p.isVarArgs && argumentForParameter is UExpressionList) return@find argumentForParameter.expressions.contains(arg)
return@find false
}?.value
// not everyone implements UCallExpressionEx, lets try to guess
val indexInArguments = valueArguments.indexOf(arg)
if (parameters.size == valueArguments.count()) {
return parameters.getOrNull(indexInArguments)
}
// probably it is a kotlin extension method
if (parameters.size - 1 == valueArguments.count()) {
val parameter = parameters.firstOrNull() ?: return null
val receiverType = receiverType ?: return null
if (!parameter.type.isAssignableFrom(receiverType)) return null
if (!parameters.drop(1).zip(valueArguments)
.all { (param, arg) -> arg.getExpressionType()?.let { param.type.isAssignableFrom(it) } == true }) return null
return parameters.getOrNull(indexInArguments + 1)
}
//named parameters are not processed
return null
return parameters.withIndex().find { (i, p) ->
val argumentForParameter = getArgumentForParameter(i) ?: return@find false
if (argumentForParameter == arg) return@find true
if (arg is ULambdaExpression && arg.sourcePsi?.parent == argumentForParameter.sourcePsi) return@find true // workaround for KT-25297
if (p.isVarArgs && argumentForParameter is UExpressionList) return@find argumentForParameter.expressions.contains(arg)
return@find false
}?.value
}
@@ -111,7 +111,6 @@ class JavaUastApiTest : AbstractJavaUastTest() {
doTest("Simple/CallExpression.java") { _, file ->
fun assertArguments(argumentsInPositionalOrder: List<String?>?, refText: String) =
file.findElementByTextFromPsi<UCallExpression>(refText).let { call ->
if (call !is UCallExpressionEx) throw AssertionError("${call.javaClass} is not a UCallExpressionEx")
Assert.assertEquals(
argumentsInPositionalOrder, call.resolve()?.let { psiMethod ->
(0 until psiMethod.parameterList.parametersCount).map {