public void visit(ASTNode[] nodes, SourceUnit source) { init(nodes, source); final ClassCodeVisitorSupport visitor = createVisitor(); process(nodes, visitor); }
private void process(ASTNode[] nodes, final ClassCodeVisitorSupport visitor) { candidate = (AnnotatedNode) nodes[1]; AnnotationNode node = (AnnotationNode) nodes[0]; if (!MY_TYPE.equals(node.getClassNode())) return; if (candidate instanceof ClassNode) { processClass((ClassNode) candidate, visitor); } else if (candidate instanceof MethodNode) { processConstructorOrMethod((MethodNode) candidate, visitor); } else if (candidate instanceof FieldNode) { processField((FieldNode) candidate, visitor); } else if (candidate instanceof DeclarationExpression) { processLocalVariable((DeclarationExpression) candidate, visitor); } }
private void processClass(ClassNode cNode, final ClassCodeVisitorSupport visitor) { if (!isEnabled(cNode)) return; if (cNode.isInterface()) { addError("Error processing interface '" + cNode.getName() + "'. " + MY_TYPE_NAME + " only allowed for classes.", cNode); return; } for (ConstructorNode cn : cNode.getDeclaredConstructors()) { if (hasNoExplicitAutoFinal(cn)) { processConstructorOrMethod(cn, visitor); } } for (MethodNode mn : cNode.getAllDeclaredMethods()) { if (hasNoExplicitAutoFinal(mn)) { processConstructorOrMethod(mn, visitor); } } Iterator<InnerClassNode> it = cNode.getInnerClasses(); while (it.hasNext()) { InnerClassNode in = it.next(); if (in.getAnnotations(MY_TYPE).isEmpty()) { processClass(in, visitor); } } visitor.visitClass(cNode); }
private void processLocalVariable(DeclarationExpression de, ClassCodeVisitorSupport visitor) { if (!isEnabled(de)) return; if (de.getRightExpression() instanceof ClosureExpression) { visitor.visitDeclarationExpression(de); } }
private boolean isEnabled(final AnnotatedNode node) { if (node == null) return false; List<AnnotationNode> annotations = node.getAnnotations(MY_TYPE); if (annotations != null) { // any explicit false for enabled disables functionality // this allows, for example, configscript to set all // classes to true and one class to be explicitly disabled for (AnnotationNode anno : annotations) { // abort if explicit false found if (memberHasValue(anno, "enabled", false)) return false; } } return true; }
private void processField(FieldNode fNode, ClassCodeVisitorSupport visitor) { if (!isEnabled(fNode)) return; if (fNode.hasInitialExpression() && fNode.getInitialExpression() instanceof ClosureExpression) { visitor.visitField(fNode); } }
private void processConstructorOrMethod(MethodNode mNode, ClassCodeVisitorSupport visitor) { if (!isEnabled(mNode)) return; if (mNode.isSynthetic()) return; Parameter[] origParams = mNode.getParameters(); for (Parameter p : origParams) { p.setModifiers(p.getModifiers() | Modifier.FINAL); } visitor.visitMethod(mNode); }