diff options
author | Reinier Zwitserloot <reinier@tipit.to> | 2009-06-12 03:40:07 +0200 |
---|---|---|
committer | Reinier Zwitserloot <reinier@tipit.to> | 2009-06-12 03:40:07 +0200 |
commit | e84bdd32e71b029d8d1f2fa7849e998953984f47 (patch) | |
tree | d3e7ff61b9d1b84de36b5d41496f5436d853d114 /src_eclipseagent/java/lombok/ClassLoaderWorkaround.java | |
parent | 4c18c774fc60eca7e104b3eaa5535ce94ec66198 (diff) | |
download | lombok-e84bdd32e71b029d8d1f2fa7849e998953984f47.tar.gz lombok-e84bdd32e71b029d8d1f2fa7849e998953984f47.tar.bz2 lombok-e84bdd32e71b029d8d1f2fa7849e998953984f47.zip |
Singularly massive code change, too hard to document. Basically, hooking now occurs in the two most sane places:
- After the parser is done building a first rendition of the AST. (Usually lightweight and missing method bodies etc)
- After the parser is done taking such a lightweight AST and filling in the gaps.
Lombok then builts its own bidirectional and somewhat saner AST out of this, and hands this saner AST off for treatment. Things in the AST can be marked as 'handled'.
This seems to work swimmingly and should allow us to easily identify the annotations that are for us, and work our magic, no matter where they appear or on what, including
stuff inside method bodies.
Diffstat (limited to 'src_eclipseagent/java/lombok/ClassLoaderWorkaround.java')
-rw-r--r-- | src_eclipseagent/java/lombok/ClassLoaderWorkaround.java | 49 |
1 files changed, 20 insertions, 29 deletions
diff --git a/src_eclipseagent/java/lombok/ClassLoaderWorkaround.java b/src_eclipseagent/java/lombok/ClassLoaderWorkaround.java index 0238b592..a3fc1521 100644 --- a/src_eclipseagent/java/lombok/ClassLoaderWorkaround.java +++ b/src_eclipseagent/java/lombok/ClassLoaderWorkaround.java @@ -3,8 +3,10 @@ package java.lombok; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; + /** * Allows you to inject the lombok classes into any classloader, even if that classloader does not * know how to find the lombok classes. @@ -14,35 +16,32 @@ import java.lang.reflect.Method; * @author rzwitserloot */ public class ClassLoaderWorkaround { - private static boolean initialized; - private static Method transformCompilationUnitDeclaration; - private static Method transformMethodDeclaration; - private static Method transformConstructorDeclaration; - private static Method transformInitializer; - - public static void transformCompilationUnitDeclaration(Object parser, Object cud) throws Exception { - initialize(cud); - transformCompilationUnitDeclaration.invoke(null, parser, cud); + static RuntimeException sneakyThrow(Throwable t) { + if ( t == null ) throw new NullPointerException("t"); + ClassLoaderWorkaround.<RuntimeException>sneakyThrow0(t); + return null; } - public static void transformMethodDeclaration(Object parser, Object methodDeclaration) throws Exception { - initialize(methodDeclaration); - transformMethodDeclaration.invoke(null, parser, methodDeclaration); + @SuppressWarnings("unchecked") + private static <T extends Throwable> void sneakyThrow0(Throwable t) throws T { + throw (T)t; } - public static void transformConstructorDeclaration(Object parser, Object constructorDeclaration) throws Exception { - initialize(constructorDeclaration); - transformConstructorDeclaration.invoke(null, parser, constructorDeclaration); - } + private static boolean initialized; + private static Method transform; - public static void transformInitializer(Object parser, Object initializer) throws Exception { - initialize(initializer); - transformInitializer.invoke(null, parser, initializer); + public static void transformCompilationUnitDeclaration(Object parser, Object cud) throws Exception { + initialize(cud); + try { + transform.invoke(null, parser, cud); + } catch ( InvocationTargetException e ) { + throw sneakyThrow(e.getCause()); + } } private static void initialize(Object cud) throws ClassNotFoundException { if ( initialized ) { - if ( transformInitializer == null ) throw new ClassNotFoundException("lombok.eclipse.TransformEclipseAST"); + if ( transform == null ) throw new ClassNotFoundException("lombok.eclipse.TransformEclipseAST"); return; } @@ -87,15 +86,7 @@ public class ClassLoaderWorkaround { Class<?> c = loader.loadClass("lombok.eclipse.TransformEclipseAST"); for ( Method m : c.getMethods() ) { if ( m.getName().equals("transform") ) { - if ( m.getParameterTypes().length >= 2 ) { - Class<?> astType = m.getParameterTypes()[1]; - String astName = astType.getName(); - astName = astName.substring(astName.lastIndexOf('.') + 1); - if ( astName.equals("CompilationUnitDeclaration") ) transformCompilationUnitDeclaration = m; - else if ( astName.equals("MethodDeclaration") ) transformMethodDeclaration = m; - else if ( astName.equals("ConstructorDeclaration") ) transformConstructorDeclaration = m; - else if ( astName.equals("Initializer") ) transformInitializer = m; - } + transform = m; } } } catch ( ClassNotFoundException ignore ) {} |