From 98cdf67ed6846580e8e4e77391fd48f3293603f6 Mon Sep 17 00:00:00 2001 From: Rawi01 Date: Sat, 9 Mar 2024 11:39:23 +0100 Subject: [PATCH] Javadoc support for eclipse 2024-03 --- .../lombok/eclipse/agent/EclipsePatcher.java | 8 ++++ .../lombok/eclipse/agent/PatchJavadoc.java | 42 ++++++++++++------- .../lombok/launch/PatchFixesHider.java | 8 +++- .../src/lombok/eclipse/misc/JavadocTest.java | 13 ++++-- 4 files changed, 51 insertions(+), 20 deletions(-) diff --git a/src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java b/src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java index c176f515..12060ffb 100644 --- a/src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java +++ b/src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java @@ -967,6 +967,14 @@ public class EclipsePatcher implements AgentLauncher.AgentLaunchable { } private static void patchJavadoc(ScriptManager sm) { + // Moved to new package and changed to instance method in 2024-03 + sm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapMethodCall() + .target(new MethodTarget("org.eclipse.jdt.core.manipulation.internal.javadoc.CoreJavadocAccess", "getHTMLContent", "java.lang.String", "org.eclipse.jdt.core.IJavaElement", "boolean")) + .methodToWrap(new Hook("org.eclipse.jdt.core.manipulation.internal.javadoc.CoreJavadocAccess", "getHTMLContentFromSource", "java.lang.String", "org.eclipse.jdt.core.IJavaElement")) + .wrapMethod(new Hook("lombok.launch.PatchFixesHider$Javadoc", "getHTMLContentFromSource", "java.lang.String", "java.lang.String", "java.lang.Object", "org.eclipse.jdt.core.IJavaElement")) + .requestExtra(StackRequest.THIS, StackRequest.PARAM1) + .build()); + sm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapMethodCall() .target(new MethodTarget("org.eclipse.jdt.internal.ui.text.javadoc.JavadocContentAccess2", "getHTMLContent", "java.lang.String", "org.eclipse.jdt.core.IJavaElement", "boolean")) .methodToWrap(new Hook("org.eclipse.jdt.internal.ui.text.javadoc.JavadocContentAccess2", "getHTMLContentFromSource", "java.lang.String", "org.eclipse.jdt.core.IJavaElement")) diff --git a/src/eclipseAgent/lombok/eclipse/agent/PatchJavadoc.java b/src/eclipseAgent/lombok/eclipse/agent/PatchJavadoc.java index 38b69bf7..caa94e2f 100644 --- a/src/eclipseAgent/lombok/eclipse/agent/PatchJavadoc.java +++ b/src/eclipseAgent/lombok/eclipse/agent/PatchJavadoc.java @@ -37,7 +37,7 @@ import lombok.permit.Permit; public class PatchJavadoc { - public static String getHTMLContentFromSource(String original, Object member) { + public static String getHTMLContentFromSource(Object instance, String original, Object member) { if (original != null) { return original; } @@ -54,7 +54,7 @@ public class PatchJavadoc { String rawJavadoc = docs.get(signature); if (rawJavadoc == null) return null; - return Reflection.javadoc2HTML((IMember) member, (IJavaElement) member, rawJavadoc); + return Reflection.javadoc2HTML(instance, (IMember) member, (IJavaElement) member, rawJavadoc); } } @@ -85,9 +85,10 @@ public class PatchJavadoc { private static class Reflection { private static final Method javadoc2HTML; private static final Method oldJavadoc2HTML; + private static final Method reallyOldJavadoc2HTML; private static final Method lsJavadoc2HTML; static { - Method a = null, b = null, c = null; + Method a = null, b = null, c = null, d = null; try { a = Permit.getMethod(JavadocContentAccess2.class, "javadoc2HTML", IMember.class, IJavaElement.class, String.class); @@ -98,30 +99,41 @@ public class PatchJavadoc { try { c = Permit.getMethod(Class.forName("org.eclipse.jdt.ls.core.internal.javadoc.JavadocContentAccess2"), "javadoc2HTML", IMember.class, IJavaElement.class, String.class); } catch (Throwable t) {} + try { + d = Permit.getMethod(Class.forName("org.eclipse.jdt.core.manipulation.internal.javadoc.CoreJavadocAccess"), "javadoc2HTML", IMember.class, IJavaElement.class, String.class); + } catch (Throwable t) {} - javadoc2HTML = a; - oldJavadoc2HTML = b; + oldJavadoc2HTML = a; + reallyOldJavadoc2HTML = b; lsJavadoc2HTML = c; + javadoc2HTML = d; } - private static String javadoc2HTML(IMember member, IJavaElement element, String rawJavadoc) { + private static String javadoc2HTML(Object instance, IMember member, IJavaElement element, String rawJavadoc) { if (javadoc2HTML != null) { try { - return (String) javadoc2HTML.invoke(null, member, element, rawJavadoc); - } catch (Throwable t) { - return null; - } - } - if (lsJavadoc2HTML != null) { - try { - return (String) lsJavadoc2HTML.invoke(null, member, element, rawJavadoc); + return (String) javadoc2HTML.invoke(instance, member, element, rawJavadoc); } catch (Throwable t) { return null; } } if (oldJavadoc2HTML != null) { try { - return (String) oldJavadoc2HTML.invoke(null, member, rawJavadoc); + return (String) oldJavadoc2HTML.invoke(instance, member, element, rawJavadoc); + } catch (Throwable t) { + return null; + } + } + if (lsJavadoc2HTML != null) { + try { + return (String) lsJavadoc2HTML.invoke(instance, member, element, rawJavadoc); + } catch (Throwable t) { + return null; + } + } + if (reallyOldJavadoc2HTML != null) { + try { + return (String) reallyOldJavadoc2HTML.invoke(instance, member, rawJavadoc); } catch (Throwable t) { return null; } diff --git a/src/eclipseAgent/lombok/launch/PatchFixesHider.java b/src/eclipseAgent/lombok/launch/PatchFixesHider.java index 74bb0b8a..84a0cf3d 100755 --- a/src/eclipseAgent/lombok/launch/PatchFixesHider.java +++ b/src/eclipseAgent/lombok/launch/PatchFixesHider.java @@ -435,11 +435,15 @@ final class PatchFixesHider { static { Class shadowed = Util.shadowLoadClass("lombok.eclipse.agent.PatchJavadoc"); - GET_HTML = Util.findMethod(shadowed, "getHTMLContentFromSource", String.class, Object.class); + GET_HTML = Util.findMethod(shadowed, "getHTMLContentFromSource", Object.class, String.class, Object.class); } public static String getHTMLContentFromSource(String original, IJavaElement member) { - return (String) Util.invokeMethod(GET_HTML, original, member); + return (String) Util.invokeMethod(GET_HTML, null, original, member); + } + + public static String getHTMLContentFromSource(String original, Object instance, IJavaElement member) { + return (String) Util.invokeMethod(GET_HTML, instance, original, member); } } diff --git a/test/eclipse/src/lombok/eclipse/misc/JavadocTest.java b/test/eclipse/src/lombok/eclipse/misc/JavadocTest.java index bbd73125..fd7a5daa 100644 --- a/test/eclipse/src/lombok/eclipse/misc/JavadocTest.java +++ b/test/eclipse/src/lombok/eclipse/misc/JavadocTest.java @@ -21,11 +21,12 @@ */ package lombok.eclipse.misc; -import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.internal.ui.text.javadoc.JavadocContentAccess2; +import org.hamcrest.CoreMatchers; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -45,10 +46,16 @@ public class JavadocTest { IJavaElement getterInvocation = cu.codeSelect(306, 0)[0]; String getterHtmlContent = JavadocContentAccess2.getHTMLContent(getterInvocation, true); - assertEquals("Getter section
Returns:
Sky is blue3
", getterHtmlContent); + assertThat(getterHtmlContent, CoreMatchers.containsString("Getter section")); + assertThat(getterHtmlContent, CoreMatchers.containsString("Returns:")); + assertThat(getterHtmlContent, CoreMatchers.containsString("Sky is blue3")); IJavaElement setterInvocation = cu.codeSelect(320, 0)[0]; String setterHtmlContent = JavadocContentAccess2.getHTMLContent(setterInvocation, true); - assertEquals("Setter section
Parameters:
fieldName Hello, World3
field
", setterHtmlContent); + assertThat(setterHtmlContent, CoreMatchers.containsString("Setter section")); + assertThat(setterHtmlContent, CoreMatchers.containsString("Parameters:")); + assertThat(setterHtmlContent, CoreMatchers.containsString("fieldName")); + assertThat(setterHtmlContent, CoreMatchers.containsString("Hello, World3")); + assertThat(setterHtmlContent, CoreMatchers.containsString("field")); } }