From 27a3efeb1cb6f79ecefc6e641ba78de6d69406c3 Mon Sep 17 00:00:00 2001 From: Reinier Zwitserloot Date: Sat, 26 Sep 2009 09:00:12 +0200 Subject: Rewrite of the eclipse agent to use the new lombok.patcher project. --- lib/eclipse.agent/lombok-patcher.jar | Bin 0 -> 66886 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 lib/eclipse.agent/lombok-patcher.jar (limited to 'lib') diff --git a/lib/eclipse.agent/lombok-patcher.jar b/lib/eclipse.agent/lombok-patcher.jar new file mode 100644 index 00000000..3c22f4f0 Binary files /dev/null and b/lib/eclipse.agent/lombok-patcher.jar differ -- cgit From b3d191e30023a4d80ffc88646446f2df0bc2f353 Mon Sep 17 00:00:00 2001 From: Reinier Zwitserloot Date: Tue, 29 Sep 2009 17:15:24 +0200 Subject: 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 + .../java/lombok/eclipse/ClassLoaderWorkaround.java | 134 --------------- .../java/lombok/eclipse/PatchFixes.java | 14 -- .../java/lombok/eclipse/package-info.java | 27 --- .../lombok/eclipse/agent/EclipsePatcher.java | 186 +++++++-------------- .../lombok/eclipse/agent/PatchFixes.java | 14 ++ 7 files changed, 74 insertions(+), 305 deletions(-) delete mode 100644 src_eclipseagent/java/lombok/eclipse/ClassLoaderWorkaround.java delete mode 100644 src_eclipseagent/java/lombok/eclipse/PatchFixes.java delete mode 100644 src_eclipseagent/java/lombok/eclipse/package-info.java create mode 100644 src_eclipseagent/lombok/eclipse/agent/PatchFixes.java (limited to 'lib') diff --git a/lib/eclipse.agent/lombok-patcher.jar b/lib/eclipse.agent/lombok-patcher.jar index 3c22f4f0..18a8ba63 100644 Binary files a/lib/eclipse.agent/lombok-patcher.jar and b/lib/eclipse.agent/lombok-patcher.jar differ 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/PatchFixes.java b/src_eclipseagent/java/lombok/eclipse/PatchFixes.java deleted file mode 100644 index 23c60d32..00000000 --- a/src_eclipseagent/java/lombok/eclipse/PatchFixes.java +++ /dev/null @@ -1,14 +0,0 @@ -package java.lombok.eclipse; - -public class PatchFixes { - public static int fixRetrieveStartingCatchPosition(int in) { - return in; - } - - private static final int BIT24 = 0x800000; - - public static boolean checkBit24(Object node) throws Exception { - int bits = (Integer)(node.getClass().getField("bits").get(node)); - return (bits & BIT24) != 0; - } -} 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"); + registerPatchScripts(instrumentation, true); } - 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(); + public static void premain(String agentArgs, Instrumentation instrumentation) throws Exception { + registerPatchScripts(instrumentation, false); } - public static void premain(String agentArgs, Instrumentation instrumentation) throws Exception { - registerPatcher(instrumentation, false); - addLombokToSearchPaths(instrumentation); + private static void registerPatchScripts(Instrumentation instrumentation, boolean reloadExistingClasses) { ScriptManager sm = new ScriptManager(); sm.registerTransformer(instrumentation); + EquinoxClassLoader.getInstance().addPrefix("lombok."); + EquinoxClassLoader.getInstance().registerScripts(sm); - 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(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(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(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(new AddFieldScript("org.eclipse.jdt.core.dom.ASTNode", - Opcodes.ACC_PUBLIC | Opcodes.ACC_TRANSIENT, "$isGenerated", "Z")); + sm.addScript(ScriptBuilder.addField() + .targetClass("org.eclipse.jdt.core.dom.ASTNode") + .fieldName("$isGenerated").fieldType("Z") + .setPublic().setTransient().build()); - sm.addScript(new AddFieldScript("org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration", - Opcodes.ACC_PUBLIC | Opcodes.ACC_TRANSIENT, "$lombokAST", "Ljava/lang/Object;")); + sm.addScript(ScriptBuilder.addField() + .targetClass("org.eclipse.jdt.internal.compiler.CompilationUnitDeclaration") + .fieldName("$lombokAST").fieldType("Ljava/lang/Object;") + .setPublic().setTransient().build()); - 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)); + 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(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(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(new ExitFromMethodEarlyScript( - new MethodTarget("org.eclipse.jdt.internal.compiler.parser.Parser", "parse", "void", + 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"), - new Hook("java/lombok/eclipse/PatchFixes", "checkBit24", - "(Ljava/lang/Object;)Z"), null, StackRequest.PARAM1)); + "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(new ExitFromMethodEarlyScript( - new MethodTarget("org.eclipse.jdt.internal.compiler.parser.Parser", "parse", "void", + 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"), - new Hook("java/lombok/eclipse/PatchFixes", "checkBit24", - "(Ljava/lang/Object;)Z"), null, StackRequest.PARAM1)); + "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(new ExitFromMethodEarlyScript( - new MethodTarget("org.eclipse.jdt.internal.compiler.parser.Parser", "parse", "void", + 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"), - new Hook("java/lombok/eclipse/PatchFixes", "checkBit24", - "(Ljava/lang/Object;)Z"), null, StackRequest.PARAM1)); - } - - private static void registerPatcher(Instrumentation instrumentation, boolean transformExisting) throws IOException { - instrumentation.addTransformer(new Patcher()/*, true*/); + "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 ( 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."); - } - } - } + if (reloadExistingClasses) sm.reloadClasses(instrumentation); } } diff --git a/src_eclipseagent/lombok/eclipse/agent/PatchFixes.java b/src_eclipseagent/lombok/eclipse/agent/PatchFixes.java new file mode 100644 index 00000000..e36823b2 --- /dev/null +++ b/src_eclipseagent/lombok/eclipse/agent/PatchFixes.java @@ -0,0 +1,14 @@ +package lombok.eclipse.agent; + +public class PatchFixes { + public static int fixRetrieveStartingCatchPosition(int in) { + return in; + } + + private static final int BIT24 = 0x800000; + + public static boolean checkBit24(Object node) throws Exception { + int bits = (Integer)(node.getClass().getField("bits").get(node)); + return (bits & BIT24) != 0; + } +} -- cgit From dba1a7c64f9c56efcbbb7cf01be4e25938fed69b Mon Sep 17 00:00:00 2001 From: Reinier Zwitserloot Date: Tue, 29 Sep 2009 19:01:33 +0200 Subject: latest version of lombok-patcher. --- lib/eclipse.agent/lombok-patcher.jar | Bin 84217 -> 83840 bytes 1 file changed, 0 insertions(+), 0 deletions(-) (limited to 'lib') diff --git a/lib/eclipse.agent/lombok-patcher.jar b/lib/eclipse.agent/lombok-patcher.jar index 18a8ba63..d7f58c31 100644 Binary files a/lib/eclipse.agent/lombok-patcher.jar and b/lib/eclipse.agent/lombok-patcher.jar differ -- cgit From e8c706a7b6c543be12fa4be84f64041c392bb162 Mon Sep 17 00:00:00 2001 From: Reinier Zwitserloot Date: Wed, 7 Oct 2009 20:50:02 +0200 Subject: Fully moved to using the lombok.patcher project. Means our dependency on ASM is no longer needed (our dep on lombok-patcher takes care of it), and the old EclipseTransformer system has been removed. --- lib/eclipse.agent/asm-3.1.jar | Bin 43035 -> 0 bytes lib/eclipse.agent/lombok-patcher.jar | Bin 83840 -> 1488746 bytes .../agent/EclipseLinkedNodeFinderTransformer.java | 169 --------------------- .../lombok/eclipse/agent/EclipsePatcher.java | 71 +++++++-- .../lombok/eclipse/agent/EclipseTransformer.java | 8 - .../lombok/eclipse/agent/PatchFixes.java | 37 +++++ 6 files changed, 97 insertions(+), 188 deletions(-) delete mode 100644 lib/eclipse.agent/asm-3.1.jar delete mode 100644 src_eclipseagent/lombok/eclipse/agent/EclipseLinkedNodeFinderTransformer.java delete mode 100644 src_eclipseagent/lombok/eclipse/agent/EclipseTransformer.java (limited to 'lib') diff --git a/lib/eclipse.agent/asm-3.1.jar b/lib/eclipse.agent/asm-3.1.jar deleted file mode 100644 index b3baf3fe..00000000 Binary files a/lib/eclipse.agent/asm-3.1.jar and /dev/null differ diff --git a/lib/eclipse.agent/lombok-patcher.jar b/lib/eclipse.agent/lombok-patcher.jar index d7f58c31..0e15ac17 100644 Binary files a/lib/eclipse.agent/lombok-patcher.jar and b/lib/eclipse.agent/lombok-patcher.jar differ diff --git a/src_eclipseagent/lombok/eclipse/agent/EclipseLinkedNodeFinderTransformer.java b/src_eclipseagent/lombok/eclipse/agent/EclipseLinkedNodeFinderTransformer.java deleted file mode 100644 index 9a1ebbb2..00000000 --- a/src_eclipseagent/lombok/eclipse/agent/EclipseLinkedNodeFinderTransformer.java +++ /dev/null @@ -1,169 +0,0 @@ -package lombok.eclipse.agent; - -import org.mangosdk.spi.ProviderFor; -import org.objectweb.asm.ClassAdapter; -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.Label; -import org.objectweb.asm.MethodVisitor; -import static org.objectweb.asm.Opcodes.*; - -@ProviderFor(EclipseTransformer.class) -public class EclipseLinkedNodeFinderTransformer implements EclipseTransformer { - private static final String LINKED_NODE_FINDER = "org/eclipse/jdt/core/internal/corext/dom/LinkedNodeFinder"; - - @Override public String getTargetClassName() { - return LINKED_NODE_FINDER; - } - - @Override public byte[] transform(byte[] in) { - ClassReader reader = new ClassReader(in); - ClassWriter writer = new ClassWriter(reader, 0); - - ClassAdapter adapter = new LinkedNodeFinderPatcherAdapter(writer); - reader.accept(adapter, 0); - return writer.toByteArray(); - } - - private static class LinkedNodeFinderPatcherAdapter extends ClassAdapter { - private int originalAccess; - private String originalDesc; - private String originalSignature; - private String[] originalExceptions; - - LinkedNodeFinderPatcherAdapter(ClassVisitor cv) { - super(cv); - } - - @Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { - if ( !name.equals("findByNode") ) return super.visitMethod(access, name, desc, signature, exceptions); - - originalAccess = access; - originalDesc = desc; - originalSignature = signature; - originalExceptions = exceptions; - - return super.visitMethod(0, "findByNode0", desc, signature, exceptions); - } - - private static final String SIMPLENAME = "org/eclipse/jdt/core/dom/SimpleName"; - private static final String SIMPLENAME_ARRAY = "[L" + SIMPLENAME + ";"; - private static final String ASTNODE = "Lorg/eclipse/jdt/internal/compiler/ast/ASTNode;"; - - /* - * code generated by running ASMifier on: - * - public SimpleName[] findByNode(ASTNode a, SimpleName b) { - SimpleName[] ps = this.findByNode0(a, b); - int count = 0; - for (int i = 0; i < ps.length; i++) { - if ( ps[i] == null || ps[i].$generatedBy == null ) count++; - } - if (count == ps.length) return ps; - SimpleName[] newPs = new SimpleName[count]; - count = 0; - for (int i = 0; i < ps.length; i++) { - if ( ps[i] == null || ps[i].p == null ) newPs[count++] = ps[i]; - } - return newPs; - } - */ - @Override public void visitEnd() { - MethodVisitor mv = super.visitMethod(originalAccess, "findByNode", originalDesc, originalSignature, originalExceptions); - mv.visitCode(); - mv.visitCode(); - mv.visitVarInsn(ALOAD, 0); - mv.visitVarInsn(ALOAD, 1); - mv.visitVarInsn(ALOAD, 2); - mv.visitMethodInsn(INVOKESPECIAL, LINKED_NODE_FINDER, "findByNode0", originalDesc); - mv.visitVarInsn(ASTORE, 3); - mv.visitInsn(ICONST_0); - mv.visitVarInsn(ISTORE, 4); - mv.visitInsn(ICONST_0); - mv.visitVarInsn(ISTORE, 5); - Label l0 = new Label(); - mv.visitLabel(l0); - mv.visitFrame(F_APPEND,3, new Object[] {SIMPLENAME_ARRAY, INTEGER, INTEGER}, 0, null); - mv.visitVarInsn(ILOAD, 5); - mv.visitVarInsn(ALOAD, 3); - mv.visitInsn(ARRAYLENGTH); - Label l1 = new Label(); - mv.visitJumpInsn(IF_ICMPGE, l1); - mv.visitVarInsn(ALOAD, 3); - mv.visitVarInsn(ILOAD, 5); - mv.visitInsn(AALOAD); - Label l2 = new Label(); - mv.visitJumpInsn(IFNULL, l2); - mv.visitVarInsn(ALOAD, 3); - mv.visitVarInsn(ILOAD, 5); - mv.visitInsn(AALOAD); - mv.visitFieldInsn(GETFIELD, SIMPLENAME, "$generatedBy", ASTNODE); - Label l3 = new Label(); - mv.visitJumpInsn(IFNONNULL, l3); - mv.visitLabel(l2); - mv.visitFrame(F_SAME, 0, null, 0, null); - mv.visitIincInsn(4, 1); - mv.visitLabel(l3); - mv.visitFrame(F_SAME, 0, null, 0, null); - mv.visitIincInsn(5, 1); - mv.visitJumpInsn(GOTO, l0); - mv.visitLabel(l1); - mv.visitFrame(F_CHOP,1, null, 0, null); - mv.visitVarInsn(ILOAD, 4); - mv.visitVarInsn(ALOAD, 3); - mv.visitInsn(ARRAYLENGTH); - Label l4 = new Label(); - mv.visitJumpInsn(IF_ICMPNE, l4); - mv.visitVarInsn(ALOAD, 3); - mv.visitInsn(ARETURN); - mv.visitLabel(l4); - mv.visitFrame(F_SAME, 0, null, 0, null); - mv.visitVarInsn(ILOAD, 4); - mv.visitTypeInsn(ANEWARRAY, SIMPLENAME); - mv.visitVarInsn(ASTORE, 5); - mv.visitInsn(ICONST_0); - mv.visitVarInsn(ISTORE, 4); - mv.visitInsn(ICONST_0); - mv.visitVarInsn(ISTORE, 6); - Label l5 = new Label(); - mv.visitLabel(l5); - mv.visitFrame(F_APPEND,2, new Object[] {SIMPLENAME_ARRAY, INTEGER}, 0, null); - mv.visitVarInsn(ILOAD, 6); - mv.visitVarInsn(ALOAD, 3); - mv.visitInsn(ARRAYLENGTH); - Label l6 = new Label(); - mv.visitJumpInsn(IF_ICMPGE, l6); - mv.visitVarInsn(ALOAD, 3); - mv.visitVarInsn(ILOAD, 6); - mv.visitInsn(AALOAD); - Label l7 = new Label(); - mv.visitJumpInsn(IFNULL, l7); - mv.visitVarInsn(ALOAD, 3); - mv.visitVarInsn(ILOAD, 6); - mv.visitInsn(AALOAD); - mv.visitFieldInsn(GETFIELD, SIMPLENAME, "$generatedBy", ASTNODE); - Label l8 = new Label(); - mv.visitJumpInsn(IFNONNULL, l8); - mv.visitLabel(l7); - mv.visitFrame(F_SAME, 0, null, 0, null); - mv.visitVarInsn(ALOAD, 5); - mv.visitVarInsn(ILOAD, 4); - mv.visitIincInsn(4, 1); - mv.visitVarInsn(ALOAD, 3); - mv.visitVarInsn(ILOAD, 6); - mv.visitInsn(AALOAD); - mv.visitInsn(AASTORE); - mv.visitLabel(l8); - mv.visitFrame(F_SAME, 0, null, 0, null); - mv.visitIincInsn(6, 1); - mv.visitJumpInsn(GOTO, l5); - mv.visitLabel(l6); - mv.visitFrame(F_CHOP,1, null, 0, null); - mv.visitVarInsn(ALOAD, 5); - mv.visitInsn(ARETURN); - mv.visitMaxs(4, 7); - super.visitEnd(); - } - } -} diff --git a/src_eclipseagent/lombok/eclipse/agent/EclipsePatcher.java b/src_eclipseagent/lombok/eclipse/agent/EclipsePatcher.java index c8fdab28..1f36b02a 100644 --- a/src_eclipseagent/lombok/eclipse/agent/EclipsePatcher.java +++ b/src_eclipseagent/lombok/eclipse/agent/EclipsePatcher.java @@ -22,11 +22,15 @@ package lombok.eclipse.agent; import java.lang.instrument.Instrumentation; +import java.util.Collection; +import java.util.Collections; +import java.util.List; import lombok.patcher.Hook; import lombok.patcher.MethodTarget; import lombok.patcher.ScriptManager; import lombok.patcher.StackRequest; +import lombok.patcher.TargetMatcher; import lombok.patcher.equinox.EquinoxClassLoader; import lombok.patcher.scripts.ScriptBuilder; @@ -59,17 +63,6 @@ public class EclipsePatcher { .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.ast.CompilationUnitDeclaration") .fieldName("$lombokAST").fieldType("Ljava/lang/Object;") @@ -114,6 +107,62 @@ public class EclipsePatcher { .decisionMethod(new Hook("lombok/eclipse/agent/PatchFixes", "checkBit24", "(Ljava/lang/Object;)Z")) .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.wrapReturnValue() + .target(new TargetMatcher() { + @Override public boolean matches(String classSpec, String methodName, String descriptor) { + if (!"convert".equals(methodName)) return false; + + List fullDesc = MethodTarget.decomposeFullDesc(descriptor); + if ("V".equals(fullDesc.get(0))) return false; + return fullDesc.size() == 2; + } + + @Override public Collection getAffectedClasses() { + return Collections.singleton("org.eclipse.jdt.core.dom.ASTConverter"); + } + }).request(StackRequest.PARAM1, StackRequest.RETURN_VALUE) + .wrapMethod(new Hook("lombok/eclipse/agent/PatchFixes", "setIsGeneratedFlag", + "(Lorg/eclipse/jdt/core/dom/ASTNode;Lorg/eclipse/jdt/internal/compiler/ast/ASTNode;)V")) + .transplant().build()); + + sm.addScript(ScriptBuilder.wrapMethodCall() + .target(new TargetMatcher() { + @Override public boolean matches(String classSpec, String methodName, String descriptor) { + if (!methodName.startsWith("convert")) return false; + + List fullDesc = MethodTarget.decomposeFullDesc(descriptor); + if (fullDesc.size() < 2) return false; + if (!fullDesc.get(1).startsWith("Lorg/eclipse/jdt/internal/compiler/ast/")) return false; + + return true; + } + + @Override public Collection getAffectedClasses() { + return Collections.singleton("org.eclipse.jdt.core.dom.ASTConverter"); + } + }).methodToWrap(new Hook("org/eclipse/jdt/core/dom/SimpleName", "", "(Lorg/eclipse/jdt/core/dom/AST;)V")) + .requestExtra(StackRequest.PARAM1) + .replacementMethod(new Hook("lombok/eclipse/agent/PatchFixes", "setIsGeneratedFlagForSimpleName", + "(Lorg/eclipse/jdt/core/dom/SimpleName;Ljava/lang/Object;)V")) + .transplant().build()); + + sm.addScript(ScriptBuilder.wrapReturnValue() + .target(new MethodTarget("org.eclipse.jdt.internal.corext.dom.LinkedNodeFinder", "findByNode")) + .wrapMethod(new Hook("lombok/eclipse/agent/PatchFixes", "removeGeneratedSimpleNames", + "([Lorg/eclipse/jdt/core/dom/SimpleName;)[Lorg/eclipse/jdt/core/dom/SimpleName;")) + .request(StackRequest.RETURN_VALUE).build()); + if (reloadExistingClasses) sm.reloadClasses(instrumentation); } } diff --git a/src_eclipseagent/lombok/eclipse/agent/EclipseTransformer.java b/src_eclipseagent/lombok/eclipse/agent/EclipseTransformer.java deleted file mode 100644 index 31f8413f..00000000 --- a/src_eclipseagent/lombok/eclipse/agent/EclipseTransformer.java +++ /dev/null @@ -1,8 +0,0 @@ -package lombok.eclipse.agent; - -public interface EclipseTransformer { - /** slash and not dot separated */ - String getTargetClassName(); - - byte[] transform(byte[] in); -} diff --git a/src_eclipseagent/lombok/eclipse/agent/PatchFixes.java b/src_eclipseagent/lombok/eclipse/agent/PatchFixes.java index e36823b2..3ec5af90 100644 --- a/src_eclipseagent/lombok/eclipse/agent/PatchFixes.java +++ b/src_eclipseagent/lombok/eclipse/agent/PatchFixes.java @@ -1,5 +1,9 @@ package lombok.eclipse.agent; +import java.lang.reflect.Field; + +import org.eclipse.jdt.core.dom.SimpleName; + public class PatchFixes { public static int fixRetrieveStartingCatchPosition(int in) { return in; @@ -11,4 +15,37 @@ public class PatchFixes { int bits = (Integer)(node.getClass().getField("bits").get(node)); return (bits & BIT24) != 0; } + + public static void setIsGeneratedFlag(org.eclipse.jdt.core.dom.ASTNode domNode, + org.eclipse.jdt.internal.compiler.ast.ASTNode internalNode) throws Exception { + boolean isGenerated = internalNode.getClass().getField("$generatedBy").get(internalNode) != null; + if (isGenerated) domNode.getClass().getField("$isGenerated").set(domNode, true); + } + + public static void setIsGeneratedFlagForSimpleName(SimpleName name, Object internalNode) throws Exception { + System.out.println("Setting isGenerated on SimpleName"); + if (internalNode instanceof org.eclipse.jdt.internal.compiler.ast.ASTNode) { + if (internalNode.getClass().getField("$generatedBy").get(internalNode) != null) { + name.getClass().getField("$isGenerated").set(name, true); + } + } + } + + public static SimpleName[] removeGeneratedSimpleNames(SimpleName[] in) throws Exception { + System.out.print("Removing is generated..."); + Field f = SimpleName.class.getField("$isGenerated"); + + int count = 0; + for (int i = 0; i < in.length; i++) { + if ( in[i] == null || !((Boolean)f.get(in[i])).booleanValue() ) count++; + } + System.out.println("" + (in.length - count)); + if (count == in.length) return in; + SimpleName[] newSimpleNames = new SimpleName[count]; + count = 0; + for (int i = 0; i < in.length; i++) { + if ( in[i] == null || !((Boolean)f.get(in[i])).booleanValue() ) newSimpleNames[count++] = in[i]; + } + return newSimpleNames; + } } -- cgit From 23da5b1e80bd03ee3fc02b7d7ee03130f158e7c4 Mon Sep 17 00:00:00 2001 From: Reinier Zwitserloot Date: Wed, 7 Oct 2009 23:53:50 +0200 Subject: New version of lombok-patcher. --- lib/eclipse.agent/lombok-patcher.jar | Bin 1488746 -> 1489463 bytes 1 file changed, 0 insertions(+), 0 deletions(-) (limited to 'lib') diff --git a/lib/eclipse.agent/lombok-patcher.jar b/lib/eclipse.agent/lombok-patcher.jar index 0e15ac17..7818fc1d 100644 Binary files a/lib/eclipse.agent/lombok-patcher.jar and b/lib/eclipse.agent/lombok-patcher.jar differ -- cgit