From 310862d94e3a4705faf0d2b6ed9cdb40247b39ca Mon Sep 17 00:00:00 2001 From: Reinier Zwitserloot Date: Sun, 11 Oct 2009 07:54:25 +0200 Subject: [PATCH] Integrated lombok.jar and lombok.eclipse.agent.jar into one jar that installs, is a javac apt processor, and an agent, all at once. --- buildScripts/compile.ant.xml | 49 +++--------- buildScripts/deps.ant.xml | 8 +- lib/README | 3 +- .../lombok-patcher.jar | Bin 1490329 -> 1497998 bytes lib/netbeans.agent/.gitkeep | 1 - src/lombok/eclipse/TransformEclipseAST.java | 36 ++------- src/lombok/installer/EclipseLocation.java | 71 +++++++----------- src/lombok/installer/Installer.java | 4 +- .../lombok/eclipse/agent/EclipsePatcher.java | 25 ++++-- 9 files changed, 69 insertions(+), 128 deletions(-) rename lib/{eclipse.agent => lombok}/lombok-patcher.jar (96%) delete mode 100644 lib/netbeans.agent/.gitkeep diff --git a/buildScripts/compile.ant.xml b/buildScripts/compile.ant.xml index 82ee07f7..075bc394 100644 --- a/buildScripts/compile.ant.xml +++ b/buildScripts/compile.ant.xml @@ -34,35 +34,21 @@ lombok code including the various agents. - - - - - - + - - - - - - - - - - + @@ -74,13 +60,16 @@ lombok code including the various agents. javac 1.5, partly because they completely rewrote large swaths of javac, and partly because our injection mechanism (annotations) doesn't work very well on javac 1.5, hence, when using javac, we do demand you're on 1.6. --> - + + + + - + - + @@ -93,35 +82,17 @@ lombok code including the various agents. lombok.javac.apt.Processor - - - - - - - - - - - - - - - - - - - - + + diff --git a/buildScripts/deps.ant.xml b/buildScripts/deps.ant.xml index 1c6919ee..b9d447f8 100644 --- a/buildScripts/deps.ant.xml +++ b/buildScripts/deps.ant.xml @@ -36,16 +36,16 @@ and building dependencies. - + + targetfile="lib/lombok/lombok-patcher.jar" /> - - ** UPDATED: lib/eclipse.agent/lombok-patcher.jar + + ** UPDATED: lib/lombok/lombok-patcher.jar diff --git a/lib/README b/lib/README index 1e605c10..e776bb9c 100644 --- a/lib/README +++ b/lib/README @@ -1,5 +1,4 @@ 'lib' is defined as those things which are required when actually running lombok. -The main lombok code requires all libraries in the 'lombok' directory, whilst the agents -require the contents of both the 'agent' directory and the agent's specific directory (e.g. 'eclipse.agent'). +The main lombok code requires all libraries in the 'lombok' directory. For dependencies which are required only at compile time, see the 'deps' directory. diff --git a/lib/eclipse.agent/lombok-patcher.jar b/lib/lombok/lombok-patcher.jar similarity index 96% rename from lib/eclipse.agent/lombok-patcher.jar rename to lib/lombok/lombok-patcher.jar index ec6141768c7f628386ecf9bd4cb8416ee5273437..86d4a88928fe155471b0f242bf7b1d76196f828a 100644 GIT binary patch delta 34288 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%0D0gdxFZ&j@oTgWC6;AHVfLa_Q&xc`bp|ot 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 G5d9w)Sg9ER delta 27159 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 EA8qjmvj6}9 diff --git a/lib/netbeans.agent/.gitkeep b/lib/netbeans.agent/.gitkeep deleted file mode 100644 index 2ded1cf3..00000000 --- a/lib/netbeans.agent/.gitkeep +++ /dev/null @@ -1 +0,0 @@ -Empty dir placeholder diff --git a/src/lombok/eclipse/TransformEclipseAST.java b/src/lombok/eclipse/TransformEclipseAST.java index 691327b1..6eac4196 100644 --- a/src/lombok/eclipse/TransformEclipseAST.java +++ b/src/lombok/eclipse/TransformEclipseAST.java @@ -22,11 +22,9 @@ package lombok.eclipse; import java.lang.reflect.Field; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; import lombok.eclipse.EclipseAST.Node; +import lombok.patcher.Symbols; import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration; import org.eclipse.jdt.internal.compiler.ast.Annotation; @@ -77,24 +75,6 @@ public class TransformEclipseAST { handlers = l; } - private static final List DONT_RUN_LIST = Collections.unmodifiableList(Arrays.asList( - "org.eclipse.jdt.internal.corext.util.CodeFormatterUtil." - )); - - - /** - * Returns 'true' if the stack trace indicates lombok definitely SHOULD run for this parse job, by checking the context, - * and returns 'false' if the stack trace indicates lombok should definitely NOT run. - * - * Returns null if it can't tell (you probably should default to running lombok if you don't know). - */ - private static Boolean analyzeStackTrace(StackTraceElement[] trace) { - for ( StackTraceElement e : trace ) - if ( e.toString().contains(DONT_RUN_LIST.get(0)) ) return false; - return null; - //potential speedup: if trace contains org.eclipse.swt.widgets. -> stop - nothing interesting ever follows that. I think. - } - public static void transform_swapped(CompilationUnitDeclaration ast, Parser parser) { transform(parser, ast); } @@ -111,29 +91,27 @@ public class TransformEclipseAST { * @param ast The AST node belonging to the compilation unit (java speak for a single source file). */ public static void transform(Parser parser, CompilationUnitDeclaration ast) { - if ( disableLombok ) return; + if (disableLombok) return; - Boolean parse = analyzeStackTrace(new Throwable().getStackTrace()); - - if ( parse != null && parse == false ) return; + if (Symbols.hasSymbol("lombok.disable")) return; try { EclipseAST existing = getCache(ast); - if ( existing == null ) { + if (existing == null) { existing = new EclipseAST(ast); setCache(ast, existing); } else existing.reparse(); new TransformEclipseAST(existing).go(); - } catch ( Throwable t ) { + } catch (Throwable t) { try { String message = "Lombok can't parse this source: " + t.toString(); EclipseAST.addProblemToCompilationResult(ast, false, message, 0, 0); t.printStackTrace(); - } catch ( Throwable t2 ) { + } catch (Throwable t2) { try { Eclipse.error(ast, "Can't create an error in the problems dialog while adding: " + t.toString(), t2); - } catch ( Throwable t3 ) { + } catch (Throwable t3) { //This seems risky to just silently turn off lombok, but if we get this far, something pretty //drastic went wrong. For example, the eclipse help system's JSP compiler will trigger a lombok call, //but due to class loader shenanigans we'll actually get here due to a cascade of diff --git a/src/lombok/installer/EclipseLocation.java b/src/lombok/installer/EclipseLocation.java index d6a2f4b7..2b7e021d 100644 --- a/src/lombok/installer/EclipseLocation.java +++ b/src/lombok/installer/EclipseLocation.java @@ -31,10 +31,8 @@ import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.jar.JarFile; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.zip.ZipEntry; import javax.swing.JFrame; import javax.swing.JOptionPane; @@ -205,12 +203,15 @@ final class EclipseLocation { null); } - File agentJar = new File(dir, "lombok.eclipse.agent.jar"); - if ( agentJar.exists() ) { - if ( !agentJar.delete() ) throw new UninstallException( - "Can't delete " + agentJar.getAbsolutePath() + - " - perhaps the installer does not have the access rights to do so.", - null); + /* legacy code - lombok at one point used to have a separate jar for the eclipse agent. + * Leave this code in to delete it for those upgrading from an old version. */ { + File agentJar = new File(dir, "lombok.eclipse.agent.jar"); + if ( agentJar.exists() ) { + if ( !agentJar.delete() ) throw new UninstallException( + "Can't delete " + agentJar.getAbsolutePath() + + " - perhaps the installer does not have the access rights to do so.", + null); + } } File iniFile = new File(dir, "eclipse.ini"); @@ -230,7 +231,9 @@ final class EclipseLocation { boolean first = true; for ( String elem : m.group(1).split(Pattern.quote(File.pathSeparator)) ) { if ( elem.toLowerCase().endsWith("lombok.jar") ) continue; - if ( elem.toLowerCase().endsWith("lombok.eclipse.agent.jar") ) continue; + /* legacy code -see previous comment that starts with 'legacy' */ { + if ( elem.toLowerCase().endsWith("lombok.eclipse.agent.jar") ) continue; + } if ( first ) first = false; else elemBuilder.append(File.pathSeparator); elemBuilder.append(elem); @@ -295,33 +298,11 @@ final class EclipseLocation { //is no less bad than aborting, and this situation should be rare to the point of non-existence. File lombokJar = new File(iniFile.getParentFile(), "lombok.jar"); - File agentJar = new File(iniFile.getParentFile(), "lombok.eclipse.agent.jar"); File ourJar = EclipseFinder.findOurJar(); byte[] b = new byte[524288]; boolean readSucceeded = false; try { - JarFile jar = new JarFile(ourJar); - - try { - ZipEntry entry = jar.getEntry("lombok.eclipse.agent.jar"); - InputStream in = jar.getInputStream(entry); - FileOutputStream out = new FileOutputStream(agentJar); - try { - while ( true ) { - int r = in.read(b); - if ( r == -1 ) break; - readSucceeded = true; - out.write(b, 0, r); - } - } finally { - out.close(); - } - } finally { - jar.close(); - - } - FileOutputStream out = new FileOutputStream(lombokJar); InputStream in = new FileInputStream(ourJar); try { @@ -336,13 +317,16 @@ final class EclipseLocation { } catch ( IOException e ) { try { lombokJar.delete(); - agentJar.delete(); } catch ( Throwable ignore ) {} if ( !readSucceeded ) throw new InstallException("I can't read my own jar file. I think you've found a bug in this installer! I suggest you restart it " + "and use the 'what do I do' link, to manually install lombok. And tell us about this. Thanks!", e); throw new InstallException("I can't write to your Eclipse directory, probably because this installer does not have the access rights.", e); } + /* legacy - delete lombok.eclipse.agent.jar if its there, which lombok no longer uses. */ { + new File(lombokJar.getParentFile(), "lombok.eclipse.agent.jar").delete(); + } + try { FileInputStream fis = new FileInputStream(iniFile); try { @@ -357,7 +341,9 @@ final class EclipseLocation { boolean first = true; for ( String elem : m.group(1).split(Pattern.quote(File.pathSeparator)) ) { if ( elem.toLowerCase().endsWith("lombok.jar") ) continue; - if ( elem.toLowerCase().endsWith("lombok.eclipse.agent.jar") ) continue; + /* legacy code -see previous comment that starts with 'legacy' */ { + if ( elem.toLowerCase().endsWith("lombok.eclipse.agent.jar") ) continue; + } if ( first ) first = false; else elemBuilder.append(File.pathSeparator); elemBuilder.append(elem); @@ -374,13 +360,11 @@ final class EclipseLocation { } String fullPathToLombok = fullPathRequired ? (lombokJar.getParentFile().getCanonicalPath() + File.separator) : ""; - String fullPathToAgent = fullPathRequired ? (agentJar.getParentFile().getCanonicalPath() + File.separator) : ""; newContents.append(String.format( - "-javaagent:%slombok.eclipse.agent.jar", fullPathToLombok)).append(OS_NEWLINE); + "-javaagent:%slombok.jar", fullPathToLombok)).append(OS_NEWLINE); newContents.append(String.format( - "-Xbootclasspath/a:%slombok.jar" + File.pathSeparator + "%slombok.eclipse.agent.jar", - fullPathToLombok, fullPathToAgent)).append(OS_NEWLINE); + "-Xbootclasspath/a:%slombok.jar", fullPathToLombok)).append(OS_NEWLINE); FileOutputStream fos = new FileOutputStream(iniFile); try { @@ -395,7 +379,6 @@ final class EclipseLocation { } finally { if ( !installSucceeded ) try { lombokJar.delete(); - agentJar.delete(); } catch ( Throwable ignore ) {} } } @@ -406,12 +389,12 @@ final class EclipseLocation { } for ( File dir : failedDirs ) { - //If we're updating the old installation might have worked by putting the lombok jars in a different place. - //We'll delete these old files. - try { - new File(dir, "lombok.jar").delete(); - new File(dir, "lombok.eclipse.agent.jar").delete(); - } catch ( Throwable ignore ) {} + /* Legacy code - lombok's installer used to install in other places. To keep the user's eclipse dir clean, we'll delete these. */ { + try { + new File(dir, "lombok.jar").delete(); + new File(dir, "lombok.eclipse.agent.jar").delete(); + } catch ( Throwable ignore ) {} + } } } } diff --git a/src/lombok/installer/Installer.java b/src/lombok/installer/Installer.java index 89ebfc37..695de4b7 100644 --- a/src/lombok/installer/Installer.java +++ b/src/lombok/installer/Installer.java @@ -810,10 +810,8 @@ public class Installer { private static final String HOW_I_WORK_EXPLANATION = "

    " + "
  1. First, I copy myself (lombok.jar) to your Eclipse install directory.
  2. " + - "
  3. Then, I unpack lombok.eclipse.agent.jar like so:
    " + - "
    jar xvf lombok.jar lombok.eclipse.agent.jar
  4. " + "
  5. Then, I edit the eclipse.ini file to add the following two entries:
    " + - "
    -Xbootclasspath/a:lombok.jar%1$slombok.eclipse.agent.jar
    " + + "
    -Xbootclasspath/a:lombok.jar
    " + "-javaagent:lombok.jar
" + "
" + "That's all there is to it. Note that on Mac OS X, eclipse.ini is hidden in
" + diff --git a/src_eclipseagent/lombok/eclipse/agent/EclipsePatcher.java b/src_eclipseagent/lombok/eclipse/agent/EclipsePatcher.java index 6efddf61..d1759127 100644 --- a/src_eclipseagent/lombok/eclipse/agent/EclipsePatcher.java +++ b/src_eclipseagent/lombok/eclipse/agent/EclipsePatcher.java @@ -56,7 +56,7 @@ public class EclipsePatcher { ScriptManager sm = new ScriptManager(); sm.registerTransformer(instrumentation); EquinoxClassLoader.getInstance().addPrefix("lombok."); - EquinoxClassLoader.getInstance().registerScripts(sm); + EquinoxClassLoader.registerScripts(sm); patchLombokizeAST(sm); patchAvoidReparsingGeneratedCode(sm); @@ -66,7 +66,7 @@ public class EclipsePatcher { if (reloadExistingClasses) sm.reloadClasses(instrumentation); } - + private static void patchHideGeneratedNodes(ScriptManager sm) { sm.addScript(ScriptBuilder.wrapReturnValue() .target(new MethodTarget("org.eclipse.jdt.internal.corext.dom.LinkedNodeFinder", "findByNode")) @@ -75,6 +75,19 @@ public class EclipsePatcher { "([Lorg/eclipse/jdt/core/dom/SimpleName;)[Lorg/eclipse/jdt/core/dom/SimpleName;")) .request(StackRequest.RETURN_VALUE).build()); + patchRefactorScripts(sm); + patchFormatters(sm); + } + + private static void patchFormatters(ScriptManager sm) { + sm.addScript(ScriptBuilder.setSymbolDuringMethodCall() + .target(new MethodTarget("org.eclipse.jdt.internal.ui.text.java.JavaFormattingStrategy", "format", "void")) + .callToWrap(new Hook("org/eclipse/jdt/internal/corext/util/CodeFormatterUtil", "reformat", + "(ILjava/lang/String;IIILjava/lang/String;Ljava/util/Map;)Lorg/eclipse/text/edits/TextEdit;")) + .symbol("lombok.disable").build()); + } + + private static void patchRefactorScripts(ScriptManager sm) { sm.addScript(ScriptBuilder.exitEarly() .target(new MethodTarget("org.eclipse.jdt.core.dom.rewrite.ASTRewrite", "replace")) .target(new MethodTarget("org.eclipse.jdt.core.dom.rewrite.ASTRewrite", "remove")) @@ -89,14 +102,14 @@ public class EclipsePatcher { "([Lorg/eclipse/jdt/core/IMethod;)[Lorg/eclipse/jdt/core/IMethod;")) .transplant().build()); } - + private static void patchCatchReparse(ScriptManager sm) { sm.addScript(ScriptBuilder.wrapReturnValue() .target(new MethodTarget("org.eclipse.jdt.core.dom.ASTConverter", "retrieveStartingCatchPosition")) .wrapMethod(new Hook("lombok/eclipse/agent/PatchFixes", "fixRetrieveStartingCatchPosition", "(I)I")) .transplant().request(StackRequest.PARAM1).build()); } - + private static void patchSetGeneratedFlag(ScriptManager sm) { sm.addScript(ScriptBuilder.addField() .targetClass("org.eclipse.jdt.internal.compiler.ast.ASTNode") @@ -150,7 +163,7 @@ public class EclipsePatcher { "(Lorg/eclipse/jdt/core/dom/SimpleName;Ljava/lang/Object;)V")) .transplant().build()); } - + private static void patchAvoidReparsingGeneratedCode(ScriptManager sm) { final String PARSER_SIG1 = "org.eclipse.jdt.internal.compiler.parser.Parser"; sm.addScript(ScriptBuilder.exitEarly() @@ -175,7 +188,7 @@ public class EclipsePatcher { .decisionMethod(new Hook("lombok/eclipse/agent/PatchFixes", "checkBit24", "(Ljava/lang/Object;)Z")) .transplant().request(StackRequest.PARAM1).build()); } - + private static void patchLombokizeAST(ScriptManager sm) { sm.addScript(ScriptBuilder.addField() .targetClass("org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration")