From f3a7a1e6ca790b7e59b307a831973c784dd668d9 Mon Sep 17 00:00:00 2001 From: Gayan Perera Date: Tue, 2 Aug 2022 20:24:10 +0200 Subject: [PATCH] improve lambda discovery This will handle lambda blocks and convert inline to line breakpoints if if line and lambda block first line doesn't match. --- .../com/microsoft/java/debug/core/Breakpoint.java | 12 ++++++++---- .../java/debug/LambdaExpressionLocator.java | 10 ++-------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/Breakpoint.java b/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/Breakpoint.java index a81968ad3..ac6453472 100644 --- a/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/Breakpoint.java +++ b/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/Breakpoint.java @@ -248,7 +248,8 @@ private static List collectLocations(List refTypes, int return locations; } - private static List collectLocations(List refTypes, String nameAndSignature) { + private static List collectLocations(List refTypes, + String nameAndSignature, int line) { List locations = new ArrayList<>(); String[] segments = nameAndSignature.split("#"); @@ -257,6 +258,7 @@ private static List collectLocations(List refTypes, Str for (Method method : methods) { if (!method.isAbstract() && !method.isNative() && segments[0].equals(method.name()) + && method.location().lineNumber() == line && (segments[1].equals(method.genericSignature()) || segments[1].equals(method.signature()))) { locations.add(method.location()); break; @@ -275,10 +277,12 @@ private List createBreakpointRequests(ReferenceType refType, private List createBreakpointRequests(List refTypes, int lineNumber, int hitCount, boolean includeNestedTypes) { - List locations; + List locations = null; if (this.methodSignature != null) { - locations = collectLocations(refTypes, this.methodSignature); - } else { + locations = collectLocations(refTypes, this.methodSignature, lineNumber); + } + + if (locations == null || locations.isEmpty()) { locations = collectLocations(refTypes, lineNumber, includeNestedTypes); } diff --git a/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/LambdaExpressionLocator.java b/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/LambdaExpressionLocator.java index 364ddb1ec..eada8b48a 100644 --- a/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/LambdaExpressionLocator.java +++ b/com.microsoft.java.debug.plugin/src/main/java/com/microsoft/java/debug/LambdaExpressionLocator.java @@ -36,12 +36,8 @@ public LambdaExpressionLocator(CompilationUnit compilationUnit, int line, int co public boolean visit(LambdaExpression node) { if (column > -1) { int startPosition = node.getStartPosition(); - - int startColumn = this.compilationUnit.getColumnNumber(startPosition); int endPosition = startPosition + node.getLength(); - int endColumn = this.compilationUnit.getColumnNumber(endPosition); - int startLine = this.compilationUnit.getLineNumber(startPosition); - int endLine = this.compilationUnit.getLineNumber(endPosition); + int offset = this.compilationUnit.getPosition(line, column); // lambda on same line: // list.stream().map(i -> i + 1); @@ -50,9 +46,7 @@ public boolean visit(LambdaExpression node) { // list.stream().map(user // -> user.isSystem() ? new SystemUser(user) : new EndUser(user)); - if ((startLine == endLine && column >= startColumn && column <= endColumn && line == startLine) - || (startLine != endLine && line >= startLine && line <= endLine - && (column >= startColumn || column <= endColumn))) { + if (offset >= startPosition && offset <= endPosition) { this.lambdaMethodBinding = node.resolveMethodBinding(); this.found = true; this.lambdaExpression = node;