Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@
import org.eclipse.debug.core.sourcelookup.AbstractSourceLookupDirector;
import org.eclipse.debug.core.sourcelookup.containers.ProjectSourceContainer;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.debug.core.IJavaStackFrame;
import org.eclipse.jdt.debug.eval.ICompiledExpression;
import org.eclipse.jdt.internal.debug.core.model.JDIDebugTarget;
Expand Down Expand Up @@ -139,7 +138,7 @@ public CompletableFuture<Value> evaluate(String expression, ThreadReference thre
*/
private void initializeProjectCandidates(String mainclass) {
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
List<IJavaProject> projects = Arrays.stream(root.getProjects()).map(JdtUtils::getJavaProject).filter(p -> {
projectCandidates = Arrays.stream(root.getProjects()).map(JdtUtils::getJavaProject).filter(p -> {
try {
return p != null && p.hasBuildState();
} catch (Exception e) {
Expand All @@ -149,71 +148,59 @@ private void initializeProjectCandidates(String mainclass) {
}).collect(Collectors.toList());


if (projects.size() > 1 && StringUtils.isNotBlank(mainclass)) {
projects = Arrays.stream(root.getProjects()).map(JdtUtils::getJavaProject).filter(p -> {
try {
return p.findType(mainclass) != null;
} catch (JavaModelException e) {
// ignore
}
return false;
}).collect(Collectors.toList());
visitedClassNames.add(mainclass);
}

if (projects.size() == 1) {
project = projects.get(0);
if (StringUtils.isNotBlank(mainclass)) {
filterProjectCandidatesByClass(mainclass);
}
}

projectCandidates = projects;
private void filterProjectCandidatesByClass(String className) {
projectCandidates = visitedClassNames.contains(className) ? projectCandidates
: projectCandidates.stream().filter(p -> {
try {
return p.findType(className) != null;
} catch (Exception e) {
// ignore
}
return false;
}).collect(Collectors.toList());
visitedClassNames.add(className);
}

private void findJavaProjectByStackFrame(ThreadReference thread, int depth) {
private IJavaProject findJavaProjectByStackFrame(ThreadReference thread, int depth) {
if (projectCandidates == null) {
// initial candidate projects by main class (projects contains this main class)
initializeProjectCandidates((String) options.get(Constants.MAIN_CLASS));
if (project != null) {
return;
}
}

if (projectCandidates.size() == 0) {
logger.severe("No project is available for evaluation.");
throw new IllegalStateException("No project is available for evaluation.");
throw new IllegalStateException("Cannot evaluate, please specify projectName in launch.json.");
}


try {
StackFrame sf = thread.frame(depth);
String typeName = sf.location().method().declaringType().name();
// narrow down candidate projects by current class
List<IJavaProject> validProjects = visitedClassNames.contains(typeName) ? projectCandidates
: projectCandidates.stream().filter(p -> {
try {
return !visitedClassNames.contains(typeName) && p.findType(typeName) != null;
} catch (Exception e) {
// ignore
}
return false;
}).collect(Collectors.toList());
visitedClassNames.add(typeName);
if (validProjects.size() == 1) {
project = validProjects.get(0);
} else if (validProjects.size() == 0) {
logger.severe("No project is available for evaluation.");
throw new IllegalStateException("No project is available for evaluation, .");
} else {
// narrow down projects
projectCandidates = validProjects;
logger.severe("Multiple projects are valid for evaluation.");
throw new IllegalStateException("Multiple projects are found, please specify projectName in launch.json.");
}

filterProjectCandidatesByClass(typeName);
} catch (Exception ex) {
// ignore
logger.severe("Cannot evaluate when the project is not specified, due to exception: " + ex.getMessage());
throw new IllegalStateException("Cannot evaluate, please specify projectName in launch.json.");
}

if (projectCandidates.size() == 1) {
return projectCandidates.get(0);
}

if (projectCandidates.size() == 0) {
logger.severe("No project is available for evaluation.");
throw new IllegalStateException("Cannot evaluate, please specify projectName in launch.json.");
} else {
// narrow down projects
logger.severe("Multiple projects are valid for evaluation.");
throw new IllegalStateException("Cannot evaluate, please specify projectName in launch.json.");
}

logger.severe("Cannot evaluate when the project is not specified.");
throw new IllegalStateException("Please specify projectName in launch.json.");
}


Expand Down Expand Up @@ -291,7 +278,7 @@ private void ensureDebugTarget(VirtualMachine vm, ThreadReference thread, int de
if (project == null) {
String projectName = (String) options.get(Constants.PROJECT_NAME);
if (StringUtils.isBlank(projectName)) {
findJavaProjectByStackFrame(thread, depth);
project = findJavaProjectByStackFrame(thread, depth);
} else {
IJavaProject javaProject = JdtUtils.getJavaProject(projectName);
if (javaProject == null) {
Expand Down