private JCTree.JCBlock addReturnBlock(JavacTreeMaker singletonClassTreeMaker, JavacNode holderInnerClass) { JCTree.JCClassDecl holderInnerClassDecl = (JCTree.JCClassDecl) holderInnerClass.get(); JavacTreeMaker holderInnerClassTreeMaker = holderInnerClass.getTreeMaker(); JCTree.JCIdent holderInnerClassType = holderInnerClassTreeMaker.Ident(holderInnerClassDecl.name); JCTree.JCFieldAccess instanceVarAccess = holderInnerClassTreeMaker.Select(holderInnerClassType, holderInnerClass.toName("INSTANCE")); JCTree.JCReturn returnValue = singletonClassTreeMaker.Return(instanceVarAccess); ListBuffer<JCTree.JCStatement> statements = new ListBuffer<>(); statements.append(returnValue); return singletonClassTreeMaker.Block(0L, statements.toList()); }
private void addInstanceVar(JavacNode singletonClass, JavacTreeMaker singletonClassTM, JavacNode holderClass) { JCTree.JCModifiers fieldMod = singletonClassTM.Modifiers(Flags.PRIVATE | Flags.STATIC | Flags.FINAL); JCTree.JCClassDecl singletonClassDecl = (JCTree.JCClassDecl) singletonClass.get(); JCTree.JCIdent singletonClassType = singletonClassTM.Ident(singletonClassDecl.name); JCTree.JCNewClass newKeyword = singletonClassTM.NewClass(null, List.nil(), singletonClassType, List.nil(), null); JCTree.JCVariableDecl instanceVar = singletonClassTM.VarDef(fieldMod, singletonClass.toName("INSTANCE"), singletonClassType, newKeyword); JavacHandlerUtil.injectField(holderClass, instanceVar); }
public static <T extends Annotation> void addMethodCallInMethodBody(AnnotationValues<T> annotation, JCTree.JCAnnotation ast, JavacNode annotationNode, String methodWhereToAddName, java.util.List<String> methodToAddName, boolean addInFirstPosition) { JavacTreeMaker treeMaker = annotationNode.getTreeMaker(); JavacNode owner = annotationNode.up(); // the field where the @Annotation applies switch (owner.get().getClass().getSimpleName()) { case "JCClassDecl": JCClassDecl classDecl = (JCClassDecl) owner.get(); for (JCTree e : classDecl.defs) { if ("METHOD".equals(e.getKind().toString())) { JCMethodDecl md = (JCMethodDecl) e; if (methodWhereToAddName.equals(md.name.toString())) { JCExpression callIt=JavacHandlerUtil.chainDots(owner, methodToAddName.toArray(new String[0])); JCMethodInvocation factoryMethodCall=treeMaker.Apply(NIL_EXPRESSION, callIt, NIL_EXPRESSION); JCExpressionStatement exec = treeMaker.Exec(factoryMethodCall); if (addInFirstPosition) { md.body.stats = md.body.stats.prepend(exec); } else { md.body.stats = md.body.stats.append(exec); } } } } break; default: break; } owner.getAst().setChanged(); }
public static <T extends Annotation> void duplicateAnnotationWithAnother(final AnnotationValues<T> annotation, final JCAnnotation ast, final JavacNode annotationNode, String annotationToDuplicateCanonicalName, java.util.List<String> annotationToAdd, java.util.List<String> fieldsToIgnore) { JavacNode top = annotationNode.top(); JCCompilationUnit compilationUnit = (JCCompilationUnit) top.get(); JCClassDecl classDecl = (JCClassDecl) compilationUnit.getTypeDecls().get(0); JavacTreeMaker treeMaker = annotationNode.getTreeMaker(); switch (owner.get().getClass().getSimpleName()) { case "JCClassDecl": annotations = classDecl.mods.annotations; break; case "JCVariableDecl": JCVariableDecl fieldDecl = (JCVariableDecl) owner.get(); annotations = fieldDecl.mods.annotations; break; switch (owner.get().getClass().getSimpleName()) { case "JCClassDecl": classDecl.mods.annotations = classDecl.mods.annotations.append(addedAnnotation);; break; case "JCVariableDecl": JCVariableDecl fieldDecl = (JCVariableDecl) owner.get(); fieldDecl.mods.annotations = fieldDecl.mods.annotations.append(addedAnnotation); break;
private void addFactoryMethod(JavacNode singletonClass, JavacTreeMaker singletonClassTreeMaker, JavacNode holderInnerClass) { JCTree.JCModifiers modifiers = singletonClassTreeMaker.Modifiers(Flags.PUBLIC | Flags.STATIC); JCTree.JCClassDecl singletonClassDecl = (JCTree.JCClassDecl) singletonClass.get(); JCTree.JCIdent singletonClassType = singletonClassTreeMaker.Ident(singletonClassDecl.name); JCTree.JCBlock block = addReturnBlock(singletonClassTreeMaker, holderInnerClass); JCTree.JCMethodDecl factoryMethod = singletonClassTreeMaker.MethodDef(modifiers, singletonClass.toName("getInstance"), singletonClassType, List.nil(), List.nil(), List.nil(), block, null); JavacHandlerUtil.injectMethod(singletonClass, factoryMethod); }
public static void moveJavadocDescriptionToAnnotation(AnnotationValues<Categories> annotation, JCAnnotation ast, JavacNode annotationNode) { JCCompilationUnit compilationUnit = (JCCompilationUnit) annotationNode.top().get(); JCClassDecl classDecl = (JCClassDecl) compilationUnit.getTypeDecls().get(0); replaceDescrition(classDecl, compilationUnit.docComments); }