diff --git a/src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java b/src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java index 83330faf..954c0f39 100644 --- a/src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java +++ b/src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java @@ -332,7 +332,14 @@ public class EclipsePatcher implements AgentLauncher.AgentLaunchable { .requestExtra(StackRequest.PARAM1) .transplant() .build()); - + + sm.addScriptIfWitness(new String [] {"org/eclipse/jdt/internal/compiler/parser/TerminalToken"}, ScriptBuilder.replaceMethodCall() + .target(new MethodTarget("org.eclipse.jdt.internal.core.dom.rewrite.ASTRewriteAnalyzer", "visit")) + .methodToReplace(new Hook("org.eclipse.jdt.internal.core.dom.rewrite.TokenScanner", "getTokenEndOffset", "int", "org.eclipse.jdt.internal.compiler.parser.TerminalToken", "int")) + .replacementMethod(new Hook("lombok.launch.PatchFixesHider$PatchFixes", "getTokenEndOffsetFixed", "int", "org.eclipse.jdt.internal.core.dom.rewrite.TokenScanner", "java.lang.Object", "int", "java.lang.Object")) + .requestExtra(StackRequest.PARAM1) + .transplant() + .build()); } private static void patchPostCompileHookEclipse(ScriptManager sm) { diff --git a/src/eclipseAgent/lombok/launch/PatchFixesHider.java b/src/eclipseAgent/lombok/launch/PatchFixesHider.java index 5556771f..fa3f7edb 100755 --- a/src/eclipseAgent/lombok/launch/PatchFixesHider.java +++ b/src/eclipseAgent/lombok/launch/PatchFixesHider.java @@ -791,7 +791,38 @@ final class PatchFixesHider { // If this fails, better to break some refactor scripts than to crash eclipse. } if (isGenerated) return -1; - return scanner.getTokenEndOffset(token, startOffset); + + Object res = -1; + try { + Method m = Permit.getMethod(TokenScanner.class, "getTokenEndOffset", int.class, int.class); + res = Permit.invoke(m, scanner, token, startOffset); + } catch (Exception e) { + e.printStackTrace(); + // continue + } + return (Integer) res; + } + + public static int getTokenEndOffsetFixed(TokenScanner scanner, Object token, int startOffset, Object domNode) throws CoreException { + boolean isGenerated = false; + try { + isGenerated = (Boolean) domNode.getClass().getField("$isGenerated").get(domNode); + } catch (Exception e) { + // If this fails, better to break some refactor scripts than to crash eclipse. + } + if (isGenerated) return -1; + + Object res = -1; + try { + // https://github.com/eclipse-jdt/eclipse.jdt.core/issues/3303 + Class TERMINAL_TOKEN_CLASS = Class.forName("org.eclipse.jdt.internal.compiler.parser.TerminalToken"); + Method m = Permit.getMethod(TokenScanner.class, "getTokenEndOffset", TERMINAL_TOKEN_CLASS, int.class); + res = Permit.invoke(m, scanner, token, startOffset); + } catch (Exception e) { + e.printStackTrace(); + // continue + } + return (Integer) res; } public static IMethod[] removeGeneratedMethods(IMethod[] methods) throws Exception {