aboutsummaryrefslogtreecommitdiff
path: root/src_eclipseagent/lombok/agent/eclipse/EclipseParserPatcher.java
diff options
context:
space:
mode:
authorReinier Zwitserloot <reinier@tipit.to>2009-06-09 18:27:10 +0200
committerReinier Zwitserloot <reinier@tipit.to>2009-06-09 18:27:10 +0200
commit41fb7cba62b543243c784757d1af4e05824ddc4e (patch)
treeb910a78f31576d08f7a95440edb8f630cf4164eb /src_eclipseagent/lombok/agent/eclipse/EclipseParserPatcher.java
parent525211b872b982b880aa2bed5e263ec582593f0d (diff)
downloadlombok-41fb7cba62b543243c784757d1af4e05824ddc4e.tar.gz
lombok-41fb7cba62b543243c784757d1af4e05824ddc4e.tar.bz2
lombok-41fb7cba62b543243c784757d1af4e05824ddc4e.zip
Many changes:
- Split off the actual agent work into a separate src package in preparation for creating separate jars. Involved a lot of renaming - Renamed TransformCompilationUnitDeclaration to TransformEclipseAST, as this class will also be transforming e.g. MethodDeclaration objects. - Expanded the patching to also patch in transform calls when the parser fills in the Statement array for existing constructors, methods, and initializers. - Redesigned the ClassLoaderWorkaround class quite a bit. - Positioning should not work correctly ('jump to method' should jump to the getter annotation). (Apparently, Clinit objects are always fully parsed in the original run, so no need to patch anything there).
Diffstat (limited to 'src_eclipseagent/lombok/agent/eclipse/EclipseParserPatcher.java')
-rw-r--r--src_eclipseagent/lombok/agent/eclipse/EclipseParserPatcher.java47
1 files changed, 47 insertions, 0 deletions
diff --git a/src_eclipseagent/lombok/agent/eclipse/EclipseParserPatcher.java b/src_eclipseagent/lombok/agent/eclipse/EclipseParserPatcher.java
new file mode 100644
index 00000000..abe26683
--- /dev/null
+++ b/src_eclipseagent/lombok/agent/eclipse/EclipseParserPatcher.java
@@ -0,0 +1,47 @@
+package lombok.agent.eclipse;
+
+import java.lang.instrument.ClassFileTransformer;
+import java.lang.instrument.IllegalClassFormatException;
+import java.lang.instrument.Instrumentation;
+import java.lang.instrument.UnmodifiableClassException;
+import java.security.ProtectionDomain;
+
+public class EclipseParserPatcher {
+ private static class Patcher implements ClassFileTransformer {
+ @Override public byte[] transform(ClassLoader loader, String className,
+ Class<?> classBeingRedefined,
+ ProtectionDomain protectionDomain, byte[] classfileBuffer)
+ throws IllegalClassFormatException {
+
+ if ( !ECLIPSE_PARSER_CLASS_NAME.equals(className) ) return null;
+ EclipseParserTransformer transformer = new EclipseParserTransformer(classfileBuffer);
+ return transformer.transform();
+ }
+ }
+
+ static final String ECLIPSE_PARSER_CLASS_NAME = "org/eclipse/jdt/internal/compiler/parser/Parser";
+
+ public static void agentmain(String agentArgs, Instrumentation instrumentation) {
+ registerPatcher(instrumentation, true);
+ }
+
+ public static void premain(String agentArgs, Instrumentation instrumentation) {
+ registerPatcher(instrumentation, false);
+ }
+
+ private static void registerPatcher(Instrumentation instrumentation, boolean transformExisting) {
+ instrumentation.addTransformer(new Patcher(), true);
+
+ if ( transformExisting ) for ( Class<?> c : instrumentation.getAllLoadedClasses() ) {
+ if ( c.getName().equals(ECLIPSE_PARSER_CLASS_NAME) ) {
+ try {
+ instrumentation.retransformClasses(c);
+ } catch ( UnmodifiableClassException ex ) {
+ 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.");
+ }
+ }
+ }
+ }
+}