From 0f7f4e0fad99fba39414e09d2e136eebe5d207fd Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Fri, 25 Oct 2013 14:13:55 +0200 Subject: [PATCH] fixing method collecting visitor for smart step: only arguments of method call expression were visited --- .../actions/JavaSmartStepIntoHandler.java | 64 ++++++++++++------- 1 file changed, 42 insertions(+), 22 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/actions/JavaSmartStepIntoHandler.java b/java/debugger/impl/src/com/intellij/debugger/actions/JavaSmartStepIntoHandler.java index f99990fe5a6c..2fe2cc3508e2 100644 --- a/java/debugger/impl/src/com/intellij/debugger/actions/JavaSmartStepIntoHandler.java +++ b/java/debugger/impl/src/com/intellij/debugger/actions/JavaSmartStepIntoHandler.java @@ -78,12 +78,14 @@ public class JavaSmartStepIntoHandler extends JvmSmartStepIntoHandler { //noinspection unchecked final List targets = new OrderedSet(); + final PsiElementVisitor methodCollector = new JavaRecursiveElementVisitor() { + final Stack myContextStack = new Stack(); final Stack myParamNameStack = new Stack(); @Nullable private String getCurrentParamName() { - return myParamNameStack.size() > 0? myParamNameStack.peek(): null; + return myParamNameStack.isEmpty() ? null : myParamNameStack.peek(); } @Override @@ -100,37 +102,55 @@ public class JavaSmartStepIntoHandler extends JvmSmartStepIntoHandler { } } - @Override - public void visitCallExpression(final PsiCallExpression expression) { - final PsiMethod psiMethod = expression.resolveMethod(); + public void visitExpressionList(PsiExpressionList expressionList) { + final PsiMethod psiMethod = myContextStack.isEmpty()? null : myContextStack.peek(); if (psiMethod != null) { - final PsiElement highlightElement = expression instanceof PsiMethodCallExpression? - ((PsiMethodCallExpression)expression).getMethodExpression().getReferenceNameElement() : null; - targets.add(new StepTarget(psiMethod, null, highlightElement, false)); - final PsiExpressionList argList = expression.getArgumentList(); - if (argList != null) { - final String methodName = psiMethod.getName(); - final PsiExpression[] expressions = argList.getExpressions(); - final PsiParameter[] parameters = psiMethod.getParameterList().getParameters(); - for (int idx = 0; idx < expressions.length; idx++) { - final String paramName = (idx < parameters.length && !parameters[idx].isVarArgs())? parameters[idx].getName() : "arg"+(idx+1); - myParamNameStack.push(methodName + ": " + paramName + "."); - final PsiExpression argExpression = expressions[idx]; - try { - argExpression.accept(this); - } - finally { - myParamNameStack.pop(); - } + final String methodName = psiMethod.getName(); + final PsiExpression[] expressions = expressionList.getExpressions(); + final PsiParameter[] parameters = psiMethod.getParameterList().getParameters(); + for (int idx = 0; idx < expressions.length; idx++) { + final String paramName = (idx < parameters.length && !parameters[idx].isVarArgs())? parameters[idx].getName() : "arg"+(idx+1); + myParamNameStack.push(methodName + ": " + paramName + "."); + final PsiExpression argExpression = expressions[idx]; + try { + argExpression.accept(this); + } + finally { + myParamNameStack.pop(); } } } else { + super.visitExpressionList(expressionList); + } + } + + @Override + public void visitCallExpression(final PsiCallExpression expression) { + final PsiMethod psiMethod = expression.resolveMethod(); + if (psiMethod != null) { + myContextStack.push(psiMethod); + targets.add(new StepTarget( + psiMethod, + null, + expression instanceof PsiMethodCallExpression? + ((PsiMethodCallExpression)expression).getMethodExpression().getReferenceNameElement() + : expression instanceof PsiNewExpression? ((PsiNewExpression)expression).getClassOrAnonymousClassReference() : expression, + false + )); + } + try { super.visitCallExpression(expression); } + finally { + if (psiMethod != null) { + myContextStack.pop(); + } + } } }; + element.accept(methodCollector); for (PsiElement sibling = element.getNextSibling(); sibling != null; sibling = sibling.getNextSibling()) { if (!lineRange.intersects(sibling.getTextRange())) {