From c2f72ca178456a9ff0819eccf0cf99c81ee2e95c Mon Sep 17 00:00:00 2001 From: andxu Date: Mon, 26 Mar 2018 10:37:47 +0800 Subject: [PATCH 1/5] fix an error when main class is not specified, evaluation doesn't work. --- .../java/debug/plugin/internal/eval/JdtEvaluationProvider.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/eval/JdtEvaluationProvider.java b/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/eval/JdtEvaluationProvider.java index 76644c5b9..b848307a3 100644 --- a/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/eval/JdtEvaluationProvider.java +++ b/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/eval/JdtEvaluationProvider.java @@ -189,7 +189,7 @@ private void findJavaProjectByStackFrame(ThreadReference thread, int depth) { List validProjects = visitedClassNames.contains(typeName) ? projectCandidates : projectCandidates.stream().filter(p -> { try { - return !visitedClassNames.contains(typeName) && p.findType(typeName) != null; + return p.findType(typeName) != null; } catch (Exception e) { // ignore } @@ -198,6 +198,7 @@ private void findJavaProjectByStackFrame(ThreadReference thread, int depth) { visitedClassNames.add(typeName); if (validProjects.size() == 1) { project = validProjects.get(0); + return; } else if (validProjects.size() == 0) { logger.severe("No project is available for evaluation."); throw new IllegalStateException("No project is available for evaluation, ."); From 29a6d87d82359afa3a55dc4b736330cf976758f3 Mon Sep 17 00:00:00 2001 From: andxu Date: Mon, 26 Mar 2018 11:24:10 +0800 Subject: [PATCH 2/5] move the last logic corresponding to error in catch block. --- .../debug/plugin/internal/eval/JdtEvaluationProvider.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/eval/JdtEvaluationProvider.java b/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/eval/JdtEvaluationProvider.java index b848307a3..0fa8a5c50 100644 --- a/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/eval/JdtEvaluationProvider.java +++ b/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/eval/JdtEvaluationProvider.java @@ -210,11 +210,9 @@ private void findJavaProjectByStackFrame(ThreadReference thread, int depth) { } } catch (Exception ex) { - // ignore + logger.severe("Cannot evaluate when the project is not specified."); + throw new IllegalStateException("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."); } From 21543eb14c878f30a6e499c525dc6cb24eb82df2 Mon Sep 17 00:00:00 2001 From: andxu Date: Mon, 26 Mar 2018 12:17:32 +0800 Subject: [PATCH 3/5] avoid the thrown exception to be eaten by catch --- .../internal/eval/JdtEvaluationProvider.java | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/eval/JdtEvaluationProvider.java b/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/eval/JdtEvaluationProvider.java index 0fa8a5c50..ebecfbcd5 100644 --- a/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/eval/JdtEvaluationProvider.java +++ b/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/eval/JdtEvaluationProvider.java @@ -181,12 +181,13 @@ private void findJavaProjectByStackFrame(ThreadReference thread, int depth) { logger.severe("No project is available for evaluation."); throw new IllegalStateException("No project is available for evaluation."); } + List validProjects; try { StackFrame sf = thread.frame(depth); String typeName = sf.location().method().declaringType().name(); // narrow down candidate projects by current class - List validProjects = visitedClassNames.contains(typeName) ? projectCandidates + validProjects = visitedClassNames.contains(typeName) ? projectCandidates : projectCandidates.stream().filter(p -> { try { return p.findType(typeName) != null; @@ -196,23 +197,26 @@ private void findJavaProjectByStackFrame(ThreadReference thread, int depth) { return false; }).collect(Collectors.toList()); visitedClassNames.add(typeName); - if (validProjects.size() == 1) { - project = validProjects.get(0); - return; - } 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."); - } - } catch (Exception ex) { logger.severe("Cannot evaluate when the project is not specified."); throw new IllegalStateException("Please specify projectName in launch.json."); } + + if (validProjects.size() == 1) { + project = validProjects.get(0); + return; + } + + 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."); + } + } From 688d7e274e92fa5c2dda62a52dd2b2a2fbc58810 Mon Sep 17 00:00:00 2001 From: andxu Date: Wed, 28 Mar 2018 10:56:31 +0800 Subject: [PATCH 4/5] redefine user readable error message --- .../internal/eval/JdtEvaluationProvider.java | 71 ++++++++----------- 1 file changed, 28 insertions(+), 43 deletions(-) diff --git a/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/eval/JdtEvaluationProvider.java b/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/eval/JdtEvaluationProvider.java index 2dd846893..e035b4bf3 100644 --- a/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/eval/JdtEvaluationProvider.java +++ b/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/eval/JdtEvaluationProvider.java @@ -139,7 +139,7 @@ public CompletableFuture evaluate(String expression, ThreadReference thre */ private void initializeProjectCandidates(String mainclass) { IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); - List 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) { @@ -149,72 +149,57 @@ 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 findJavaProjectByStackFrame(ThreadReference thread, int depth) { + 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 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."); } - List validProjects; + try { StackFrame sf = thread.frame(depth); String typeName = sf.location().method().declaringType().name(); // narrow down candidate projects by current class - validProjects = visitedClassNames.contains(typeName) ? projectCandidates - : projectCandidates.stream().filter(p -> { - try { - return p.findType(typeName) != null; - } catch (Exception e) { - // ignore - } - return false; - }).collect(Collectors.toList()); - visitedClassNames.add(typeName); + filterProjectCandidatesByClass(typeName); } catch (Exception ex) { - logger.severe("Cannot evaluate when the project is not specified."); - throw new IllegalStateException("Please specify projectName in launch.json."); + 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 (validProjects.size() == 1) { - project = validProjects.get(0); - return; + if (projectCandidates.size() == 1) { + return projectCandidates.get(0); } - if (validProjects.size() == 0) { + 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."); } 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."); + throw new IllegalStateException("Cannot evaluate, please specify projectName in launch.json."); } } @@ -294,7 +279,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) { From 69f75751c52d337e0a75721642d12e52e6c6d6fe Mon Sep 17 00:00:00 2001 From: andxu Date: Wed, 28 Mar 2018 10:58:23 +0800 Subject: [PATCH 5/5] redefine user readable error message --- .../debug/plugin/internal/eval/JdtEvaluationProvider.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/eval/JdtEvaluationProvider.java b/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/eval/JdtEvaluationProvider.java index e035b4bf3..38faecc0c 100644 --- a/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/eval/JdtEvaluationProvider.java +++ b/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/plugin/internal/eval/JdtEvaluationProvider.java @@ -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; @@ -164,8 +163,8 @@ private void filterProjectCandidatesByClass(String className) { } return false; }).collect(Collectors.toList()); - visitedClassNames.add(className); - } + visitedClassNames.add(className); + } private IJavaProject findJavaProjectByStackFrame(ThreadReference thread, int depth) { if (projectCandidates == null) {