Skip to content

Commit afceb13

Browse files
Rawi01rspilker
authored andcommitted
[fixes #3373] Find references for extension methods
1 parent d56b576 commit afceb13

File tree

13 files changed

+184
-2
lines changed

13 files changed

+184
-2
lines changed

src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java

+7
Original file line numberDiff line numberDiff line change
@@ -918,6 +918,13 @@ private static void patchExtensionMethod(ScriptManager sm) {
918918
.request(StackRequest.THIS)
919919
.wrapMethod(new Hook(PATCH_EXTENSIONMETHOD_COMPLETIONPROPOSAL_PORTAL, "getJavaCompletionProposals", I_JAVA_COMPLETION_PROPOSAL_SIG, "java.lang.Object[]", "java.lang.Object"))
920920
.build());
921+
922+
sm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapReturnValue()
923+
.target(new MethodTarget("org.eclipse.jdt.core.search.SearchPattern", "createPattern", "org.eclipse.jdt.core.search.SearchPattern", "org.eclipse.jdt.core.IJavaElement", "int", "int"))
924+
.wrapMethod(new Hook(PATCH_EXTENSIONMETHOD, "modifyMethodPattern", "java.lang.Object", "java.lang.Object"))
925+
.cast()
926+
.request(StackRequest.RETURN_VALUE)
927+
.build());
921928
}
922929

923930
private static void patchNullCheck(ScriptManager sm) {

src/eclipseAgent/lombok/eclipse/agent/PatchExtensionMethod.java

+13
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import lombok.experimental.ExtensionMethod;
4444
import lombok.permit.Permit;
4545

46+
import org.eclipse.jdt.core.search.SearchPattern;
4647
import org.eclipse.jdt.internal.compiler.ast.ASTNode;
4748
import org.eclipse.jdt.internal.compiler.ast.Annotation;
4849
import org.eclipse.jdt.internal.compiler.ast.ClassLiteralAccess;
@@ -66,6 +67,7 @@
6667
import org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
6768
import org.eclipse.jdt.internal.compiler.lookup.TypeIds;
6869
import org.eclipse.jdt.internal.compiler.problem.ProblemReporter;
70+
import org.eclipse.jdt.internal.core.search.matching.MethodPattern;
6971

7072
public class PatchExtensionMethod {
7173
static class Extension {
@@ -378,6 +380,17 @@ public static TypeBinding resolveType(TypeBinding resolvedType, MessageSend meth
378380
MessageSend_postponedErrors.clear(methodCall);
379381
return resolvedType;
380382
}
383+
384+
public static SearchPattern modifyMethodPattern(SearchPattern original) {
385+
if (original != null && original instanceof MethodPattern) {
386+
MethodPattern methodPattern = (MethodPattern) original;
387+
if (methodPattern.parameterCount > 0) {
388+
methodPattern.varargs = true;
389+
}
390+
}
391+
392+
return original;
393+
}
381394

382395
private static boolean requiresPolyBinding(Expression argument) {
383396
return Reflection.isFunctionalExpression(argument) || argument instanceof ConditionalExpression && Reflection.isPolyExpression(argument);

src/eclipseAgent/lombok/launch/PatchFixesHider.java

+6
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,7 @@ public static final class ExtensionMethod {
344344
private static final Method ERROR_NO_METHOD_FOR;
345345
private static final Method INVALID_METHOD, INVALID_METHOD2;
346346
private static final Method NON_STATIC_ACCESS_TO_STATIC_METHOD;
347+
private static final Method MODIFY_METHOD_PATTERN;
347348

348349
static {
349350
Class<?> shadowed = Util.shadowLoadClass("lombok.eclipse.agent.PatchExtensionMethod");
@@ -352,6 +353,7 @@ public static final class ExtensionMethod {
352353
INVALID_METHOD = Util.findMethod(shadowed, "invalidMethod", PROBLEM_REPORTER_SIG, MESSAGE_SEND_SIG, METHOD_BINDING_SIG);
353354
INVALID_METHOD2 = Util.findMethod(shadowed, "invalidMethod", PROBLEM_REPORTER_SIG, MESSAGE_SEND_SIG, METHOD_BINDING_SIG, SCOPE_SIG);
354355
NON_STATIC_ACCESS_TO_STATIC_METHOD = Util.findMethod(shadowed, "nonStaticAccessToStaticMethod", PROBLEM_REPORTER_SIG, AST_NODE_SIG, METHOD_BINDING_SIG, MESSAGE_SEND_SIG);
356+
MODIFY_METHOD_PATTERN = Util.findMethod(shadowed, "modifyMethodPattern", "org.eclipse.jdt.core.search.SearchPattern");
355357
}
356358

357359
public static Object resolveType(Object resolvedType, Object methodCall, Object scope) {
@@ -373,6 +375,10 @@ public static void invalidMethod(Object problemReporter, Object messageSend, Obj
373375
public static void nonStaticAccessToStaticMethod(Object problemReporter, Object location, Object method, Object messageSend) {
374376
Util.invokeMethod(NON_STATIC_ACCESS_TO_STATIC_METHOD, problemReporter, location, method, messageSend);
375377
}
378+
379+
public static Object modifyMethodPattern(Object original) {
380+
return Util.invokeMethod(MODIFY_METHOD_PATTERN, original);
381+
}
376382
}
377383

378384
/** Contains patch code to support Javadoc for generated methods */
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package pkg;
2+
3+
public static class Extension {
4+
public static String test(String s) {
5+
return s;
6+
}
7+
8+
public static String test(String s, int i) {
9+
return s;
10+
}
11+
12+
public static String test(String s, String... s2) {
13+
return s;
14+
}
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package pkg;
2+
3+
import lombok.experimental.ExtensionMethod;
4+
5+
@ExtensionMethod(Extension.class)
6+
public class Usage {
7+
public void test() {
8+
private String string;
9+
string.test();
10+
string.test("a");
11+
string.test(1);
12+
}
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package pkg;
2+
3+
public static class Extension {
4+
public static String newTest(String s) {
5+
return s;
6+
}
7+
8+
public static String test(String s, int i) {
9+
return s;
10+
}
11+
12+
public static String test(String s, String... s2) {
13+
return s;
14+
}
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package pkg;
2+
3+
import lombok.experimental.ExtensionMethod;
4+
5+
@ExtensionMethod(Extension.class)
6+
public class Usage {
7+
public void test() {
8+
private String string;
9+
string.newTest();
10+
string.test("a");
11+
string.test(1);
12+
}
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package pkg;
2+
3+
public static class Extension {
4+
public static String test(String s) {
5+
return s;
6+
}
7+
8+
public static String test(String s, int i) {
9+
return s;
10+
}
11+
12+
public static String test(String s, String... s2) {
13+
return s;
14+
}
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package pkg;
2+
3+
import lombok.experimental.ExtensionMethod;
4+
5+
@ExtensionMethod(Extension.class)
6+
public class Usage {
7+
public void test() {
8+
private String string;
9+
string.test();
10+
string.test("a");
11+
string.test(1);
12+
}
13+
}

test/eclipse/src/lombok/eclipse/EclipseTests.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,10 @@
88
import lombok.eclipse.edit.SelectTest;
99
import lombok.eclipse.refactoring.ExtractInterfaceTest;
1010
import lombok.eclipse.refactoring.RenameTest;
11+
import lombok.eclipse.references.FindReferencesTest;
1112

1213
@RunWith(Suite.class)
13-
@SuiteClasses({ExtractInterfaceTest.class, RenameTest.class, SelectTest.class, CleanupTest.class})
14+
@SuiteClasses({ExtractInterfaceTest.class, RenameTest.class, SelectTest.class, CleanupTest.class, FindReferencesTest.class})
1415
public class EclipseTests {
1516

1617
}

test/eclipse/src/lombok/eclipse/SetupBeforeAfterTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ protected void starting(Description description) {
3232
protected void succeeded(Description description) {
3333
try {
3434
compareWithAfter();
35-
} catch (Throwable e) {
35+
} catch (Exception e) {
3636
throw new RuntimeException(e);
3737
}
3838
}

test/eclipse/src/lombok/eclipse/refactoring/RenameTest.java

+15
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,11 @@
44

55
import org.eclipse.jdt.core.ICompilationUnit;
66
import org.eclipse.jdt.core.IField;
7+
import org.eclipse.jdt.core.IMethod;
78
import org.eclipse.jdt.core.IType;
89
import org.eclipse.jdt.internal.corext.refactoring.rename.RenameFieldProcessor;
10+
import org.eclipse.jdt.internal.corext.refactoring.rename.RenameMethodProcessor;
11+
import org.eclipse.jdt.internal.corext.refactoring.rename.RenameNonVirtualMethodProcessor;
912
import org.junit.Rule;
1013
import org.junit.Test;
1114
import org.junit.runner.RunWith;
@@ -68,4 +71,16 @@ public void builderField() throws Exception {
6871

6972
performRefactoring(renameFieldProcessor);
7073
}
74+
75+
@Test
76+
public void extensionMethod() throws Exception {
77+
ICompilationUnit cu = setup.getPackageFragment().getCompilationUnit("Extension.java");
78+
IType type = cu.findPrimaryType();
79+
IMethod method = type.getMethods()[0];
80+
81+
RenameMethodProcessor renameMethodProcessor = new RenameNonVirtualMethodProcessor(method);
82+
renameMethodProcessor.setNewElementName("newTest");
83+
84+
performRefactoring(renameMethodProcessor);
85+
}
7186
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package lombok.eclipse.references;
2+
3+
import static org.junit.Assert.*;
4+
5+
import java.util.List;
6+
7+
import org.eclipse.core.runtime.CoreException;
8+
import org.eclipse.jdt.core.ICompilationUnit;
9+
import org.eclipse.jdt.core.IJavaElement;
10+
import org.eclipse.jdt.core.IType;
11+
import org.eclipse.jdt.core.JavaModelException;
12+
import org.eclipse.jdt.core.search.IJavaSearchConstants;
13+
import org.eclipse.jdt.core.search.SearchEngine;
14+
import org.eclipse.jdt.core.search.SearchMatch;
15+
import org.eclipse.jdt.core.search.SearchParticipant;
16+
import org.eclipse.jdt.core.search.SearchPattern;
17+
import org.eclipse.jdt.internal.corext.refactoring.CollectingSearchRequestor;
18+
import org.junit.Rule;
19+
import org.junit.Test;
20+
import org.junit.runner.RunWith;
21+
22+
import lombok.eclipse.EclipseRunner;
23+
import lombok.eclipse.SetupSingleFileTest;
24+
25+
@RunWith(EclipseRunner.class)
26+
public class FindReferencesTest {
27+
28+
@Rule
29+
public SetupSingleFileTest setup = new SetupSingleFileTest();
30+
31+
@Test
32+
public void extensionMethod() throws Exception {
33+
ICompilationUnit extensionCu = setup.getPackageFragment().getCompilationUnit("Extension.java");
34+
IType type = extensionCu.findPrimaryType();
35+
List<SearchMatch> firstResult = searchInProject(type.getMethods()[0]);
36+
assertEquals(firstResult.size(), 2);
37+
38+
ICompilationUnit usageCu = setup.getPackageFragment().getCompilationUnit("Usage.java");
39+
List<SearchMatch> secondResult = searchInProject(usageCu.codeSelect(170, 0)[0]);
40+
assertEquals(secondResult.size(), 2);
41+
}
42+
43+
private List<SearchMatch> searchInProject(IJavaElement element) throws CoreException, JavaModelException {
44+
CollectingSearchRequestor requestor = new CollectingSearchRequestor();
45+
SearchEngine engine = new SearchEngine();
46+
engine.search(
47+
SearchPattern.createPattern(element, IJavaSearchConstants.ALL_OCCURRENCES, SearchPattern.R_EXACT_MATCH),
48+
new SearchParticipant[] { SearchEngine.getDefaultSearchParticipant() },
49+
SearchEngine.createJavaSearchScope(new IJavaElement[] { setup.getJavaProject() }),
50+
requestor,
51+
null
52+
);
53+
54+
return requestor.getResults();
55+
}
56+
}

0 commit comments

Comments
 (0)