diff options
author | Reinier Zwitserloot <reinier@zwitserloot.com> | 2011-11-15 04:56:28 -0800 |
---|---|---|
committer | Reinier Zwitserloot <reinier@zwitserloot.com> | 2011-11-15 04:56:28 -0800 |
commit | 68c38e93e607683cb63b10a3f6c01075a7942227 (patch) | |
tree | 6f011bfb642f60ff2c5fdd9322c22b38ab196ddb | |
parent | 0d75d56fcef943d1a35f1169386830066371c12d (diff) | |
parent | fd736cc76f6b1b505d73173f270100161988338d (diff) | |
download | lombok-68c38e93e607683cb63b10a3f6c01075a7942227.tar.gz lombok-68c38e93e607683cb63b10a3f6c01075a7942227.tar.bz2 lombok-68c38e93e607683cb63b10a3f6c01075a7942227.zip |
Merge pull request #10 from jvanderhel/Issue_90
Proposed fix for issue 90 - disables lombok when the AST is being parsed for an autoformatter run, and patches various methods of the ControlStatementFinder to not try to find generated nodes.
-rw-r--r-- | src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java | 21 | ||||
-rw-r--r-- | src/eclipseAgent/lombok/eclipse/agent/PatchFixes.java | 10 |
2 files changed, 31 insertions, 0 deletions
diff --git a/src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java b/src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java index b52a3b23..3a85c6e9 100644 --- a/src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java +++ b/src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java @@ -89,6 +89,7 @@ public class EclipsePatcher extends Agent { patchHideGeneratedNodes(sm); patchPostCompileHookEclipse(sm); patchFixSourceTypeConverter(sm); + patchDisableLombokForCodeFormatterAndCleanup(sm); } else { patchPostCompileHookEcj(sm); } @@ -99,6 +100,26 @@ public class EclipsePatcher extends Agent { if (reloadExistingClasses) sm.reloadClasses(instrumentation); } + private static void patchDisableLombokForCodeFormatterAndCleanup(ScriptManager sm) { + sm.addScript(ScriptBuilder.setSymbolDuringMethodCall() + .target(new MethodTarget("org.eclipse.jdt.internal.formatter.DefaultCodeFormatter", "formatCompilationUnit")) + .callToWrap(new Hook("org.eclipse.jdt.internal.core.util.CodeSnippetParsingUtil", "parseCompilationUnit", "org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration", "char[]", "java.util.Map", "boolean")) + .symbol("lombok.disable") + .build()); + + sm.addScript(ScriptBuilder.exitEarly() + .target(new MethodTarget("org.eclipse.jdt.internal.corext.fix.ControlStatementsFix$ControlStatementFinder", "visit", "boolean", "org.eclipse.jdt.core.dom.DoStatement")) + .target(new MethodTarget("org.eclipse.jdt.internal.corext.fix.ControlStatementsFix$ControlStatementFinder", "visit", "boolean", "org.eclipse.jdt.core.dom.EnhancedForStatement")) + .target(new MethodTarget("org.eclipse.jdt.internal.corext.fix.ControlStatementsFix$ControlStatementFinder", "visit", "boolean", "org.eclipse.jdt.core.dom.ForStatement")) + .target(new MethodTarget("org.eclipse.jdt.internal.corext.fix.ControlStatementsFix$ControlStatementFinder", "visit", "boolean", "org.eclipse.jdt.core.dom.IfStatement")) + .target(new MethodTarget("org.eclipse.jdt.internal.corext.fix.ControlStatementsFix$ControlStatementFinder", "visit", "boolean", "org.eclipse.jdt.core.dom.WhileStatement")) + .decisionMethod(new Hook("lombok.eclipse.agent.PatchFixes", "isGenerated", "boolean", "org.eclipse.jdt.core.dom.Statement")) + .request(StackRequest.PARAM1) + .valueMethod(new Hook("lombok.eclipse.agent.PatchFixes", "isGenerated", "boolean", "org.eclipse.jdt.core.dom.Statement")) + .build()); + } + + private static void patchDomAstReparseIssues(ScriptManager sm) { sm.addScript(ScriptBuilder.replaceMethodCall() .target(new MethodTarget("org.eclipse.jdt.internal.core.dom.rewrite.ASTRewriteAnalyzer", "visit")) diff --git a/src/eclipseAgent/lombok/eclipse/agent/PatchFixes.java b/src/eclipseAgent/lombok/eclipse/agent/PatchFixes.java index 6d5fdaec..8da7f668 100644 --- a/src/eclipseAgent/lombok/eclipse/agent/PatchFixes.java +++ b/src/eclipseAgent/lombok/eclipse/agent/PatchFixes.java @@ -41,6 +41,16 @@ import org.eclipse.jdt.internal.compiler.ast.Annotation; import org.eclipse.jdt.internal.core.dom.rewrite.TokenScanner; public class PatchFixes { + public static boolean isGenerated(org.eclipse.jdt.core.dom.Statement statement) { + boolean result = false; + try { + result = ((Boolean)statement.getClass().getField("$isGenerated").get(statement)).booleanValue(); + } catch (Exception e) { + // better to assume it isn't generated + } + return result; + } + public static int fixRetrieveStartingCatchPosition(int original, int start) { return original == -1 ? start : original; } |