Javadoc support for eclipse 2024-03

This commit is contained in:
Rawi01 authored and Roel Spilker committed 2024-03-18 19:17:58 +01:00
1 parent e4824cbe14
commit 98cdf67ed6
4 files changed
+51 -20

No files matched your search

@@ -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"))
@@ -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;
}
@@ -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);
}
}
@@ -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<dl><dt>Returns:</dt><dd> Sky is blue3</dd></dl>", 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<dl><dt>Parameters:</dt><dd><b>fieldName</b> Hello, World3</dd><dd><b>field</b> </dd></dl>", 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"));
}
}