diff --git a/uast/uast-common/src/com/intellij/patterns/uast/UastPatterns.kt b/uast/uast-common/src/com/intellij/patterns/uast/UastPatterns.kt index 910fbf55dd78..2fb81d39c10e 100644 --- a/uast/uast-common/src/com/intellij/patterns/uast/UastPatterns.kt +++ b/uast/uast-common/src/com/intellij/patterns/uast/UastPatterns.kt @@ -77,7 +77,7 @@ private val constructorOrMethodCall = setOf(UastCallKind.CONSTRUCTOR_CALL, UastC private fun isCallExpressionParameter(argumentExpression: UExpression, parameterIndex: Int, callPattern: ElementPattern): 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) } diff --git a/uast/uast-common/src/org/jetbrains/uast/UastUtils.kt b/uast/uast-common/src/org/jetbrains/uast/UastUtils.kt index 56d579238365..f1415a26605e 100644 --- a/uast/uast-common/src/org/jetbrains/uast/UastUtils.kt +++ b/uast/uast-common/src/org/jetbrains/uast/UastUtils.kt @@ -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 } diff --git a/uast/uast-tests/test/org/jetbrains/uast/test/java/JavaUastApiTest.kt b/uast/uast-tests/test/org/jetbrains/uast/test/java/JavaUastApiTest.kt index a5a5784d4342..26a9b12c69b9 100644 --- a/uast/uast-tests/test/org/jetbrains/uast/test/java/JavaUastApiTest.kt +++ b/uast/uast-tests/test/org/jetbrains/uast/test/java/JavaUastApiTest.kt @@ -111,7 +111,6 @@ class JavaUastApiTest : AbstractJavaUastTest() { doTest("Simple/CallExpression.java") { _, file -> fun assertArguments(argumentsInPositionalOrder: List?, refText: String) = file.findElementByTextFromPsi(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 {