aboutsummaryrefslogtreecommitdiff
path: root/src/lombok/apt
diff options
context:
space:
mode:
Diffstat (limited to 'src/lombok/apt')
-rw-r--r--src/lombok/apt/AnnotationTransponder.java111
-rw-r--r--src/lombok/apt/HandleANY_ecj.java17
-rw-r--r--src/lombok/apt/HandleGetter_javac.java77
-rw-r--r--src/lombok/apt/HandlerForCompiler.java16
-rw-r--r--src/lombok/apt/PKG.java70
-rw-r--r--src/lombok/apt/Processor.java35
6 files changed, 0 insertions, 326 deletions
diff --git a/src/lombok/apt/AnnotationTransponder.java b/src/lombok/apt/AnnotationTransponder.java
deleted file mode 100644
index 01a79c12..00000000
--- a/src/lombok/apt/AnnotationTransponder.java
+++ /dev/null
@@ -1,111 +0,0 @@
-package lombok.apt;
-
-import static lombok.apt.PKG.CURRENT_SUPPORT;
-import static lombok.apt.PKG.isInstanceOf;
-import static lombok.apt.PKG.readResource;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Constructor;
-
-import javax.annotation.processing.ProcessingEnvironment;
-import javax.annotation.processing.RoundEnvironment;
-import javax.lang.model.element.Element;
-import javax.tools.Diagnostic;
-
-/**
- * Responsible for redirecting the need to handle an annotation to a class that knows how to handle a given annotation type in a given compiler environment.
- * Will dynamically locate a class in this package using the naming pattern: "HandleFoo_compilerType", e.g. "HandleGetter_ecj".
- * Responsible for injecting the proper class into the right classloader so that it has open access to the classes required to inspect the live AST and
- * modify it so that annotations can cause changes to the live AST.
- *
- * @author rzwitserloot
- *
- * @param <T> The annotation class that this transponder should handle (example: Getter.class).
- */
-public class AnnotationTransponder<T extends Annotation> {
- private HandlerForCompiler<T> impl;
- private final ProcessingEnvironment processEnv;
- private final RoundEnvironment roundEnv;
- private String error;
-
- @SuppressWarnings("unchecked")
- private void createInstance(Class<T> annotation, ClassLoader loader, String compilerType) {
- try {
- if ( loader == null ) loader = AnnotationTransponder.class.getClassLoader();
- Class<?> implClass;
- try {
- implClass = loader.loadClass(String.format(
- "org.javanext.apt.Handle%s_%s", annotation.getSimpleName(), compilerType));
- } catch ( ClassNotFoundException e ) {
- implClass = loader.loadClass(String.format("lombok.apt.HandleANY_%s", compilerType));
- }
-
- Constructor<?> constructor;
-
- constructor = implClass.getDeclaredConstructor();
- constructor.setAccessible(true);
- impl = (HandlerForCompiler<T>)constructor.newInstance();
- impl.processEnv = processEnv;
- impl.roundEnv = roundEnv;
- try {
- impl.init();
- } catch ( Exception e ) {
- error = "Exception initializing handler: " + e;
- impl = null;
- }
- } catch ( Exception e ) {
- e.printStackTrace();
- error = "You are using " + compilerType + " but a version that's changed the compiler internals. I can't work with it.";
- }
- }
-
- public AnnotationTransponder(Class<T> annotation, RoundEnvironment roundEnv, ProcessingEnvironment processEnv) {
- this.processEnv = processEnv;
- this.roundEnv = roundEnv;
- if ( isInstanceOf(processEnv, "com.sun.tools.javac.processing.JavacProcessingEnvironment") ) {
- createInstance(annotation, null, "javac");
- } else if ( isInstanceOf(processEnv, "org.eclipse.jdt.internal.apt.pluggable.core.dispatch.IdeBuildProcessingEnvImpl") ) {
- final ClassLoader[] parentLoaders =
- new ClassLoader[] { processEnv.getClass().getClassLoader(), AnnotationTransponder.class.getClassLoader() };
-
- ClassLoader loader = new ClassLoader() {
- @Override public Class<?> findClass(String name) throws ClassNotFoundException {
- if ( name.equals(HandlerForCompiler.class.getName()) ) return HandlerForCompiler.class;
- if ( name.startsWith(AnnotationTransponder.class.getPackage().getName()) ) {
- byte[] data = readResource(name.replace(".", "/") + ".class");
- return defineClass(name, data, 0, data.length);
- }
- for ( int i = 0 ; i < parentLoaders.length ; i++ ) {
- try {
- return parentLoaders[i].loadClass(name);
- } catch ( ClassNotFoundException e ) {
- if ( i == parentLoaders.length -1 ) throw e;
- }
- }
-
- return null;
- }
- };
-
- createInstance(annotation, loader, "ecj");
- } else {
- impl = null;
- this.error = "I cannot work with your compiler. I currently only support " + CURRENT_SUPPORT + ".\n" +
- "This is a: " + processEnv.getClass();
- }
- }
-
-
- public void handle(Element element, T annotation) {
- if ( impl == null ) {
- processEnv.getMessager().printMessage(Diagnostic.Kind.WARNING, error, element);
- } else {
- try {
- impl.handle(element, annotation);
- } catch ( Exception e ) {
- e.printStackTrace();
- processEnv.getMessager().printMessage(Diagnostic.Kind.WARNING, "Exception in JavaNext: " + e, element);
- }
- }
- }
-}
diff --git a/src/lombok/apt/HandleANY_ecj.java b/src/lombok/apt/HandleANY_ecj.java
deleted file mode 100644
index 587444d9..00000000
--- a/src/lombok/apt/HandleANY_ecj.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package lombok.apt;
-
-import java.lang.annotation.Annotation;
-
-import javax.lang.model.element.Element;
-import javax.tools.Diagnostic;
-
-public class HandleANY_ecj extends HandlerForCompiler<Annotation> {
- @Override public void handle(Element element, Annotation annotation) throws Exception {
- //TODO: We should find eclipse's eclipse.ini file and patch us in as a javaagent and bootclasspath/a.
- //Though, we should probably use reflection to find eclipse's SWT system and generate a popup dialog for
- //confirmation.
-
- String msg = "You'll need to install the eclipse patch. See http://lombok.github.org/ for more info.";
- processEnv.getMessager().printMessage(Diagnostic.Kind.WARNING, msg, element);
- }
-}
diff --git a/src/lombok/apt/HandleGetter_javac.java b/src/lombok/apt/HandleGetter_javac.java
deleted file mode 100644
index bfa2746d..00000000
--- a/src/lombok/apt/HandleGetter_javac.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package lombok.apt;
-
-import java.lang.reflect.Modifier;
-
-import javax.annotation.processing.Messager;
-import javax.lang.model.element.Element;
-import javax.lang.model.element.TypeElement;
-import javax.tools.Diagnostic;
-
-import lombok.Getter;
-
-import com.sun.source.tree.MethodTree;
-import com.sun.source.util.Trees;
-import com.sun.tools.javac.code.Symbol;
-import com.sun.tools.javac.code.Type;
-import com.sun.tools.javac.processing.JavacProcessingEnvironment;
-import com.sun.tools.javac.tree.JCTree;
-import com.sun.tools.javac.tree.TreeMaker;
-import com.sun.tools.javac.tree.JCTree.JCAnnotation;
-import com.sun.tools.javac.tree.JCTree.JCBlock;
-import com.sun.tools.javac.tree.JCTree.JCClassDecl;
-import com.sun.tools.javac.tree.JCTree.JCExpression;
-import com.sun.tools.javac.tree.JCTree.JCStatement;
-import com.sun.tools.javac.tree.JCTree.JCTypeParameter;
-import com.sun.tools.javac.tree.JCTree.JCVariableDecl;
-import com.sun.tools.javac.util.List;
-import com.sun.tools.javac.util.Name;
-
-class HandleGetter_javac extends HandlerForCompiler<Getter> {
- private final Trees trees;
- private final Messager messager;
- private JavacProcessingEnvironment env;
-
- HandleGetter_javac() {
- this.messager = processEnv.getMessager();
- this.trees = Trees.instance(processEnv);
- }
-
- @Override public void init() {
- this.env = (JavacProcessingEnvironment)processEnv;
- }
-
- @Override public void handle(Element element, Getter getter) {
- if ( !element.getKind().isField() ) {
- messager.printMessage(Diagnostic.Kind.ERROR, "@Getter is only supported on a field.");
- return;
- }
-
- TypeElement classElement = (TypeElement)element.getEnclosingElement();
- JCClassDecl javacClassTree = (JCClassDecl)trees.getTree(classElement);
-
- Name.Table nameTable = Name.Table.instance(env.getContext());
- TreeMaker treeMaker = TreeMaker.instance(env.getContext());
-
- MethodTree getterMethod = createGetter(element, treeMaker, nameTable);
- javacClassTree.defs = javacClassTree.defs.append((JCTree)getterMethod);
- }
-
- private MethodTree createGetter(Element field, TreeMaker treeMaker, Name.Table nameTable) {
- JCStatement returnStatement = treeMaker.Return(treeMaker.Ident((Symbol)field));
-
- //TODO Trab the position in the source file of the field by looking it up in the JCClassDecl,
- //and copy it into the 'position' info for the Ident and Return AST Nodes.
-
- JCBlock methodBody = treeMaker.Block(0, List.of(returnStatement));
- Name methodName = Name.fromString(nameTable, PKG.toGetterName(field));
- JCExpression methodType = treeMaker.Type((Type)field.asType());
-
- List<JCTypeParameter> methodGenericParams = List.nil();
- List<JCVariableDecl> parameters = List.nil();
- List<JCExpression> throwsClauses = List.nil();
- JCExpression annotationMethodDefaultValue = null;
-
- return treeMaker.MethodDef(treeMaker.Modifiers(Modifier.PUBLIC, List.<JCAnnotation>nil()), methodName, methodType,
- methodGenericParams, parameters, throwsClauses, methodBody, annotationMethodDefaultValue);
- }
-}
diff --git a/src/lombok/apt/HandlerForCompiler.java b/src/lombok/apt/HandlerForCompiler.java
deleted file mode 100644
index 7eb29385..00000000
--- a/src/lombok/apt/HandlerForCompiler.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package lombok.apt;
-
-import java.lang.annotation.Annotation;
-
-import javax.annotation.processing.ProcessingEnvironment;
-import javax.annotation.processing.RoundEnvironment;
-import javax.lang.model.element.Element;
-
-public abstract class HandlerForCompiler<T extends Annotation> {
- protected ProcessingEnvironment processEnv;
- protected RoundEnvironment roundEnv;
-
- public void init() throws Exception {}
-
- public abstract void handle(Element element, T annotation) throws Exception;
-}
diff --git a/src/lombok/apt/PKG.java b/src/lombok/apt/PKG.java
deleted file mode 100644
index 2808e31e..00000000
--- a/src/lombok/apt/PKG.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package lombok.apt;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-import javax.lang.model.element.Element;
-import javax.lang.model.type.TypeKind;
-
-import lombok.Lombok;
-import lombok.core.TransformationsUtil;
-
-
-class PKG {
- static final String CURRENT_SUPPORT = "javac 1.6 and eclipse (ecj).";
-
- private PKG() {}
-
- static boolean isInstanceOf(Object o, String className) {
- if ( o == null ) return false;
- return isInstanceOf(o.getClass(), className);
- }
-
- static boolean isInstanceOf(Class<?> c, String className) {
- if ( c == Object.class || c == null ) return false;
-
- if ( c.getName().equals(className) ) return true;
-
- if ( isInstanceOf(c.getSuperclass(), className) ) return true;
- for ( Class<?> iface : c.getInterfaces() ) {
- if ( isInstanceOf(iface, className) ) return true;
- }
-
- return false;
- }
-
- static byte[] readResource(String name) {
- return readResource(PKG.class.getClassLoader(), name);
- }
-
- static byte[] readResource(ClassLoader loader, String name) {
- InputStream in = loader.getResourceAsStream(name);
- if ( in == null ) throw Lombok.sneakyThrow(new IOException("Not found: " + name));
-
- try {
- return readStream(in);
- } catch (IOException e) {
- throw Lombok.sneakyThrow(e);
- }
- }
-
- static String toGetterName(Element field) {
- CharSequence fieldName = field.getSimpleName();
-
- boolean isBoolean = field.asType().getKind() == TypeKind.BOOLEAN;
-
- return TransformationsUtil.toGetterName(fieldName, isBoolean);
- }
-
- static byte[] readStream(InputStream in) throws IOException {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- byte[] b = new byte[65536];
- while ( true ) {
- int r = in.read(b);
- if ( r == -1 ) break;
- if ( r > 0 ) baos.write(b, 0, r);
- }
- return baos.toByteArray();
- }
-}
diff --git a/src/lombok/apt/Processor.java b/src/lombok/apt/Processor.java
deleted file mode 100644
index d63ec006..00000000
--- a/src/lombok/apt/Processor.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package lombok.apt;
-
-import java.lang.annotation.Annotation;
-import java.util.Set;
-
-import javax.annotation.processing.AbstractProcessor;
-import javax.annotation.processing.RoundEnvironment;
-import javax.annotation.processing.SupportedAnnotationTypes;
-import javax.annotation.processing.SupportedSourceVersion;
-import javax.lang.model.SourceVersion;
-import javax.lang.model.element.Element;
-import javax.lang.model.element.TypeElement;
-
-import lombok.Getter;
-
-
-@SupportedAnnotationTypes("lombok.*")
-@SupportedSourceVersion(SourceVersion.RELEASE_6)
-public class Processor extends AbstractProcessor {
- @Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
- for ( TypeElement typeElement : annotations ) {
- if ( typeElement.getQualifiedName().contentEquals(Getter.class.getName()) )
- return handle(roundEnv, Getter.class, typeElement);
- }
-
- return false;
- }
-
- private <T extends Annotation> boolean handle(RoundEnvironment roundEnv, Class<T> annotation, TypeElement typeElement) {
- for ( Element element : roundEnv.getElementsAnnotatedWith(typeElement) ) {
- new AnnotationTransponder<T>(annotation, roundEnv, processingEnv).handle(element, element.getAnnotation(annotation));
- }
- return true;
- }
-}