CommonNameTransformer.java
package edu.udel.cis.vsl.abc.transform.common;
import java.util.LinkedHashMap;
import java.util.Map;
import edu.udel.cis.vsl.abc.ast.IF.AST;
import edu.udel.cis.vsl.abc.ast.IF.ASTFactory;
import edu.udel.cis.vsl.abc.ast.entity.IF.Entity;
import edu.udel.cis.vsl.abc.ast.node.IF.ASTNode;
import edu.udel.cis.vsl.abc.ast.node.IF.ASTNode.NodeKind;
import edu.udel.cis.vsl.abc.ast.node.IF.IdentifierNode;
import edu.udel.cis.vsl.abc.ast.node.IF.SequenceNode;
import edu.udel.cis.vsl.abc.ast.node.IF.statement.BlockItemNode;
import edu.udel.cis.vsl.abc.token.IF.SyntaxException;
import edu.udel.cis.vsl.abc.transform.IF.BaseTransformer;
import edu.udel.cis.vsl.abc.transform.IF.NameTransformer;
/**
* Transform an AST by modifying the names of entities.
*
* @author zirkel
*
*/
public class CommonNameTransformer extends BaseTransformer implements
NameTransformer {
public final static String CODE = "name";
public final static String LONG_NAME = "NameTransformer";
public final static String SHORT_DESCRIPTION = "renames references to entities";
/** The map from entities to their new names. */
private Map<Entity, String> nameChanges;
/** Map from identifier nodes to their new names. */
private Map<IdentifierNode, String> identifierNameMap;
public CommonNameTransformer(Map<Entity, String> nameChanges,
ASTFactory factory) {
super(CODE, LONG_NAME, SHORT_DESCRIPTION, factory);
this.nameChanges = nameChanges;
}
@Override
public AST transform(AST unit) throws SyntaxException {
SequenceNode<BlockItemNode> rootNode = unit.getRootNode();
AST result;
identifierNameMap = new LinkedHashMap<IdentifierNode, String>();
astFactory = unit.getASTFactory();
findIdentifiers(rootNode);
unit.release();
for (IdentifierNode identifierNode : identifierNameMap.keySet()) {
identifierNode.setName(identifierNameMap.get(identifierNode));
}
result = astFactory.newAST(rootNode, unit.getSourceFiles(),
unit.isWholeProgram());
return result;
}
private void findIdentifiers(ASTNode node) {
if (node == null) {
return;
}
if (node.nodeKind() == NodeKind.IDENTIFIER) {
Entity identifierEntity = ((IdentifierNode) node).getEntity();
if (nameChanges.containsKey(identifierEntity)) {
identifierNameMap.put((IdentifierNode) node,
nameChanges.get(identifierEntity));
}
} else {
for (int i = 0; i < node.numChildren(); i++) {
findIdentifiers(node.child(i));
}
}
}
}