001 /* 002 * ClassCodeVisitorSupport.java created on 14.12.2005 003 * 004 */ 005 package org.codehaus.groovy.ast; 006 007 import java.util.Iterator; 008 import java.util.List; 009 010 import org.codehaus.groovy.ast.expr.Expression; 011 import org.codehaus.groovy.ast.stmt.AssertStatement; 012 import org.codehaus.groovy.ast.stmt.BlockStatement; 013 import org.codehaus.groovy.ast.stmt.BreakStatement; 014 import org.codehaus.groovy.ast.stmt.CaseStatement; 015 import org.codehaus.groovy.ast.stmt.CatchStatement; 016 import org.codehaus.groovy.ast.stmt.ContinueStatement; 017 import org.codehaus.groovy.ast.stmt.DoWhileStatement; 018 import org.codehaus.groovy.ast.stmt.ExpressionStatement; 019 import org.codehaus.groovy.ast.stmt.ForStatement; 020 import org.codehaus.groovy.ast.stmt.IfStatement; 021 import org.codehaus.groovy.ast.stmt.ReturnStatement; 022 import org.codehaus.groovy.ast.stmt.Statement; 023 import org.codehaus.groovy.ast.stmt.SwitchStatement; 024 import org.codehaus.groovy.ast.stmt.SynchronizedStatement; 025 import org.codehaus.groovy.ast.stmt.ThrowStatement; 026 import org.codehaus.groovy.ast.stmt.TryCatchStatement; 027 import org.codehaus.groovy.ast.stmt.WhileStatement; 028 import org.codehaus.groovy.control.SourceUnit; 029 import org.codehaus.groovy.control.messages.SyntaxErrorMessage; 030 import org.codehaus.groovy.syntax.SyntaxException; 031 032 public abstract class ClassCodeVisitorSupport extends CodeVisitorSupport implements GroovyClassVisitor { 033 034 public void visitClass(ClassNode node) { 035 visitAnnotations(node); 036 node.visitContents(this); 037 List list = node.getObjectInitializerStatements(); 038 for (Iterator iter = list.iterator(); iter.hasNext();) { 039 Statement element = (Statement) iter.next(); 040 element.visit(this); 041 } 042 } 043 044 public void visitAnnotations(AnnotatedNode node) { 045 046 } 047 048 protected void visitClassCodeContainer(Statement code) { 049 if (code != null) code.visit(this); 050 } 051 052 protected void visitConstructorOrMethod(MethodNode node, boolean isConstructor) { 053 Statement code = node.getCode(); 054 visitClassCodeContainer(code); 055 } 056 057 public void visitConstructor(ConstructorNode node) { 058 visitConstructorOrMethod(node,true); 059 } 060 061 public void visitMethod(MethodNode node) { 062 visitConstructorOrMethod(node,false); 063 } 064 065 public void visitField(FieldNode node) { 066 visitAnnotations(node); 067 Expression init = node.getInitialExpression(); 068 if (init != null) init.visit(this); 069 } 070 071 public void visitProperty(PropertyNode node) { 072 Statement statement = node.getGetterBlock(); 073 visitClassCodeContainer(statement); 074 075 statement = node.getSetterBlock(); 076 visitClassCodeContainer(statement); 077 078 Expression init = node.getInitialExpression(); 079 if (init != null) init.visit(this); 080 } 081 082 protected void addError(String msg, ASTNode expr) { 083 int line = expr.getLineNumber(); 084 int col = expr.getColumnNumber(); 085 SourceUnit source = getSourceUnit(); 086 source.getErrorCollector().addErrorAndContinue( 087 new SyntaxErrorMessage(new SyntaxException(msg + '\n', line, col), source) 088 ); 089 } 090 091 abstract protected SourceUnit getSourceUnit(); 092 093 protected void visitStatement(Statement statement) {} 094 095 public void visitAssertStatement(AssertStatement statement) { 096 visitStatement(statement); 097 super.visitAssertStatement(statement); 098 } 099 100 public void visitBlockStatement(BlockStatement block) { 101 visitStatement(block); 102 super.visitBlockStatement(block); 103 } 104 105 public void visitBreakStatement(BreakStatement statement) { 106 visitStatement(statement); 107 super.visitBreakStatement(statement); 108 } 109 110 public void visitCaseStatement(CaseStatement statement) { 111 visitStatement(statement); 112 super.visitCaseStatement(statement); 113 } 114 115 public void visitCatchStatement(CatchStatement statement) { 116 visitStatement(statement); 117 super.visitCatchStatement(statement); 118 } 119 120 public void visitContinueStatement(ContinueStatement statement) { 121 visitStatement(statement); 122 super.visitContinueStatement(statement); 123 } 124 125 public void visitDoWhileLoop(DoWhileStatement loop) { 126 visitStatement(loop); 127 super.visitDoWhileLoop(loop); 128 } 129 130 public void visitExpressionStatement(ExpressionStatement statement) { 131 visitStatement(statement); 132 super.visitExpressionStatement(statement); 133 } 134 135 public void visitForLoop(ForStatement forLoop) { 136 visitStatement(forLoop); 137 super.visitForLoop(forLoop); 138 } 139 140 public void visitIfElse(IfStatement ifElse) { 141 visitStatement(ifElse); 142 super.visitIfElse(ifElse); 143 } 144 145 public void visitReturnStatement(ReturnStatement statement) { 146 visitStatement(statement); 147 super.visitReturnStatement(statement); 148 } 149 150 public void visitSwitch(SwitchStatement statement) { 151 visitStatement(statement); 152 super.visitSwitch(statement); 153 } 154 155 public void visitSynchronizedStatement(SynchronizedStatement statement) { 156 visitStatement(statement); 157 super.visitSynchronizedStatement(statement); 158 } 159 160 public void visitThrowStatement(ThrowStatement statement) { 161 visitStatement(statement); 162 super.visitThrowStatement(statement); 163 } 164 165 public void visitTryCatchFinally(TryCatchStatement statement) { 166 visitStatement(statement); 167 super.visitTryCatchFinally(statement); 168 } 169 170 public void visitWhileLoop(WhileStatement loop) { 171 visitStatement(loop); 172 super.visitWhileLoop(loop); 173 } 174 }