From ad2cbbecc3e17963bbe15c631baf6ef4dc26bf99 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Thu, 3 Dec 2015 13:51:46 +0100 Subject: [PATCH] take 3: augmenting IDEA-148802 Java Scratch files debugging: debugger ignores breakpoints in module classes and doesn't show their sources --- .../debugger/engine/PositionManagerImpl.java | 81 +++++++++---------- .../scratch/JavaScratchPositionManager.java | 32 +++----- 2 files changed, 49 insertions(+), 64 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 2ff73f42fe54..6b2713e87a9b 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/PositionManagerImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/PositionManagerImpl.java @@ -76,7 +76,7 @@ public class PositionManagerImpl implements PositionManager, MultiRequestPositio } catch (AbsentInformationException ignored) { } - throw NoDataException.INSTANCE; + return Collections.emptyList(); } public ClassPrepareRequest createPrepareRequest(@NotNull final ClassPrepareRequestor requestor, @NotNull final SourcePosition position) @@ -88,58 +88,53 @@ public class PositionManagerImpl implements PositionManager, MultiRequestPositio @Override public List createPrepareRequests(@NotNull final ClassPrepareRequestor requestor, @NotNull final SourcePosition position) throws NoDataException { - final List requests = - ApplicationManager.getApplication().runReadAction(new Computable>() { - @Override - public List compute() { - List res = new ArrayList(); - for (PsiClass psiClass : getLineClasses(position.getFile(), position.getLine())) { - ClassPrepareRequestor prepareRequestor = requestor; - String classPattern = JVMNameUtil.getNonAnonymousClassName(psiClass); - if (classPattern == null) { - final PsiClass parent = JVMNameUtil.getTopLevelParentClass(psiClass); - if (parent == null) { - continue; - } - final String parentQName = JVMNameUtil.getNonAnonymousClassName(parent); - if (parentQName == null) { - continue; - } - classPattern = parentQName + "*"; - prepareRequestor = new ClassPrepareRequestor() { - public void processClassPrepare(DebugProcess debuggerProcess, ReferenceType referenceType) { - final CompoundPositionManager positionManager = ((DebugProcessImpl)debuggerProcess).getPositionManager(); - final List positionClasses = positionManager.getAllClasses(position); - if (positionClasses.contains(referenceType)) { - requestor.processClassPrepare(debuggerProcess, referenceType); - } + return ApplicationManager.getApplication().runReadAction(new Computable>() { + @Override + public List compute() { + List res = new ArrayList(); + for (PsiClass psiClass : getLineClasses(position.getFile(), position.getLine())) { + ClassPrepareRequestor prepareRequestor = requestor; + String classPattern = JVMNameUtil.getNonAnonymousClassName(psiClass); + if (classPattern == null) { + final PsiClass parent = JVMNameUtil.getTopLevelParentClass(psiClass); + if (parent == null) { + continue; + } + final String parentQName = JVMNameUtil.getNonAnonymousClassName(parent); + if (parentQName == null) { + continue; + } + classPattern = parentQName + "*"; + prepareRequestor = new ClassPrepareRequestor() { + public void processClassPrepare(DebugProcess debuggerProcess, ReferenceType referenceType) { + final CompoundPositionManager positionManager = ((DebugProcessImpl)debuggerProcess).getPositionManager(); + final List positionClasses = positionManager.getAllClasses(position); + if (positionClasses.contains(referenceType)) { + requestor.processClassPrepare(debuggerProcess, referenceType); } - }; - } - ClassPrepareRequest request = myDebugProcess.getRequestsManager().createClassPrepareRequest(prepareRequestor, classPattern); - if (request != null) { - res.add(request); - } + } + }; + } + ClassPrepareRequest request = myDebugProcess.getRequestsManager().createClassPrepareRequest(prepareRequestor, classPattern); + if (request != null) { + res.add(request); } - return res; } - }); - if (requests.isEmpty()) { - throw NoDataException.INSTANCE; - } - return requests; + return res; + } + }); } @Nullable public SourcePosition getSourcePosition(final Location location) throws NoDataException { DebuggerManagerThreadImpl.assertIsManagerThread(); if(location == null) { - throw NoDataException.INSTANCE; + return null; } PsiFile psiFile = getPsiFileByLocation(getDebugProcess().getProject(), location); if(psiFile == null ) { - throw NoDataException.INSTANCE; + return null; } LOG.assertTrue(myDebugProcess != null); @@ -398,7 +393,7 @@ public class PositionManagerImpl implements PositionManager, MultiRequestPositio @NotNull public List getAllClasses(@NotNull final SourcePosition position) throws NoDataException { - final List allClasses = ApplicationManager.getApplication().runReadAction(new Computable>() { + return ApplicationManager.getApplication().runReadAction(new Computable>() { @Override public List compute() { List res = new ArrayList(); @@ -408,10 +403,6 @@ public class PositionManagerImpl implements PositionManager, MultiRequestPositio return res; } }); - if (allClasses.isEmpty()) { - throw NoDataException.INSTANCE; - } - return allClasses; } private List getClassReferences(@NotNull final PsiClass psiClass, SourcePosition position) { diff --git a/java/execution/impl/src/com/intellij/execution/scratch/JavaScratchPositionManager.java b/java/execution/impl/src/com/intellij/execution/scratch/JavaScratchPositionManager.java index 45071bc379e4..43dc4b338a94 100644 --- a/java/execution/impl/src/com/intellij/execution/scratch/JavaScratchPositionManager.java +++ b/java/execution/impl/src/com/intellij/execution/scratch/JavaScratchPositionManager.java @@ -33,7 +33,6 @@ import com.sun.jdi.request.ClassPrepareRequest; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Collections; import java.util.List; /** @@ -52,12 +51,7 @@ public class JavaScratchPositionManager extends PositionManagerImpl{ @Override public List locationsOfLine(@NotNull ReferenceType type, @NotNull SourcePosition position) throws NoDataException { checkPosition(position); - try { - return super.locationsOfLine(type, position); - } - catch (NoDataException e) { - return Collections.emptyList(); - } + return super.locationsOfLine(type, position); } @NotNull @@ -65,24 +59,14 @@ public class JavaScratchPositionManager extends PositionManagerImpl{ public List createPrepareRequests(@NotNull ClassPrepareRequestor requestor, @NotNull SourcePosition position) throws NoDataException { checkPosition(position); - try { - return super.createPrepareRequests(requestor, position); - } - catch (NoDataException e) { - return Collections.emptyList(); - } + return super.createPrepareRequests(requestor, position); } @NotNull @Override public List getAllClasses(@NotNull SourcePosition position) throws NoDataException { checkPosition(position); - try { - return super.getAllClasses(position); - } - catch (NoDataException e) { - return Collections.emptyList(); - } + return super.getAllClasses(position); } private void checkPosition(@NotNull SourcePosition position) throws NoDataException{ @@ -91,6 +75,16 @@ public class JavaScratchPositionManager extends PositionManagerImpl{ } } + @Nullable + @Override + public SourcePosition getSourcePosition(Location location) throws NoDataException { + final SourcePosition position = super.getSourcePosition(location); + if (position == null) { + throw NoDataException.INSTANCE; // delegate to other managers + } + return position; + } + @Nullable @Override protected PsiFile getPsiFileByLocation(Project project, Location location) {