// Path: asteroid-core/src/main/java/asteroid/A.java
// @SuppressWarnings("PMD.ShortClassName")
// public final class A {
// 
//     /**
//      * Entry point to get node builders.
//      *
//      * @since 0.1.0
//      */
//     public static final Nodes NODES = new Nodes();
// 
//     /**
//      * Entry point to access language modifiers
//      *
//      * @since 0.1.0
//      */
//     public static final Modifiers ACC = new Modifiers();
// 
//     /**
//      * Entry point to create statements.
//      *
//      * @since 0.1.0
//      */
//     public static final Statements STMT = new Statements();
// 
//     /**
//      * Entry point to create expressions
//      *
//      * @since 0.1.0
//      */
//     public static final Expressions EXPR = new Expressions();
// 
//     /**
//      * Entry point to get util functions
//      *
//      * @since 0.1.0
//      */
//     public static final Utils UTIL = new Utils();
// 
//     /**
//      * Entry point to get criterias
//      *
//      * @since 0.2.4
//      */
//     public static final Criterias CRITERIA = new Criterias();
// }
// 
// Path: asteroid-core/src/main/java/asteroid/AbstractLocalTransformation.java
// public abstract class AbstractLocalTransformation<T extends Annotation,S extends AnnotatedNode>
//     extends AbstractASTTransformation {
// 
//     private final Class<T> annotation;
// 
//     /**
//      * Default constructor
//      *
//      * @throws IllegalAccessException
//      * @since 0.2.0
//      */
//     @SuppressWarnings("PMD.SignatureDeclaredThrowsException")
//     public AbstractLocalTransformation() throws IllegalAccessException {
//         throw new IllegalAccessException("This method should never be used. It will be re-created by a local AST transformation");
//     }
// 
//     /**
//      * Default constructor
//      *
//      * @param annotation The type of the annotatino used to trigger the transformation
//      * @since 0.2.0
//      */
//     public AbstractLocalTransformation(final Class<T> annotation) {
//         this.annotation = annotation;
//     }
// 
//     /**
//      * This method processes all annotated nodes annotated with a specific annotation node.
//      *
//      * @param annotation the annotation information
//      * @param annotated the ast node annotated with the specific annotation
//      * @since 0.2.0
//      */
//     public abstract void doVisit(AnnotationNode annotation, final S annotated);
// 
//     /**
//      * {@inheritDoc}
//      */
//     @Override
//     public void visit(final ASTNode[] nodes, final SourceUnit source) {
//         if (shouldSkip(nodes)) {
//             return; // skip
//         }
// 
//         final AnnotationNode marker = (AnnotationNode) first(nodes);
// 
//         final ClassNode type = marker.getClassNode();
//         final ClassNode reference = make(annotation);
//         final Boolean isAnnotationOk = A.UTIL.NODE.isOrExtends(type, reference);
// 
//         if (!isAnnotationOk) {
//             return;
//         }
// 
//         final S annotated = (S) last(nodes);
// 
//         this.sourceUnit = source;
// 
//         doVisit(marker, annotated);
//     }
// 
//     private boolean shouldSkip(final ASTNode... nodes) {
//         return nodes == null || nodes.length != 2 ||
//             !(nodes[0] instanceof AnnotationNode) ||
//             !(nodes[1] instanceof AnnotatedNode);
//     }
// }


import static org.codehaus.groovy.runtime.DefaultGroovyMethods.first;
import java.util.Arrays;
import java.util.List;
import asteroid.A;
import asteroid.AbstractLocalTransformation;
import asteroid.Phase;
import org.codehaus.groovy.ast.AnnotationNode;
import org.codehaus.groovy.ast.ClassNode;
import org.codehaus.groovy.ast.ConstructorNode;
import org.codehaus.groovy.ast.GenericsType;
import org.codehaus.groovy.ast.stmt.Statement;
import org.codehaus.groovy.control.CompilePhase;
import org.codehaus.groovy.transform.GroovyASTTransformation;
package asteroid.internal;




/**
 * This transformation makes easier to declare a given local transformation. It narrows the available
 * compilation phases to those only capable of being used in a local transformation. The way of declaring
 * the transformation makes clearer the fact that it is a local transformation.
 *
 * @since 0.2.0
 */
@GroovyASTTransformation(phase = CompilePhase.SEMANTIC_ANALYSIS)
public class PhaseTransformation extends AbstractLocalTransformation<Phase,ClassNode> {

    private static final String METHOD_DOVISIT = "doVisit";

    /**
     * Constructor using abstraction {@link AbstractLocalTransformation}
     *
     * @since 0.2.0
     */
    public PhaseTransformation() {
        super(Phase.class);
    }

    /**
     * {@inheritDoc}
     *
     * @since 0.2.0
     */
    @Override
    public void doVisit(final AnnotationNode annotationNode, final ClassNode annotatedNode) {
// Path: asteroid-core/src/main/java/asteroid/A.java
// @SuppressWarnings("PMD.ShortClassName")
// public final class A {
// 
//     /**
//      * Entry point to get node builders.
//      *
//      * @since 0.1.0
//      */
//     public static final Nodes NODES = new Nodes();
// 
//     /**
//      * Entry point to access language modifiers
//      *
//      * @since 0.1.0
//      */
//     public static final Modifiers ACC = new Modifiers();
// 
//     /**
//      * Entry point to create statements.
//      *
//      * @since 0.1.0
//      */
//     public static final Statements STMT = new Statements();
// 
//     /**
//      * Entry point to create expressions
//      *
//      * @since 0.1.0
//      */
//     public static final Expressions EXPR = new Expressions();
// 
//     /**
//      * Entry point to get util functions
//      *
//      * @since 0.1.0
//      */
//     public static final Utils UTIL = new Utils();
// 
//     /**
//      * Entry point to get criterias
//      *
//      * @since 0.2.4
//      */
//     public static final Criterias CRITERIA = new Criterias();
// }
// 
// Path: asteroid-core/src/main/java/asteroid/AbstractLocalTransformation.java
// public abstract class AbstractLocalTransformation<T extends Annotation,S extends AnnotatedNode>
//     extends AbstractASTTransformation {
// 
//     private final Class<T> annotation;
// 
//     /**
//      * Default constructor
//      *
//      * @throws IllegalAccessException
//      * @since 0.2.0
//      */
//     @SuppressWarnings("PMD.SignatureDeclaredThrowsException")
//     public AbstractLocalTransformation() throws IllegalAccessException {
//         throw new IllegalAccessException("This method should never be used. It will be re-created by a local AST transformation");
//     }
// 
//     /**
//      * Default constructor
//      *
//      * @param annotation The type of the annotatino used to trigger the transformation
//      * @since 0.2.0
//      */
//     public AbstractLocalTransformation(final Class<T> annotation) {
//         this.annotation = annotation;
//     }
// 
//     /**
//      * This method processes all annotated nodes annotated with a specific annotation node.
//      *
//      * @param annotation the annotation information
//      * @param annotated the ast node annotated with the specific annotation
//      * @since 0.2.0
//      */
//     public abstract void doVisit(AnnotationNode annotation, final S annotated);
// 
//     /**
//      * {@inheritDoc}
//      */
//     @Override
//     public void visit(final ASTNode[] nodes, final SourceUnit source) {
//         if (shouldSkip(nodes)) {
//             return; // skip
//         }
// 
//         final AnnotationNode marker = (AnnotationNode) first(nodes);
// 
//         final ClassNode type = marker.getClassNode();
//         final ClassNode reference = make(annotation);
//         final Boolean isAnnotationOk = A.UTIL.NODE.isOrExtends(type, reference);
// 
//         if (!isAnnotationOk) {
//             return;
//         }
// 
//         final S annotated = (S) last(nodes);
// 
//         this.sourceUnit = source;
// 
//         doVisit(marker, annotated);
//     }
// 
//     private boolean shouldSkip(final ASTNode... nodes) {
//         return nodes == null || nodes.length != 2 ||
//             !(nodes[0] instanceof AnnotationNode) ||
//             !(nodes[1] instanceof AnnotatedNode);
//     }
// }


// Path: asteroid-core/src/main/java/asteroid/internal/PhaseTransformation.java
import static org.codehaus.groovy.runtime.DefaultGroovyMethods.first;
import java.util.Arrays;
import java.util.List;
import asteroid.A;
import asteroid.AbstractLocalTransformation;
import asteroid.Phase;
import org.codehaus.groovy.ast.AnnotationNode;
import org.codehaus.groovy.ast.ClassNode;
import org.codehaus.groovy.ast.ConstructorNode;
import org.codehaus.groovy.ast.GenericsType;
import org.codehaus.groovy.ast.stmt.Statement;
import org.codehaus.groovy.control.CompilePhase;
import org.codehaus.groovy.transform.GroovyASTTransformation;

package asteroid.internal;




/**
 * This transformation makes easier to declare a given local transformation. It narrows the available
 * compilation phases to those only capable of being used in a local transformation. The way of declaring
 * the transformation makes clearer the fact that it is a local transformation.
 *
 * @since 0.2.0
 */
@GroovyASTTransformation(phase = CompilePhase.SEMANTIC_ANALYSIS)
public class PhaseTransformation extends AbstractLocalTransformation<Phase,ClassNode> {

    private static final String METHOD_DOVISIT = "doVisit";

    /**
     * Constructor using abstraction {@link AbstractLocalTransformation}
     *
     * @since 0.2.0
     */
    public PhaseTransformation() {
        super(Phase.class);
    }

    /**
     * {@inheritDoc}
     *
     * @since 0.2.0
     */
    @Override
    public void doVisit(final AnnotationNode annotationNode, final ClassNode annotatedNode) {
        if(!A.UTIL.NODE.isOrExtends(annotatedNode, AbstractLocalTransformation.class)) {