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    }