From a6c5138ccaa4c9190791d99bb07da2a2fa5f527b Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Mon, 8 Feb 2010 21:08:39 +0300 Subject: [PATCH] lazy eval of arguments for better "failed to evaluate" diagnostics --- .../TestDataReferenceCollector.java | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/plugins/IdeaTestAssistant/src/com/intellij/testAssistant/TestDataReferenceCollector.java b/plugins/IdeaTestAssistant/src/com/intellij/testAssistant/TestDataReferenceCollector.java index d66b38ccff37..bb6e69ccf27e 100644 --- a/plugins/IdeaTestAssistant/src/com/intellij/testAssistant/TestDataReferenceCollector.java +++ b/plugins/IdeaTestAssistant/src/com/intellij/testAssistant/TestDataReferenceCollector.java @@ -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 collectTestDataReferences(final PsiMethod method) { - final List result = collectTestDataReferences(method, new HashMap()); + final List result = collectTestDataReferences(method, new HashMap>()); if (!myFoundTestDataParameters) { myLogMessages.add("Found no parameters annotated with @TestDataFile"); } return result; } - private List collectTestDataReferences(final PsiMethod method, final Map argumentMap) { + private List collectTestDataReferences(final PsiMethod method, final Map> argumentMap) { final List result = new ArrayList(); method.accept(new JavaRecursiveElementVisitor() { @Override @@ -73,34 +74,33 @@ public class TestDataReferenceCollector { return result; } - private void processCallArgument(PsiMethodCallExpression expression, Map argumentMap, List result, final int index) { + private void processCallArgument(PsiMethodCallExpression expression, Map> argumentMap, List 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 buildArgumentMap(PsiMethodCallExpression expression, PsiMethod method) { - Map result = new HashMap(); + private Map> buildArgumentMap(PsiMethodCallExpression expression, PsiMethod method) { + Map> result = new HashMap>(); 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.emptyMap()); - if (value != null) { - result.put(parameters [i].getName(), value); - } + final int finalI = i; + result.put(parameters [i].getName(), new Computable() { + public String compute() { + return evaluate(arguments [finalI], Collections.>emptyMap()); + } + }); } return result; } @Nullable - private String evaluate(PsiExpression expression, Map arguments) { + private String evaluate(PsiExpression expression, Map> 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; }