Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package org.javanext.apt;
- import javax.tools.Diagnostic;
- import javax.annotation.processing.Messager;
- import javax.annotation.processing.ProcessingEnvironment;
- import javax.lang.model.element.Element;
- import javax.lang.model.element.TypeElement;
- import javax.lang.model.type.TypeKind;
- import org.javanext.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;
- public class HandleGetter {
- private final JavacProcessingEnvironment env;
- private final Trees trees;
- private final Messager messager;
- public HandleGetter(ProcessingEnvironment env) {
- this.messager = env.getMessager();
- if ( env instanceof JavacProcessingEnvironment ) this.env = (JavacProcessingEnvironment)env;
- else {
- this.env = null;
- this.trees = null;
- messager.printMessage(Diagnostic.Kind.ERROR, "I only work with JavacProcessingEnvironment. Perhaps you aren't compiling with javac?");
- return;
- }
- this.trees = Trees.instance(env);
- }
- 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));
- JCBlock methodBody = treeMaker.Block(0, com.sun.tools.javac.util.List.of(returnStatement));
- Name methodName = Name.fromString(nameTable, toGetterName(field));
- JCExpression methodType = treeMaker.Type((Type)field.asType());
- List<JCTypeParameter> returnTypeGenerics = List.nil();
- List<JCVariableDecl> parameters = List.nil();
- List<JCExpression> throwsClauses = List.nil();
- MethodTree method = treeMaker.MethodDef(treeMaker.Modifiers(1L, List.<JCAnnotation>nil()), methodName, methodType,
- returnTypeGenerics, parameters, throwsClauses, methodBody, null);
- return method;
- }
- private static String toGetterName(Element element) {
- CharSequence fieldName = element.getSimpleName();
- if ( fieldName.length() == 0 ) return "get";
- final String prefix, suffix;
- if ( element.asType().getKind() == TypeKind.BOOLEAN || "java.lang.Boolean".equals(element.asType().toString()) ) prefix = "is";
- else prefix = "get";
- char first = fieldName.charAt(0);
- if ( Character.isLowerCase(first) )
- suffix = String.format("%s%s", Character.toTitleCase(first), fieldName.subSequence(1, fieldName.length()));
- else suffix = fieldName.toString();
- return String.format("%s%s", prefix, suffix);
- }
- }
Add Comment
Please, Sign In to add comment