| package transforms.global | |
| import org.codehaus.groovy.transform.ASTTransformation | |
| import org.codehaus.groovy.ast.ASTNode | |
| import org.codehaus.groovy.control.SourceUnit | |
| import org.codehaus.groovy.transform.GroovyASTTransformation | |
| import org.codehaus.groovy.control.CompilePhase | |
| import org.codehaus.groovy.ast.MethodNode | |
| import org.codehaus.groovy.ast.AnnotationNode | |
| import org.codehaus.groovy.ast.expr.ConstantExpression | |
| import org.codehaus.groovy.ast.expr.MethodCallExpression | |
| import org.codehaus.groovy.ast.expr.VariableExpression | |
| import org.codehaus.groovy.ast.expr.ArgumentListExpression | |
| import org.codehaus.groovy.ast.stmt.BlockStatement | |
| import java.lang.annotation.Annotation | |
| import org.codehaus.groovy.ast.expr.Expression | |
| import org.codehaus.groovy.ast.stmt.Statement | |
| import org.codehaus.groovy.ast.stmt.ExpressionStatement | |
| /** | |
| * This ASTTransformation adds a start and stop message to every single method call. | |
| * | |
| * @author Hamlet D'Arcy | |
| */ | |
| @GroovyASTTransformation(phase=CompilePhase.CONVERSION) | |
| public class LoggingASTTransformation implements ASTTransformation { | |
| public void visit(ASTNode[] astNodes, SourceUnit sourceUnit) { | |
| List methods = sourceUnit.getAST()?.getMethods() | |
| methods?.each { MethodNode method -> | |
| Statement startMessage = createPrintlnAst("Starting $method.name") | |
| Statement endMessage = createPrintlnAst("Ending $method.name") | |
| List existingStatements = method.getCode().getStatements() | |
| existingStatements.add(0, startMessage) | |
| existingStatements.add(endMessage) | |
| } | |
| } | |
| /** | |
| * Creates the AST for a println invocation. | |
| */ | |
| private Statement createPrintlnAst(String message) { | |
| return new ExpressionStatement( | |
| new MethodCallExpression( | |
| new VariableExpression("this"), | |
| new ConstantExpression("println"), | |
| new ArgumentListExpression( | |
| new ConstantExpression(message) | |
| ) | |
| ) | |
| ) | |
| } | |
| } |