diff options
13 files changed, 184 insertions, 2 deletions
diff --git a/src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java b/src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java index c0bfbe09..aa548af0 100644 --- a/src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java +++ b/src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java @@ -918,6 +918,13 @@ public class EclipsePatcher implements AgentLauncher.AgentLaunchable { .request(StackRequest.THIS) .wrapMethod(new Hook(PATCH_EXTENSIONMETHOD_COMPLETIONPROPOSAL_PORTAL, "getJavaCompletionProposals", I_JAVA_COMPLETION_PROPOSAL_SIG, "java.lang.Object[]", "java.lang.Object")) .build()); + + sm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapReturnValue() + .target(new MethodTarget("org.eclipse.jdt.core.search.SearchPattern", "createPattern", "org.eclipse.jdt.core.search.SearchPattern", "org.eclipse.jdt.core.IJavaElement", "int", "int")) + .wrapMethod(new Hook(PATCH_EXTENSIONMETHOD, "modifyMethodPattern", "java.lang.Object", "java.lang.Object")) + .cast() + .request(StackRequest.RETURN_VALUE) + .build()); } private static void patchNullCheck(ScriptManager sm) { diff --git a/src/eclipseAgent/lombok/eclipse/agent/PatchExtensionMethod.java b/src/eclipseAgent/lombok/eclipse/agent/PatchExtensionMethod.java index 7743f9c6..9b2bde60 100644 --- a/src/eclipseAgent/lombok/eclipse/agent/PatchExtensionMethod.java +++ b/src/eclipseAgent/lombok/eclipse/agent/PatchExtensionMethod.java @@ -43,6 +43,7 @@ import lombok.eclipse.handlers.EclipseHandlerUtil; import lombok.experimental.ExtensionMethod; import lombok.permit.Permit; +import org.eclipse.jdt.core.search.SearchPattern; import org.eclipse.jdt.internal.compiler.ast.ASTNode; import org.eclipse.jdt.internal.compiler.ast.Annotation; import org.eclipse.jdt.internal.compiler.ast.ClassLiteralAccess; @@ -66,6 +67,7 @@ import org.eclipse.jdt.internal.compiler.lookup.Scope; import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; import org.eclipse.jdt.internal.compiler.lookup.TypeIds; import org.eclipse.jdt.internal.compiler.problem.ProblemReporter; +import org.eclipse.jdt.internal.core.search.matching.MethodPattern; public class PatchExtensionMethod { static class Extension { @@ -378,6 +380,17 @@ public class PatchExtensionMethod { MessageSend_postponedErrors.clear(methodCall); return resolvedType; } + + public static SearchPattern modifyMethodPattern(SearchPattern original) { + if (original != null && original instanceof MethodPattern) { + MethodPattern methodPattern = (MethodPattern) original; + if (methodPattern.parameterCount > 0) { + methodPattern.varargs = true; + } + } + + return original; + } private static boolean requiresPolyBinding(Expression argument) { return Reflection.isFunctionalExpression(argument) || argument instanceof ConditionalExpression && Reflection.isPolyExpression(argument); diff --git a/src/eclipseAgent/lombok/launch/PatchFixesHider.java b/src/eclipseAgent/lombok/launch/PatchFixesHider.java index 5404ee1d..3a8a6b88 100755 --- a/src/eclipseAgent/lombok/launch/PatchFixesHider.java +++ b/src/eclipseAgent/lombok/launch/PatchFixesHider.java @@ -344,6 +344,7 @@ final class PatchFixesHider { private static final Method ERROR_NO_METHOD_FOR; private static final Method INVALID_METHOD, INVALID_METHOD2; private static final Method NON_STATIC_ACCESS_TO_STATIC_METHOD; + private static final Method MODIFY_METHOD_PATTERN; static { Class<?> shadowed = Util.shadowLoadClass("lombok.eclipse.agent.PatchExtensionMethod"); @@ -352,6 +353,7 @@ final class PatchFixesHider { INVALID_METHOD = Util.findMethod(shadowed, "invalidMethod", PROBLEM_REPORTER_SIG, MESSAGE_SEND_SIG, METHOD_BINDING_SIG); INVALID_METHOD2 = Util.findMethod(shadowed, "invalidMethod", PROBLEM_REPORTER_SIG, MESSAGE_SEND_SIG, METHOD_BINDING_SIG, SCOPE_SIG); NON_STATIC_ACCESS_TO_STATIC_METHOD = Util.findMethod(shadowed, "nonStaticAccessToStaticMethod", PROBLEM_REPORTER_SIG, AST_NODE_SIG, METHOD_BINDING_SIG, MESSAGE_SEND_SIG); + MODIFY_METHOD_PATTERN = Util.findMethod(shadowed, "modifyMethodPattern", "org.eclipse.jdt.core.search.SearchPattern"); } public static Object resolveType(Object resolvedType, Object methodCall, Object scope) { @@ -373,6 +375,10 @@ final class PatchFixesHider { public static void nonStaticAccessToStaticMethod(Object problemReporter, Object location, Object method, Object messageSend) { Util.invokeMethod(NON_STATIC_ACCESS_TO_STATIC_METHOD, problemReporter, location, method, messageSend); } + + public static Object modifyMethodPattern(Object original) { + return Util.invokeMethod(MODIFY_METHOD_PATTERN, original); + } } /** Contains patch code to support Javadoc for generated methods */ diff --git a/test/eclipse/resource/findreferences/extensionMethod/Extension.java b/test/eclipse/resource/findreferences/extensionMethod/Extension.java new file mode 100644 index 00000000..6f1f22e8 --- /dev/null +++ b/test/eclipse/resource/findreferences/extensionMethod/Extension.java @@ -0,0 +1,15 @@ +package pkg; + +public static class Extension { + public static String test(String s) { + return s; + } + + public static String test(String s, int i) { + return s; + } + + public static String test(String s, String... s2) { + return s; + } +}
\ No newline at end of file diff --git a/test/eclipse/resource/findreferences/extensionMethod/Usage.java b/test/eclipse/resource/findreferences/extensionMethod/Usage.java new file mode 100644 index 00000000..becaaea9 --- /dev/null +++ b/test/eclipse/resource/findreferences/extensionMethod/Usage.java @@ -0,0 +1,13 @@ +package pkg; + +import lombok.experimental.ExtensionMethod; + +@ExtensionMethod(Extension.class) +public class Usage { + public void test() { + private String string; + string.test(); + string.test("a"); + string.test(1); + } +}
\ No newline at end of file diff --git a/test/eclipse/resource/rename/extensionMethod/after/Extension.java b/test/eclipse/resource/rename/extensionMethod/after/Extension.java new file mode 100644 index 00000000..8735bfa7 --- /dev/null +++ b/test/eclipse/resource/rename/extensionMethod/after/Extension.java @@ -0,0 +1,15 @@ +package pkg; + +public static class Extension { + public static String newTest(String s) { + return s; + } + + public static String test(String s, int i) { + return s; + } + + public static String test(String s, String... s2) { + return s; + } +}
\ No newline at end of file diff --git a/test/eclipse/resource/rename/extensionMethod/after/Usage.java b/test/eclipse/resource/rename/extensionMethod/after/Usage.java new file mode 100644 index 00000000..c7ddf613 --- /dev/null +++ b/test/eclipse/resource/rename/extensionMethod/after/Usage.java @@ -0,0 +1,13 @@ +package pkg; + +import lombok.experimental.ExtensionMethod; + +@ExtensionMethod(Extension.class) +public class Usage { + public void test() { + private String string; + string.newTest(); + string.test("a"); + string.test(1); + } +}
\ No newline at end of file diff --git a/test/eclipse/resource/rename/extensionMethod/before/Extension.java b/test/eclipse/resource/rename/extensionMethod/before/Extension.java new file mode 100644 index 00000000..6f1f22e8 --- /dev/null +++ b/test/eclipse/resource/rename/extensionMethod/before/Extension.java @@ -0,0 +1,15 @@ +package pkg; + +public static class Extension { + public static String test(String s) { + return s; + } + + public static String test(String s, int i) { + return s; + } + + public static String test(String s, String... s2) { + return s; + } +}
\ No newline at end of file diff --git a/test/eclipse/resource/rename/extensionMethod/before/Usage.java b/test/eclipse/resource/rename/extensionMethod/before/Usage.java new file mode 100644 index 00000000..becaaea9 --- /dev/null +++ b/test/eclipse/resource/rename/extensionMethod/before/Usage.java @@ -0,0 +1,13 @@ +package pkg; + +import lombok.experimental.ExtensionMethod; + +@ExtensionMethod(Extension.class) +public class Usage { + public void test() { + private String string; + string.test(); + string.test("a"); + string.test(1); + } +}
\ No newline at end of file diff --git a/test/eclipse/src/lombok/eclipse/EclipseTests.java b/test/eclipse/src/lombok/eclipse/EclipseTests.java index ba017fd2..b293b8ae 100644 --- a/test/eclipse/src/lombok/eclipse/EclipseTests.java +++ b/test/eclipse/src/lombok/eclipse/EclipseTests.java @@ -8,9 +8,10 @@ import lombok.eclipse.cleanup.CleanupTest; import lombok.eclipse.edit.SelectTest; import lombok.eclipse.refactoring.ExtractInterfaceTest; import lombok.eclipse.refactoring.RenameTest; +import lombok.eclipse.references.FindReferencesTest; @RunWith(Suite.class) -@SuiteClasses({ExtractInterfaceTest.class, RenameTest.class, SelectTest.class, CleanupTest.class}) +@SuiteClasses({ExtractInterfaceTest.class, RenameTest.class, SelectTest.class, CleanupTest.class, FindReferencesTest.class}) public class EclipseTests { } diff --git a/test/eclipse/src/lombok/eclipse/SetupBeforeAfterTest.java b/test/eclipse/src/lombok/eclipse/SetupBeforeAfterTest.java index 96e21d4b..05deabde 100644 --- a/test/eclipse/src/lombok/eclipse/SetupBeforeAfterTest.java +++ b/test/eclipse/src/lombok/eclipse/SetupBeforeAfterTest.java @@ -32,7 +32,7 @@ public class SetupBeforeAfterTest extends SetupTest { protected void succeeded(Description description) { try { compareWithAfter(); - } catch (Throwable e) { + } catch (Exception e) { throw new RuntimeException(e); } } diff --git a/test/eclipse/src/lombok/eclipse/refactoring/RenameTest.java b/test/eclipse/src/lombok/eclipse/refactoring/RenameTest.java index c1a86736..fe7136a7 100644 --- a/test/eclipse/src/lombok/eclipse/refactoring/RenameTest.java +++ b/test/eclipse/src/lombok/eclipse/refactoring/RenameTest.java @@ -4,8 +4,11 @@ import static lombok.eclipse.RefactoringUtils.performRefactoring; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IField; +import org.eclipse.jdt.core.IMethod; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.internal.corext.refactoring.rename.RenameFieldProcessor; +import org.eclipse.jdt.internal.corext.refactoring.rename.RenameMethodProcessor; +import org.eclipse.jdt.internal.corext.refactoring.rename.RenameNonVirtualMethodProcessor; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -68,4 +71,16 @@ public class RenameTest { performRefactoring(renameFieldProcessor); } + + @Test + public void extensionMethod() throws Exception { + ICompilationUnit cu = setup.getPackageFragment().getCompilationUnit("Extension.java"); + IType type = cu.findPrimaryType(); + IMethod method = type.getMethods()[0]; + + RenameMethodProcessor renameMethodProcessor = new RenameNonVirtualMethodProcessor(method); + renameMethodProcessor.setNewElementName("newTest"); + + performRefactoring(renameMethodProcessor); + } } diff --git a/test/eclipse/src/lombok/eclipse/references/FindReferencesTest.java b/test/eclipse/src/lombok/eclipse/references/FindReferencesTest.java new file mode 100644 index 00000000..a4668088 --- /dev/null +++ b/test/eclipse/src/lombok/eclipse/references/FindReferencesTest.java @@ -0,0 +1,56 @@ +package lombok.eclipse.references; + +import static org.junit.Assert.*; + +import java.util.List; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.jdt.core.ICompilationUnit; +import org.eclipse.jdt.core.IJavaElement; +import org.eclipse.jdt.core.IType; +import org.eclipse.jdt.core.JavaModelException; +import org.eclipse.jdt.core.search.IJavaSearchConstants; +import org.eclipse.jdt.core.search.SearchEngine; +import org.eclipse.jdt.core.search.SearchMatch; +import org.eclipse.jdt.core.search.SearchParticipant; +import org.eclipse.jdt.core.search.SearchPattern; +import org.eclipse.jdt.internal.corext.refactoring.CollectingSearchRequestor; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import lombok.eclipse.EclipseRunner; +import lombok.eclipse.SetupSingleFileTest; + +@RunWith(EclipseRunner.class) +public class FindReferencesTest { + + @Rule + public SetupSingleFileTest setup = new SetupSingleFileTest(); + + @Test + public void extensionMethod() throws Exception { + ICompilationUnit extensionCu = setup.getPackageFragment().getCompilationUnit("Extension.java"); + IType type = extensionCu.findPrimaryType(); + List<SearchMatch> firstResult = searchInProject(type.getMethods()[0]); + assertEquals(firstResult.size(), 2); + + ICompilationUnit usageCu = setup.getPackageFragment().getCompilationUnit("Usage.java"); + List<SearchMatch> secondResult = searchInProject(usageCu.codeSelect(170, 0)[0]); + assertEquals(secondResult.size(), 2); + } + + private List<SearchMatch> searchInProject(IJavaElement element) throws CoreException, JavaModelException { + CollectingSearchRequestor requestor = new CollectingSearchRequestor(); + SearchEngine engine = new SearchEngine(); + engine.search( + SearchPattern.createPattern(element, IJavaSearchConstants.ALL_OCCURRENCES, SearchPattern.R_EXACT_MATCH), + new SearchParticipant[] { SearchEngine.getDefaultSearchParticipant() }, + SearchEngine.createJavaSearchScope(new IJavaElement[] { setup.getJavaProject() }), + requestor, + null + ); + + return requestor.getResults(); + } +} |