augmenting IDEA-148802 Java Scratch files debugging: debugger ignores breakpoints in module classes and doesn't show their sources

This commit is contained in:
Eugene Zhuravlev
2015-12-03 12:14:44 +01:00
parent ce62f8ca65
commit 47efd29972
2 changed files with 99 additions and 50 deletions
@@ -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<ClassPrepareRequest> createPrepareRequests(@NotNull final ClassPrepareRequestor requestor, @NotNull final SourcePosition position)
throws NoDataException {
return ApplicationManager.getApplication().runReadAction(new Computable<List<ClassPrepareRequest>>() {
@Override
public List<ClassPrepareRequest> compute() {
List<ClassPrepareRequest> res = new ArrayList<ClassPrepareRequest>();
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<ReferenceType> positionClasses = positionManager.getAllClasses(position);
if (positionClasses.contains(referenceType)) {
requestor.processClassPrepare(debuggerProcess, referenceType);
}
final List<ClassPrepareRequest> requests =
ApplicationManager.getApplication().runReadAction(new Computable<List<ClassPrepareRequest>>() {
@Override
public List<ClassPrepareRequest> compute() {
List<ClassPrepareRequest> res = new ArrayList<ClassPrepareRequest>();
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<ReferenceType> 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<ReferenceType> getAllClasses(@NotNull final SourcePosition position) throws NoDataException {
return ApplicationManager.getApplication().runReadAction(new Computable<List<ReferenceType>>() {
final List<ReferenceType> allClasses = ApplicationManager.getApplication().runReadAction(new Computable<List<ReferenceType>>() {
@Override
public List<ReferenceType> compute() {
List<ReferenceType> res = new ArrayList<ReferenceType>();
@@ -403,6 +408,10 @@ public class PositionManagerImpl implements PositionManager, MultiRequestPositio
return res;
}
});
if (allClasses.isEmpty()) {
throw NoDataException.INSTANCE;
}
return allClasses;
}
private List<ReferenceType> getClassReferences(@NotNull final PsiClass psiClass, SourcePosition position) {
@@ -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<Location> 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<ClassPrepareRequest> 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<ReferenceType> 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;
}
}
}