From 47efd29972ed029a88ef422ef1f61aa7daab279d Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Thu, 3 Dec 2015 12:12:27 +0100 Subject: [PATCH] augmenting IDEA-148802 Java Scratch files debugging: debugger ignores breakpoints in module classes and doesn't show their sources --- .../debugger/engine/PositionManagerImpl.java | 83 ++++++++++--------- .../scratch/JavaScratchPositionManager.java | 66 ++++++++++++--- 2 files changed, 99 insertions(+), 50 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 92782de35e97..2ff73f42fe54 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) { } - return Collections.emptyList(); + throw NoDataException.INSTANCE; } public ClassPrepareRequest createPrepareRequest(@NotNull final ClassPrepareRequestor requestor, @NotNull final SourcePosition position) @@ -88,53 +88,58 @@ public class PositionManagerImpl implements PositionManager, MultiRequestPositio @Override public List createPrepareRequests(@NotNull final ClassPrepareRequestor requestor, @NotNull final SourcePosition position) throws NoDataException { - 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); - } + 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; } - }; - } - ClassPrepareRequest request = myDebugProcess.getRequestsManager().createClassPrepareRequest(prepareRequestor, classPattern); - if (request != null) { - res.add(request); + 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); + } } + return res; } - return res; - } - }); + }); + if (requests.isEmpty()) { + throw NoDataException.INSTANCE; + } + return requests; } @Nullable public SourcePosition getSourcePosition(final Location location) throws NoDataException { DebuggerManagerThreadImpl.assertIsManagerThread(); if(location == null) { - return null; + throw NoDataException.INSTANCE; } PsiFile psiFile = getPsiFileByLocation(getDebugProcess().getProject(), location); if(psiFile == null ) { - return null; + throw NoDataException.INSTANCE; } LOG.assertTrue(myDebugProcess != null); @@ -333,7 +338,7 @@ public class PositionManagerImpl implements PositionManager, MultiRequestPositio } @Nullable - protected PsiFile getPsiFileByLocation(final Project project, final Location location) throws NoDataException { + protected PsiFile getPsiFileByLocation(final Project project, final Location location) { if (location == null) { return null; } @@ -393,7 +398,7 @@ public class PositionManagerImpl implements PositionManager, MultiRequestPositio @NotNull public List getAllClasses(@NotNull final SourcePosition position) throws NoDataException { - return ApplicationManager.getApplication().runReadAction(new Computable>() { + final List allClasses = ApplicationManager.getApplication().runReadAction(new Computable>() { @Override public List compute() { List res = new ArrayList(); @@ -403,6 +408,10 @@ 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 58380e1b91d3..45071bc379e4 100644 --- a/java/execution/impl/src/com/intellij/execution/scratch/JavaScratchPositionManager.java +++ b/java/execution/impl/src/com/intellij/execution/scratch/JavaScratchPositionManager.java @@ -16,8 +16,10 @@ package com.intellij.execution.scratch; import com.intellij.debugger.NoDataException; +import com.intellij.debugger.SourcePosition; import com.intellij.debugger.engine.DebugProcessImpl; import com.intellij.debugger.engine.PositionManagerImpl; +import com.intellij.debugger.requests.ClassPrepareRequestor; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; @@ -27,8 +29,13 @@ import com.intellij.psi.PsiJavaFile; import com.intellij.psi.PsiManager; import com.sun.jdi.Location; import com.sun.jdi.ReferenceType; +import com.sun.jdi.request.ClassPrepareRequest; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Collections; +import java.util.List; + /** * @author Eugene Zhuravlev * Date: 11-Sep-15 @@ -41,7 +48,52 @@ public class JavaScratchPositionManager extends PositionManagerImpl{ myScratchFile = scratchFile; } - private PsiFile getScratchPsiFileByLocation(Project project, Location location) { + @NotNull + @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(); + } + } + + @NotNull + @Override + 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(); + } + } + + @NotNull + @Override + public List getAllClasses(@NotNull SourcePosition position) throws NoDataException { + checkPosition(position); + try { + return super.getAllClasses(position); + } + catch (NoDataException e) { + return Collections.emptyList(); + } + } + + private void checkPosition(@NotNull SourcePosition position) throws NoDataException{ + if (!myScratchFile.equals(position.getFile().getVirtualFile())) { + throw NoDataException.INSTANCE; + } + } + + @Nullable + @Override + protected PsiFile getPsiFileByLocation(Project project, Location location) { if (location == null) { return null; } @@ -77,16 +129,4 @@ public class JavaScratchPositionManager extends PositionManagerImpl{ return null; } - - @Nullable - @Override - protected PsiFile getPsiFileByLocation(Project project, Location location) throws NoDataException { - PsiFile file = getScratchPsiFileByLocation(project, location); - if (file != null) { - return file; - } - else { - throw NoDataException.INSTANCE; - } - } }