/* | |
* Licensed to the Apache Software Foundation (ASF) under one | |
* or more contributor license agreements. See the NOTICE file | |
* distributed with this work for additional information | |
* regarding copyright ownership. The ASF licenses this file | |
* to you under the Apache License, Version 2.0 (the | |
* "License"); you may not use this file except in compliance | |
* with the License. You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, | |
* software distributed under the License is distributed on an | |
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
* KIND, either express or implied. See the License for the | |
* specific language governing permissions and limitations | |
* under the License. | |
*/ | |
package org.codehaus.groovy.ast; | |
import java.util.List; | |
import java.util.Map; | |
import org.codehaus.groovy.ast.expr.*; | |
import org.codehaus.groovy.ast.stmt.AssertStatement; | |
import org.codehaus.groovy.ast.stmt.CaseStatement; | |
import org.codehaus.groovy.ast.stmt.DoWhileStatement; | |
import org.codehaus.groovy.ast.stmt.ExpressionStatement; | |
import org.codehaus.groovy.ast.stmt.ForStatement; | |
import org.codehaus.groovy.ast.stmt.IfStatement; | |
import org.codehaus.groovy.ast.stmt.ReturnStatement; | |
import org.codehaus.groovy.ast.stmt.Statement; | |
import org.codehaus.groovy.ast.stmt.SwitchStatement; | |
import org.codehaus.groovy.ast.stmt.SynchronizedStatement; | |
import org.codehaus.groovy.ast.stmt.ThrowStatement; | |
import org.codehaus.groovy.ast.stmt.WhileStatement; | |
/** | |
* Visitor to transform expressions in a whole class. | |
* Transformed Expressions are usually not visited. | |
* | |
* @author Jochen Theodorou | |
*/ | |
public abstract class ClassCodeExpressionTransformer extends ClassCodeVisitorSupport implements ExpressionTransformer { | |
protected void visitConstructorOrMethod(MethodNode node, boolean isConstructor) { | |
for (Parameter p : node.getParameters()) { | |
if (p.hasInitialExpression()) { | |
Expression init = p.getInitialExpression(); | |
p.setInitialExpression(transform(init)); | |
} | |
} | |
super.visitConstructorOrMethod(node, isConstructor); | |
} | |
public void visitSwitch(SwitchStatement statement) { | |
Expression exp = statement.getExpression(); | |
statement.setExpression(transform(exp)); | |
for (CaseStatement caseStatement : statement.getCaseStatements()) { | |
caseStatement.visit(this); | |
} | |
statement.getDefaultStatement().visit(this); | |
} | |
public void visitField(FieldNode node) { | |
visitAnnotations(node); | |
Expression init = node.getInitialExpression(); | |
node.setInitialValueExpression(transform(init)); | |
} | |
public void visitProperty(PropertyNode node) { | |
visitAnnotations(node); | |
Statement statement = node.getGetterBlock(); | |
visitClassCodeContainer(statement); | |
statement = node.getSetterBlock(); | |
visitClassCodeContainer(statement); | |
} | |
public void visitIfElse(IfStatement ifElse) { | |
ifElse.setBooleanExpression((BooleanExpression) (transform(ifElse.getBooleanExpression()))); | |
ifElse.getIfBlock().visit(this); | |
ifElse.getElseBlock().visit(this); | |
} | |
public Expression transform(Expression exp) { | |
if (exp == null) return null; | |
return exp.transformExpression(this); | |
} | |
public void visitAnnotations(AnnotatedNode node) { | |
List<AnnotationNode> annotations = node.getAnnotations(); | |
if (annotations.isEmpty()) return; | |
for (AnnotationNode an : annotations) { | |
// skip built-in properties | |
if (an.isBuiltIn()) continue; | |
for (Map.Entry<String, Expression> member : an.getMembers().entrySet()) { | |
member.setValue(transform(member.getValue())); | |
} | |
} | |
} | |
public void visitReturnStatement(ReturnStatement statement) { | |
statement.setExpression(transform(statement.getExpression())); | |
} | |
public void visitAssertStatement(AssertStatement as) { | |
as.setBooleanExpression((BooleanExpression) (transform(as.getBooleanExpression()))); | |
as.setMessageExpression(transform(as.getMessageExpression())); | |
} | |
public void visitCaseStatement(CaseStatement statement) { | |
statement.setExpression(transform(statement.getExpression())); | |
statement.getCode().visit(this); | |
} | |
public void visitDoWhileLoop(DoWhileStatement loop) { | |
loop.setBooleanExpression((BooleanExpression) (transform(loop.getBooleanExpression()))); | |
super.visitDoWhileLoop(loop); | |
} | |
public void visitForLoop(ForStatement forLoop) { | |
forLoop.setCollectionExpression(transform(forLoop.getCollectionExpression())); | |
super.visitForLoop(forLoop); | |
} | |
public void visitSynchronizedStatement(SynchronizedStatement sync) { | |
sync.setExpression(transform(sync.getExpression())); | |
super.visitSynchronizedStatement(sync); | |
} | |
public void visitThrowStatement(ThrowStatement ts) { | |
ts.setExpression(transform(ts.getExpression())); | |
} | |
public void visitWhileLoop(WhileStatement loop) { | |
loop.setBooleanExpression((BooleanExpression) transform(loop.getBooleanExpression())); | |
super.visitWhileLoop(loop); | |
} | |
public void visitExpressionStatement(ExpressionStatement es) { | |
es.setExpression(transform(es.getExpression())); | |
} | |
} |