diff options
author | Reinier Zwitserloot <reinier@tipit.to> | 2009-09-23 07:44:13 +0200 |
---|---|---|
committer | Reinier Zwitserloot <reinier@tipit.to> | 2009-09-23 07:44:13 +0200 |
commit | 21717cec11d5a8abdc3eba280290a65103bbeaf7 (patch) | |
tree | e18670cc2fb662d3e3069ed9632de23131e8ec46 /src_eclipseagent/lombok/eclipse/agent/EclipseASTNodeTransformer.java | |
parent | 21ea5eeca8448c8880a3f2d975dee3107e3175b3 (diff) | |
download | lombok-21717cec11d5a8abdc3eba280290a65103bbeaf7.tar.gz lombok-21717cec11d5a8abdc3eba280290a65103bbeaf7.tar.bz2 lombok-21717cec11d5a8abdc3eba280290a65103bbeaf7.zip |
BIIG change to the eclipse agent: Now all patcher classes represent themselves via SPI. LinkedNOdeFinderTransformer is broken.
Diffstat (limited to 'src_eclipseagent/lombok/eclipse/agent/EclipseASTNodeTransformer.java')
-rw-r--r-- | src_eclipseagent/lombok/eclipse/agent/EclipseASTNodeTransformer.java | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/src_eclipseagent/lombok/eclipse/agent/EclipseASTNodeTransformer.java b/src_eclipseagent/lombok/eclipse/agent/EclipseASTNodeTransformer.java new file mode 100644 index 00000000..e27aa08c --- /dev/null +++ b/src_eclipseagent/lombok/eclipse/agent/EclipseASTNodeTransformer.java @@ -0,0 +1,68 @@ +/* + * 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 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.FieldVisitor; +import org.objectweb.asm.Opcodes; + +/** + * Transforms Eclipse's {@code org.eclipse.jdt.internal.compiler.ast.ASTNode} class, + * which is the super-class of all AST Node class for Eclipse. + * + * Transformations applied:<ul> + * <li>A field is added: 'public transient ASTNode $generatedBy = null;'. It is set to something other than {@code null} if + * this node is generated; the reference then points at the node that is responsible for its generation (example: a {@code @Data} annotation).</li></ul> + */ +@ProviderFor(EclipseTransformer.class) +public class EclipseASTNodeTransformer implements EclipseTransformer { + private static final String ASTNODE = "org/eclipse/jdt/internal/compiler/ast/ASTNode"; + + public byte[] transform(byte[] classfileBuffer) { + ClassReader reader = new ClassReader(classfileBuffer); + ClassWriter writer = new ClassWriter(reader, 0); + + ClassAdapter adapter = new ASTNodePatcherAdapter(writer); + reader.accept(adapter, 0); + return writer.toByteArray(); + } + + private static class ASTNodePatcherAdapter extends ClassAdapter { + ASTNodePatcherAdapter(ClassVisitor cv) { + super(cv); + } + + @Override public void visitEnd() { + FieldVisitor fv = cv.visitField(Opcodes.ACC_PUBLIC | Opcodes.ACC_TRANSIENT, "$generatedBy", "L" + ASTNODE + ";", null, null); + fv.visitEnd(); + cv.visitEnd(); + } + } + + @Override public String getTargetClassName() { + return ASTNODE; + } +} |