take 3: 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 13:53:34 +01:00
parent e7f0a87213
commit ad2cbbecc3
2 changed files with 49 additions and 64 deletions
@@ -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<ClassPrepareRequest> createPrepareRequests(@NotNull final ClassPrepareRequestor requestor, @NotNull final SourcePosition position)
throws NoDataException {
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;
}
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);
}
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);
}
};
}
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<ReferenceType> getAllClasses(@NotNull final SourcePosition position) throws NoDataException {
final List<ReferenceType> allClasses = ApplicationManager.getApplication().runReadAction(new Computable<List<ReferenceType>>() {
return ApplicationManager.getApplication().runReadAction(new Computable<List<ReferenceType>>() {
@Override
public List<ReferenceType> compute() {
List<ReferenceType> res = new ArrayList<ReferenceType>();
@@ -408,10 +403,6 @@ 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) {
@@ -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<Location> 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<ClassPrepareRequest> 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<ReferenceType> 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) {