From e14e9137aa95c2a5baa707660310978a1b0fa66c Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Thu, 6 Mar 2014 17:54:52 +0400 Subject: [PATCH] IDEA-121739 Debugger doesn't stop on breakpoints in some anonymous classes --- .../debugger/engine/PositionManagerImpl.java | 34 +++++++++++++++++-- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/PositionManagerImpl.java b/java/debugger/impl/src/com/intellij/debugger/engine/PositionManagerImpl.java index cd6944c31952..b3e371d7e327 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/PositionManagerImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/PositionManagerImpl.java @@ -29,7 +29,6 @@ import com.intellij.openapi.util.NullableComputable; import com.intellij.openapi.util.Ref; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; -import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.sun.jdi.AbsentInformationException; import com.sun.jdi.Location; @@ -258,14 +257,43 @@ public class PositionManagerImpl implements PositionManager { private static int getNestingDepth(PsiClass aClass) { int depth = 0; - PsiClass enclosing = PsiTreeUtil.getParentOfType(aClass, PsiClass.class, true); + PsiClass enclosing = getEnclosingClass(aClass); while (enclosing != null) { depth++; - enclosing = PsiTreeUtil.getParentOfType(enclosing, PsiClass.class, true); + enclosing = getEnclosingClass(enclosing); } return depth; } + /** + * See IDEA-121739 + * Anonymous classes inside other anonymous class parameters list should belong to parent class + * Inner in = new Inner(new Inner2(){}) {}; + * Parent of Inner2 sub class here is not Inner sub class + */ + private static PsiClass getEnclosingClass(PsiElement element) { + if (element == null) { + return null; + } + + element = element.getParent(); + PsiElement previous = null; + + while (element != null) { + if (PsiClass.class.isInstance(element) && !(previous instanceof PsiExpressionList)) { + //noinspection unchecked + return (PsiClass)element; + } + if (element instanceof PsiFile) { + return null; + } + previous = element; + element = element.getParent(); + } + + return null; + } + @Nullable private ReferenceType findNested(final ReferenceType fromClass, final int currentDepth, final PsiClass classToFind, final int requiredDepth, final SourcePosition position) { final VirtualMachineProxyImpl vmProxy = myDebugProcess.getVirtualMachineProxy();