From b3d191e30023a4d80ffc88646446f2df0bc2f353 Mon Sep 17 00:00:00 2001 From: Reinier Zwitserloot Date: Tue, 29 Sep 2009 17:15:24 +0200 Subject: [PATCH] Everything seems to be working smoothly! Perhaps time to make this the main branch... --- lib/eclipse.agent/lombok-patcher.jar | Bin 66886 -> 84217 bytes src/lombok/eclipse/TransformEclipseAST.java | 4 + .../lombok/eclipse/ClassLoaderWorkaround.java | 134 ----------- .../java/lombok/eclipse/package-info.java | 27 --- .../lombok/eclipse/agent/EclipsePatcher.java | 214 ++++++------------ .../eclipse/agent}/PatchFixes.java | 2 +- 6 files changed, 75 insertions(+), 306 deletions(-) delete mode 100644 src_eclipseagent/java/lombok/eclipse/ClassLoaderWorkaround.java delete mode 100644 src_eclipseagent/java/lombok/eclipse/package-info.java rename src_eclipseagent/{java/lombok/eclipse => lombok/eclipse/agent}/PatchFixes.java (91%) diff --git a/lib/eclipse.agent/lombok-patcher.jar b/lib/eclipse.agent/lombok-patcher.jar index 3c22f4f054976e4386f3f6958ab0e18e560dfb43..18a8ba6332d0af0b50d3d76f00ab87226f9d323c 100644 GIT binary patch delta 33388 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 f`+uB$I!8%ihlNBy6N3S;jfFDHCU*b}~S_9Ln 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 z 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 diff --git a/src/lombok/eclipse/TransformEclipseAST.java b/src/lombok/eclipse/TransformEclipseAST.java index 365b65a2..b975dc3e 100644 --- a/src/lombok/eclipse/TransformEclipseAST.java +++ b/src/lombok/eclipse/TransformEclipseAST.java @@ -90,6 +90,10 @@ public class TransformEclipseAST { //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); + } + /** * This method is called immediately after Eclipse finishes building a CompilationUnitDeclaration, which is * the top-level AST node when Eclipse parses a source file. The signature is 'magic' - you should not diff --git a/src_eclipseagent/java/lombok/eclipse/ClassLoaderWorkaround.java b/src_eclipseagent/java/lombok/eclipse/ClassLoaderWorkaround.java deleted file mode 100644 index 3d8e9ec9..00000000 --- a/src_eclipseagent/java/lombok/eclipse/ClassLoaderWorkaround.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright © 2009 Reinier Zwitserloot and Roel Spilker. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package java.lombok.eclipse; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.Map; - - -/** - * Allows you to inject the lombok classes into any classloader, even if that classloader does not - * know how to find the lombok classes. - * - * Example: Injecting lombok's Eclipse Parser patching code into eclipse's OSGi BundleLoader. - * - * @author rzwitserloot - */ -public class ClassLoaderWorkaround { - static RuntimeException sneakyThrow(Throwable t) { - if ( t == null ) throw new NullPointerException("t"); - ClassLoaderWorkaround.sneakyThrow0(t); - return null; - } - - @SuppressWarnings("unchecked") - private static void sneakyThrow0(Throwable t) throws T { - throw (T)t; - } - - private static final Map transform = new HashMap(); - - public static void transformCompilationUnitDeclarationSwapped(Object cud, Object parser) throws Exception { - transformCompilationUnitDeclaration(parser, cud); - } - - public static void transformCompilationUnitDeclaration(Object parser, Object cud) throws Exception { - Method transformMethod = getTransformMethod(cud); - try { - transformMethod.invoke(null, parser, cud); - } catch ( InvocationTargetException e ) { - throw sneakyThrow(e.getCause()); - } - } - - private static Method getTransformMethod(Object cud) throws ClassNotFoundException { - ClassLoader contextLoader = Thread.currentThread().getContextClassLoader(); - - synchronized ( transform ) { - if ( !transform.containsKey(contextLoader)) { - transform.put(contextLoader, findTransformMethod(cud)); - } - - Method m = transform.get(contextLoader); - if ( m == null ) throw new ClassNotFoundException("lombok.eclipse.TransformEclipseAST"); - return m; - - } - } - - private static Method findTransformMethod(Object cud) throws ClassNotFoundException { - final ClassLoader parent = cud.getClass().getClassLoader(); - ClassLoader loader = new ClassLoader() { - @Override public Class loadClass(String name, boolean resolve) throws ClassNotFoundException { - if ( name.startsWith("lombok.") ) { - InputStream in = ClassLoader.getSystemClassLoader().getResourceAsStream(name.replace(".", "/") + ".class"); - ByteArrayOutputStream out = new ByteArrayOutputStream(); - - byte[] b = new byte[65536]; - try { - while ( true ) { - int r = in.read(b); - if ( r == -1 ) break; - if ( r > 0 ) out.write(b, 0, r); - } - - in.close(); - byte[] data = out.toByteArray(); - Class result = defineClass(name, data, 0, data.length); - if ( resolve ) resolveClass(result); - return result; - } catch ( IOException e ) { - throw new ClassNotFoundException(); - } - } else { - try { - Class result = ClassLoader.getSystemClassLoader().loadClass(name); - if ( resolve ) resolveClass(result); - return result; - } catch ( ClassNotFoundException e ) { - Class result = parent.loadClass(name); - if ( resolve ) resolveClass(result); - return result; - } - } - } - }; - - Class c = loader.loadClass("lombok.eclipse.TransformEclipseAST"); - for ( Method method : c.getMethods() ) { - if ( method.getName().equals("transform") ) { - Class[] types = method.getParameterTypes(); - if ( types.length != 2 ) continue; - if ( !types[0].getName().equals("org.eclipse.jdt.internal.compiler.parser.Parser") ) continue; - if ( !types[1].getName().equals("org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration") ) continue; - return method; - } - } - - throw new ClassNotFoundException("lombok.eclipse.TransformEclipseAST"); - } -} diff --git a/src_eclipseagent/java/lombok/eclipse/package-info.java b/src_eclipseagent/java/lombok/eclipse/package-info.java deleted file mode 100644 index 2ec8031f..00000000 --- a/src_eclipseagent/java/lombok/eclipse/package-info.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright © 2009 Reinier Zwitserloot and Roel Spilker. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -/** - * Workaround package to avoid the OSGi class loader system, which will always refer to the system class loader for any classes in a package - * that starts with java. - */ -package java.lombok.eclipse; diff --git a/src_eclipseagent/lombok/eclipse/agent/EclipsePatcher.java b/src_eclipseagent/lombok/eclipse/agent/EclipsePatcher.java index c7aa48ff..83b6ec94 100644 --- a/src_eclipseagent/lombok/eclipse/agent/EclipsePatcher.java +++ b/src_eclipseagent/lombok/eclipse/agent/EclipsePatcher.java @@ -21,33 +21,14 @@ */ package lombok.eclipse.agent; -import java.io.File; -import java.io.IOException; -import java.lang.instrument.ClassFileTransformer; -import java.lang.instrument.IllegalClassFormatException; import java.lang.instrument.Instrumentation; -import java.lang.reflect.InvocationTargetException; -import java.net.URI; -import java.net.URLDecoder; -import java.nio.charset.Charset; -import java.security.ProtectionDomain; -import java.util.HashMap; -import java.util.Map; -import java.util.jar.JarFile; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import org.objectweb.asm.Opcodes; - -import lombok.Lombok; -import lombok.core.SpiLoadUtil; import lombok.patcher.Hook; import lombok.patcher.MethodTarget; import lombok.patcher.ScriptManager; import lombok.patcher.StackRequest; -import lombok.patcher.scripts.AddFieldScript; -import lombok.patcher.scripts.ExitFromMethodEarlyScript; -import lombok.patcher.scripts.WrapReturnValuesScript; +import lombok.patcher.equinox.EquinoxClassLoader; +import lombok.patcher.scripts.ScriptBuilder; /** * This is a java-agent that patches some of eclipse's classes so AST Nodes are handed off to Lombok @@ -59,135 +40,80 @@ import lombok.patcher.scripts.WrapReturnValuesScript; public class EclipsePatcher { private EclipsePatcher() {} - private static Map transformers = new HashMap(); - static { - try { - for ( EclipseTransformer transformer : SpiLoadUtil.findServices(EclipseTransformer.class) ) { - String targetClassName = transformer.getTargetClassName(); - transformers.put(targetClassName, transformer); - } - } catch ( Throwable t ) { - throw Lombok.sneakyThrow(t); - } - } - - private static class Patcher implements ClassFileTransformer { - public byte[] transform(ClassLoader loader, String className, - Class classBeingRedefined, - ProtectionDomain protectionDomain, byte[] classfileBuffer) - throws IllegalClassFormatException { - -// ClassLoader classLoader = Patcher.class.getClassLoader(); -// if ( classLoader == null ) classLoader = ClassLoader.getSystemClassLoader(); - - EclipseTransformer transformer = transformers.get(className); - if ( transformer != null ) return transformer.transform(classfileBuffer); - - return null; - } - } - public static void agentmain(String agentArgs, Instrumentation instrumentation) throws Exception { - registerPatcher(instrumentation, true); - addLombokToSearchPaths(instrumentation); - } - - private static void addLombokToSearchPaths(Instrumentation instrumentation) throws Exception { - String path = findPathOfOurClassloader(); - //On java 1.5, you don't have these methods, so you'll be forced to manually -Xbootclasspath/a them in. - tryCallMethod(instrumentation, "appendToSystemClassLoaderSearch", path + "/lombok.jar"); - tryCallMethod(instrumentation, "appendToBootstrapClassLoaderSearch", path + "/lombok.eclipse.agent.jar"); - } - - private static void tryCallMethod(Object o, String methodName, String path) { - try { - Instrumentation.class.getMethod(methodName, JarFile.class).invoke(o, new JarFile(path)); - } catch ( Throwable ignore ) {} - } - - private static String findPathOfOurClassloader() throws Exception { - URI uri = EclipsePatcher.class.getResource("/" + EclipsePatcher.class.getName().replace('.', '/') + ".class").toURI(); - Pattern p = Pattern.compile("^jar:file:([^\\!]+)\\!.*\\.class$"); - Matcher m = p.matcher(uri.toString()); - if ( !m.matches() ) return "."; - String rawUri = m.group(1); - return new File(URLDecoder.decode(rawUri, Charset.defaultCharset().name())).getParent(); + registerPatchScripts(instrumentation, true); } public static void premain(String agentArgs, Instrumentation instrumentation) throws Exception { - registerPatcher(instrumentation, false); - addLombokToSearchPaths(instrumentation); - ScriptManager sm = new ScriptManager(); - sm.registerTransformer(instrumentation); - - sm.addScript(new WrapReturnValuesScript( - new MethodTarget("org.eclipse.jdt.core.dom.ASTConverter", "retrieveStartingCatchPosition"), - new Hook("java/lombok/eclipse/PatchFixes", "fixRetrieveStartingCatchPosition", "(I)I"), - StackRequest.PARAM1)); - - sm.addScript(new AddFieldScript("org.eclipse.jdt.internal.compiler.ast.ASTNode", - Opcodes.ACC_PUBLIC | Opcodes.ACC_TRANSIENT, "$generatedBy", "Lorg/eclipse/jdt/internal/compiler/ast/ASTNode;")); - - sm.addScript(new AddFieldScript("org.eclipse.jdt.core.dom.ASTNode", - Opcodes.ACC_PUBLIC | Opcodes.ACC_TRANSIENT, "$isGenerated", "Z")); - - sm.addScript(new AddFieldScript("org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration", - Opcodes.ACC_PUBLIC | Opcodes.ACC_TRANSIENT, "$lombokAST", "Ljava/lang/Object;")); - - sm.addScript(new WrapReturnValuesScript( - new MethodTarget("org.eclipse.jdt.internal.compiler.parser.Parser", "getMethodBodies", "void", - "org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration"), - new Hook("java/lombok/eclipse/ClassLoaderWorkaround", "transformCompilationUnitDeclaration", - "(Ljava/lang/Object;Ljava/lang/Object;)V"), StackRequest.THIS, StackRequest.PARAM1)); - - sm.addScript(new WrapReturnValuesScript( - new MethodTarget("org.eclipse.jdt.internal.compiler.parser.Parser", "endParse", - "org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration", "int"), - new Hook("java/lombok/eclipse/ClassLoaderWorkaround", "transformCompilationUnitDeclarationSwapped", - "(Ljava/lang/Object;Ljava/lang/Object;)V"), StackRequest.THIS, StackRequest.RETURN_VALUE)); - - sm.addScript(new ExitFromMethodEarlyScript( - new MethodTarget("org.eclipse.jdt.internal.compiler.parser.Parser", "parse", "void", - "org.eclipse.jdt.internal.compiler.ast.MethodDeclaration", - "org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration"), - new Hook("java/lombok/eclipse/PatchFixes", "checkBit24", - "(Ljava/lang/Object;)Z"), null, StackRequest.PARAM1)); - - sm.addScript(new ExitFromMethodEarlyScript( - new MethodTarget("org.eclipse.jdt.internal.compiler.parser.Parser", "parse", "void", - "org.eclipse.jdt.internal.compiler.ast.ConstructorDeclaration", - "org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration", "boolean"), - new Hook("java/lombok/eclipse/PatchFixes", "checkBit24", - "(Ljava/lang/Object;)Z"), null, StackRequest.PARAM1)); - - sm.addScript(new ExitFromMethodEarlyScript( - new MethodTarget("org.eclipse.jdt.internal.compiler.parser.Parser", "parse", "void", - "org.eclipse.jdt.internal.compiler.ast.Initializer", - "org.eclipse.jdt.internal.compiler.ast.TypeDeclaration", - "org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration"), - new Hook("java/lombok/eclipse/PatchFixes", "checkBit24", - "(Ljava/lang/Object;)Z"), null, StackRequest.PARAM1)); + registerPatchScripts(instrumentation, false); } - private static void registerPatcher(Instrumentation instrumentation, boolean transformExisting) throws IOException { - instrumentation.addTransformer(new Patcher()/*, true*/); + private static void registerPatchScripts(Instrumentation instrumentation, boolean reloadExistingClasses) { + ScriptManager sm = new ScriptManager(); + sm.registerTransformer(instrumentation); + EquinoxClassLoader.getInstance().addPrefix("lombok."); + EquinoxClassLoader.getInstance().registerScripts(sm); - if ( transformExisting ) for ( Class c : instrumentation.getAllLoadedClasses() ) { - if ( transformers.containsKey(c.getName()) ) { - try { - //instrumentation.retransformClasses(c); - //not in java 1.5. - Instrumentation.class.getMethod("retransformClasses", Class[].class).invoke(instrumentation, - new Object[] { new Class[] {c }}); - } catch ( InvocationTargetException e ) { - throw new UnsupportedOperationException( - "The eclipse parser class is already loaded and cannot be modified. " + - "You'll have to restart eclipse in order to use Lombok in eclipse."); - } catch ( Throwable t ) { - throw new UnsupportedOperationException( - "This appears to be a java 1.5 instance, which cannot reload already loaded classes. " + - "You'll have to restart eclipse in order to use Lombok in eclipse."); - } - } - } + 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()); + + sm.addScript(ScriptBuilder.addField() + .targetClass("org.eclipse.jdt.internal.compiler.ast.ASTNode") + .fieldName("$generatedBy") + .fieldType("Lorg/eclipse/jdt/internal/compiler/ast/ASTNode;") + .setPublic().setTransient().build()); + + sm.addScript(ScriptBuilder.addField() + .targetClass("org.eclipse.jdt.core.dom.ASTNode") + .fieldName("$isGenerated").fieldType("Z") + .setPublic().setTransient().build()); + + sm.addScript(ScriptBuilder.addField() + .targetClass("org.eclipse.jdt.internal.compiler.CompilationUnitDeclaration") + .fieldName("$lombokAST").fieldType("Ljava/lang/Object;") + .setPublic().setTransient().build()); + + final String PARSER_SIG1 = "org.eclipse.jdt.internal.compiler.parser.Parser"; + final String PARSER_SIG2 = "Lorg/eclipse/jdt/internal/compiler/parser/Parser;"; + final String CUD_SIG1 = "org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration"; + final String CUD_SIG2 = "Lorg/eclipse/jdt/internal/compiler/ast/CompilationUnitDeclaration;"; + + sm.addScript(ScriptBuilder.wrapReturnValue() + .target(new MethodTarget(PARSER_SIG1, "getMethodBodies", "void", CUD_SIG1)) + .wrapMethod(new Hook("lombok/eclipse/TransformEclipseAST", "transform", + "(" + PARSER_SIG2 + CUD_SIG2 + ")V")) + .request(StackRequest.THIS, StackRequest.PARAM1).build()); + + sm.addScript(ScriptBuilder.wrapReturnValue() + .target(new MethodTarget(PARSER_SIG1, "endParse", CUD_SIG1, "int")) + .wrapMethod(new Hook("lombok/eclipse/TransformEclipseAST", "transform_swapped", + "(" + CUD_SIG2 + PARSER_SIG2 + ")V")) + .request(StackRequest.THIS, StackRequest.RETURN_VALUE).build()); + + sm.addScript(ScriptBuilder.exitEarly() + .target(new MethodTarget(PARSER_SIG1, "parse", "void", + "org.eclipse.jdt.internal.compiler.ast.MethodDeclaration", + "org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration")) + .decisionMethod(new Hook("lombok/eclipse/agent/PatchFixes", "checkBit24", "(Ljava/lang/Object;)Z")) + .transplant().request(StackRequest.PARAM1).build()); + + sm.addScript(ScriptBuilder.exitEarly() + .target(new MethodTarget(PARSER_SIG1, "parse", "void", + "org.eclipse.jdt.internal.compiler.ast.ConstructorDeclaration", + "org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration", "boolean")) + .decisionMethod(new Hook("lombok/eclipse/agent/PatchFixes", "checkBit24", "(Ljava/lang/Object;)Z")) + .transplant().request(StackRequest.PARAM1).build()); + + sm.addScript(ScriptBuilder.exitEarly() + .target(new MethodTarget(PARSER_SIG1, "parse", "void", + "org.eclipse.jdt.internal.compiler.ast.Initializer", + "org.eclipse.jdt.internal.compiler.ast.TypeDeclaration", + "org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration")) + .decisionMethod(new Hook("lombok/eclipse/agent/PatchFixes", "checkBit24", "(Ljava/lang/Object;)Z")) + .transplant().request(StackRequest.PARAM1).build()); + + if (reloadExistingClasses) sm.reloadClasses(instrumentation); } } diff --git a/src_eclipseagent/java/lombok/eclipse/PatchFixes.java b/src_eclipseagent/lombok/eclipse/agent/PatchFixes.java similarity index 91% rename from src_eclipseagent/java/lombok/eclipse/PatchFixes.java rename to src_eclipseagent/lombok/eclipse/agent/PatchFixes.java index 23c60d32..e36823b2 100644 --- a/src_eclipseagent/java/lombok/eclipse/PatchFixes.java +++ b/src_eclipseagent/lombok/eclipse/agent/PatchFixes.java @@ -1,4 +1,4 @@ -package java.lombok.eclipse; +package lombok.eclipse.agent; public class PatchFixes { public static int fixRetrieveStartingCatchPosition(int in) {