lazy eval of arguments for better "failed to evaluate" diagnostics

This commit is contained in:
Dmitry Jemerov
2010-02-08 21:08:39 +03:00
parent d12f5ecfc1
commit a6c5138cca
@@ -15,6 +15,7 @@
*/
package com.intellij.testAssistant;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.testFramework.UsefulTestCase;
@@ -37,14 +38,14 @@ public class TestDataReferenceCollector {
}
List<String> collectTestDataReferences(final PsiMethod method) {
final List<String> result = collectTestDataReferences(method, new HashMap<String, String>());
final List<String> result = collectTestDataReferences(method, new HashMap<String, Computable<String>>());
if (!myFoundTestDataParameters) {
myLogMessages.add("Found no parameters annotated with @TestDataFile");
}
return result;
}
private List<String> collectTestDataReferences(final PsiMethod method, final Map<String, String> argumentMap) {
private List<String> collectTestDataReferences(final PsiMethod method, final Map<String, Computable<String>> argumentMap) {
final List<String> result = new ArrayList<String>();
method.accept(new JavaRecursiveElementVisitor() {
@Override
@@ -73,34 +74,33 @@ public class TestDataReferenceCollector {
return result;
}
private void processCallArgument(PsiMethodCallExpression expression, Map<String, String> argumentMap, List<String> result, final int index) {
private void processCallArgument(PsiMethodCallExpression expression, Map<String, Computable<String>> argumentMap, List<String> result, final int index) {
final PsiExpression[] arguments = expression.getArgumentList().getExpressions();
if (arguments.length > index) {
String testDataFile = evaluate(arguments [index], argumentMap);
if (testDataFile != null) {
result.add(myTestDataPath + testDataFile);
}
else {
myLogMessages.add("Failed to evaluate " + arguments [index].getText());
}
}
}
private Map<String, String> buildArgumentMap(PsiMethodCallExpression expression, PsiMethod method) {
Map<String, String> result = new HashMap<String, String>();
private Map<String, Computable<String>> buildArgumentMap(PsiMethodCallExpression expression, PsiMethod method) {
Map<String, Computable<String>> result = new HashMap<String, Computable<String>>();
final PsiParameter[] parameters = method.getParameterList().getParameters();
final PsiExpression[] arguments = expression.getArgumentList().getExpressions();
for (int i = 0; i < arguments.length && i < parameters.length; i++) {
String value = evaluate(arguments [i], Collections.<String, String>emptyMap());
if (value != null) {
result.put(parameters [i].getName(), value);
}
final int finalI = i;
result.put(parameters [i].getName(), new Computable<String>() {
public String compute() {
return evaluate(arguments [finalI], Collections.<String, Computable<String>>emptyMap());
}
});
}
return result;
}
@Nullable
private String evaluate(PsiExpression expression, Map<String, String> arguments) {
private String evaluate(PsiExpression expression, Map<String, Computable<String>> arguments) {
if (expression instanceof PsiBinaryExpression) {
PsiBinaryExpression binaryExpression = (PsiBinaryExpression)expression;
if (binaryExpression.getOperationTokenType() == JavaTokenType.PLUS) {
@@ -121,7 +121,7 @@ public class TestDataReferenceCollector {
final PsiElement result = ((PsiReferenceExpression)expression).resolve();
if (result instanceof PsiParameter) {
final String name = ((PsiParameter)result).getName();
return arguments.get(name);
return arguments.get(name).compute();
}
if (result instanceof PsiVariable) {
final PsiExpression initializer = ((PsiVariable)result).getInitializer();
@@ -144,6 +144,7 @@ public class TestDataReferenceCollector {
}
}
}
myLogMessages.add("Failed to evaluate " + expression.getText());
return null;
}