Uast: guessCorrespondingParameter support for varargs (IDEA-CR-29257)

This commit is contained in:
Nicolay Mitropolsky
2018-02-13 18:24:49 +03:00
parent 326c9e58ae
commit 6969a5350d
2 changed files with 27 additions and 1 deletions
@@ -29,6 +29,27 @@ class TestDataFileReferenceTest : TestDataReferenceTestCase() {
assertResolvedTo(javaFile, "TestClass.java")
}
fun testDataFileResolveVarags() {
val testClass1 = myContentRootSubdir.writeChild("TestClass1.java", "some java code here")
val testClass2 = myContentRootSubdir.writeChild("TestClass2.java", "some java code here")
myFixture.configureByText("ATest.java", """
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase;
@com.intellij.testFramework.TestDataPath("${"\$"}CONTENT_ROOT/contentRootSubdir/")
public class ATest extends LightCodeInsightFixtureTestCase {
protected void doTest() {
configureByFiles("TestClass1.java", "TestClass2.java");
}
void configureByFiles(@com.intellij.testFramework.TestDataFile String... files){}
}
""".trimIndent())
assertResolvedTo(testClass1, "TestClass1.java")
assertResolvedTo(testClass2, "TestClass2.java")
}
}
@@ -184,7 +184,12 @@ fun guessCorrespondingParameter(callExpression: UCallExpression, arg: UExpressio
val parameters = psiMethod.parameterList.parameters
if (callExpression is UCallExpressionEx)
return parameters.withIndex().find { (i, _) -> callExpression.getArgumentForParameter(i) == arg }?.value
return parameters.withIndex().find { (i, p) ->
val argumentForParameter = callExpression.getArgumentForParameter(i) ?: return@find false
if (argumentForParameter == arg) return@find true
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 = callExpression.valueArguments.indexOf(arg)