Guest User

Untitled

a guest
Jun 19th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.67 KB | None | 0 0
  1. package org.javanext.apt;
  2.  
  3. import javax.tools.Diagnostic;
  4.  
  5. import javax.annotation.processing.Messager;
  6. import javax.annotation.processing.ProcessingEnvironment;
  7. import javax.lang.model.element.Element;
  8. import javax.lang.model.element.TypeElement;
  9. import javax.lang.model.type.TypeKind;
  10.  
  11. import org.javanext.Getter;
  12.  
  13. import com.sun.source.tree.MethodTree;
  14. import com.sun.source.util.Trees;
  15. import com.sun.tools.javac.code.Symbol;
  16. import com.sun.tools.javac.code.Type;
  17. import com.sun.tools.javac.processing.JavacProcessingEnvironment;
  18. import com.sun.tools.javac.tree.JCTree;
  19. import com.sun.tools.javac.tree.TreeMaker;
  20. import com.sun.tools.javac.tree.JCTree.JCAnnotation;
  21. import com.sun.tools.javac.tree.JCTree.JCBlock;
  22. import com.sun.tools.javac.tree.JCTree.JCClassDecl;
  23. import com.sun.tools.javac.tree.JCTree.JCExpression;
  24. import com.sun.tools.javac.tree.JCTree.JCStatement;
  25. import com.sun.tools.javac.tree.JCTree.JCTypeParameter;
  26. import com.sun.tools.javac.tree.JCTree.JCVariableDecl;
  27. import com.sun.tools.javac.util.List;
  28. import com.sun.tools.javac.util.Name;
  29.  
  30. public class HandleGetter {
  31. private final JavacProcessingEnvironment env;
  32. private final Trees trees;
  33. private final Messager messager;
  34.  
  35. public HandleGetter(ProcessingEnvironment env) {
  36. this.messager = env.getMessager();
  37.  
  38. if ( env instanceof JavacProcessingEnvironment ) this.env = (JavacProcessingEnvironment)env;
  39. else {
  40. this.env = null;
  41. this.trees = null;
  42. messager.printMessage(Diagnostic.Kind.ERROR, "I only work with JavacProcessingEnvironment. Perhaps you aren't compiling with javac?");
  43. return;
  44. }
  45.  
  46. this.trees = Trees.instance(env);
  47. }
  48.  
  49. public void handle(Element element, Getter getter) {
  50. if ( !element.getKind().isField() ) {
  51. messager.printMessage(Diagnostic.Kind.ERROR, "@Getter is only supported on a field.");
  52. return;
  53. }
  54.  
  55. TypeElement classElement = (TypeElement)element.getEnclosingElement();
  56. JCClassDecl javacClassTree = (JCClassDecl)trees.getTree(classElement);
  57.  
  58. Name.Table nameTable = Name.Table.instance(env.getContext());
  59. TreeMaker treeMaker = TreeMaker.instance(env.getContext());
  60.  
  61. MethodTree getterMethod = createGetter(element, treeMaker, nameTable);
  62. javacClassTree.defs = javacClassTree.defs.append((JCTree)getterMethod);
  63. }
  64.  
  65. private MethodTree createGetter(Element field, TreeMaker treeMaker, Name.Table nameTable) {
  66. JCStatement returnStatement = treeMaker.Return(treeMaker.Ident((Symbol)field));
  67. JCBlock methodBody = treeMaker.Block(0, com.sun.tools.javac.util.List.of(returnStatement));
  68. Name methodName = Name.fromString(nameTable, toGetterName(field));
  69. JCExpression methodType = treeMaker.Type((Type)field.asType());
  70.  
  71. List<JCTypeParameter> returnTypeGenerics = List.nil();
  72. List<JCVariableDecl> parameters = List.nil();
  73. List<JCExpression> throwsClauses = List.nil();
  74.  
  75. MethodTree method = treeMaker.MethodDef(treeMaker.Modifiers(1L, List.<JCAnnotation>nil()), methodName, methodType,
  76. returnTypeGenerics, parameters, throwsClauses, methodBody, null);
  77. return method;
  78. }
  79.  
  80. private static String toGetterName(Element element) {
  81. CharSequence fieldName = element.getSimpleName();
  82. if ( fieldName.length() == 0 ) return "get";
  83.  
  84. final String prefix, suffix;
  85.  
  86. if ( element.asType().getKind() == TypeKind.BOOLEAN || "java.lang.Boolean".equals(element.asType().toString()) ) prefix = "is";
  87. else prefix = "get";
  88.  
  89. char first = fieldName.charAt(0);
  90. if ( Character.isLowerCase(first) )
  91. suffix = String.format("%s%s", Character.toTitleCase(first), fieldName.subSequence(1, fieldName.length()));
  92. else suffix = fieldName.toString();
  93. return String.format("%s%s", prefix, suffix);
  94. }
  95. }
Add Comment
Please, Sign In to add comment