Skip to content

Commit ee309ea

Browse files
committed
Improve matching LambdaExpression
1 parent 7d2a151 commit ee309ea

File tree

4 files changed

+38
-1
lines changed

4 files changed

+38
-1
lines changed

org.eclipse.jdt.core.javac/src/org/eclipse/jdt/internal/core/search/DOMASTNodeUtils.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ public static IJavaElement getLocalJavaElement(ASTNode node) {
108108
|| node instanceof CompilationUnit
109109
|| node instanceof AnnotationTypeMemberDeclaration
110110
|| node instanceof Initializer
111+
|| node instanceof LambdaExpression
111112
|| node.getLocationInParent() == FieldDeclaration.FRAGMENTS_PROPERTY) {
112113
return getEnclosingJavaElement(node);
113114
}

org.eclipse.jdt.core.javac/src/org/eclipse/jdt/internal/core/search/DOMJavaSearchDelegate.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@
3434
import org.eclipse.core.runtime.CoreException;
3535
import org.eclipse.core.runtime.ILog;
3636
import org.eclipse.core.runtime.NullProgressMonitor;
37+
import org.eclipse.jdt.core.IBuffer;
3738
import org.eclipse.jdt.core.IClassFile;
39+
import org.eclipse.jdt.core.ICompilationUnit;
3840
import org.eclipse.jdt.core.IJavaElement;
3941
import org.eclipse.jdt.core.IJavaModelStatusConstants;
4042
import org.eclipse.jdt.core.IJavaProject;
@@ -61,6 +63,7 @@
6163
import org.eclipse.jdt.core.dom.IPackageBinding;
6264
import org.eclipse.jdt.core.dom.ITypeBinding;
6365
import org.eclipse.jdt.core.dom.IVariableBinding;
66+
import org.eclipse.jdt.core.dom.LambdaExpression;
6467
import org.eclipse.jdt.core.dom.MethodDeclaration;
6568
import org.eclipse.jdt.core.dom.MethodInvocation;
6669
import org.eclipse.jdt.core.dom.MethodRef;
@@ -469,6 +472,29 @@ private SearchMatch toCoreMatch(MatchLocator locator, org.eclipse.jdt.core.dom.A
469472
return new TypeParameterReferenceMatch(element, accuracy, nodeTP.getName().getStartPosition(),
470473
nodeTP.getName().getLength(), DOMASTNodeUtils.insideDocComment(node), getParticipant(locator), resource);
471474
}
475+
if (node instanceof LambdaExpression lambda) {
476+
IJavaElement enclosing = DOMASTNodeUtils.getLocalJavaElement(node);
477+
IMethodBinding mb = lambda.resolveMethodBinding();
478+
boolean isSynthetic = mb != null && mb.isSynthetic();
479+
int arrowEnd = lambda.getBody().getStartPosition() - 1;
480+
try {
481+
if (enclosing != null && enclosing.getAncestor(IJavaElement.COMPILATION_UNIT) instanceof ICompilationUnit unit) {
482+
IBuffer buffer = unit.getBuffer();
483+
while (arrowEnd > 0 && buffer.getChar(arrowEnd) != '>') {
484+
arrowEnd--;
485+
}
486+
arrowEnd++;
487+
}
488+
} catch (JavaModelException ex) {
489+
ILog.get().error(ex.getMessage(), ex);
490+
}
491+
var res = new MethodReferenceMatch(enclosing, accuracy, lambda.getStartPosition(),
492+
arrowEnd - lambda.getStartPosition(), false,
493+
isSynthetic, (accuracy & PatternLocator.SUPER_INVOCATION_FLAVOR) != 0, insideDocComment(node), getParticipant(locator), resource);
494+
res.setRaw(mb != null && mb.isRawMethod());
495+
res.setLocalElement(DOMASTNodeUtils.getLocalJavaElement(node));
496+
return res;
497+
}
472498
if (node instanceof Name name) {
473499
IBinding b = name.resolveBinding();
474500
IJavaElement enclosing = DOMASTNodeUtils.getEnclosingJavaElement(node);

org.eclipse.jdt.core.javac/src/org/eclipse/jdt/internal/core/search/PatternLocatorVisitor.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.eclipse.jdt.core.dom.IBinding;
3636
import org.eclipse.jdt.core.dom.ImportDeclaration;
3737
import org.eclipse.jdt.core.dom.IntersectionType;
38+
import org.eclipse.jdt.core.dom.LambdaExpression;
3839
import org.eclipse.jdt.core.dom.MemberValuePair;
3940
import org.eclipse.jdt.core.dom.MethodDeclaration;
4041
import org.eclipse.jdt.core.dom.MethodInvocation;
@@ -186,6 +187,10 @@ public boolean visit(RecordDeclaration node) {
186187
public boolean visit(AnonymousClassDeclaration node) {
187188
return defaultVisitImplementation(node, (x,y) -> y.match(node, this.nodeSet, this.locator));
188189
}
190+
@Override
191+
public boolean visit(LambdaExpression node) {
192+
return defaultVisitImplementation(node, (x,y) -> y.match(node, this.nodeSet, this.locator));
193+
}
189194

190195
private boolean visitType(Type node) {
191196
LocatorResponse resp = defaultVisitImplementationWithFunc(node, (x,y) -> y.match(node, this.nodeSet, this.locator), DOMASTNodeUtils::getBinding);

org.eclipse.jdt.core.javac/src/org/eclipse/jdt/internal/core/search/matching/DOMMethodLocator.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import org.eclipse.jdt.core.dom.ITypeBinding;
3939
import org.eclipse.jdt.core.dom.IVariableBinding;
4040
import org.eclipse.jdt.core.dom.JdtCoreDomPackagePrivateUtility;
41+
import org.eclipse.jdt.core.dom.LambdaExpression;
4142
import org.eclipse.jdt.core.dom.MemberValuePair;
4243
import org.eclipse.jdt.core.dom.MethodDeclaration;
4344
import org.eclipse.jdt.core.dom.MethodInvocation;
@@ -1158,7 +1159,6 @@ public void reportSearchMatch(MatchLocator locator, ASTNode node, SearchMatch ma
11581159
SearchMatchingUtility.reportSearchMatch(locator, match);
11591160
}
11601161

1161-
11621162
private boolean preferParamaterizedNode() {
11631163
int patternRule = this.locator.pattern.getMatchRule();
11641164
boolean patternIsErasureMatch = isPatternErasureMatch();
@@ -1176,4 +1176,9 @@ private boolean preferParamaterizedNode() {
11761176
}
11771177
return true;
11781178
}
1179+
1180+
@Override
1181+
public LocatorResponse match(LambdaExpression node, NodeSetWrapper nodeSet, MatchLocator locator) {
1182+
return toResponse(this.locator.pattern.parameterCount == node.parameters().size() ? POSSIBLE_MATCH : IMPOSSIBLE_MATCH);
1183+
}
11791184
}

0 commit comments

Comments
 (0)