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 }