package org.overture.codegen.analysis.vdm; import java.util.Set; import org.overture.ast.analysis.AnalysisException; import org.overture.ast.analysis.DepthFirstAnalysisAdaptor; import org.overture.ast.definitions.AInstanceVariableDefinition; import org.overture.ast.intf.lex.ILexIdentifierToken; import org.overture.ast.intf.lex.ILexLocation; import org.overture.ast.intf.lex.ILexNameToken; import org.overture.ast.lex.LexIdentifierToken; import org.overture.ast.lex.LexNameToken; import org.overture.ast.node.INode; class RenameAnalysis extends DepthFirstAnalysisAdaptor { private Set<Renaming> renamings; public RenameAnalysis(Set<Renaming> renamings) { this.renamings = renamings; } @Override public void caseAInstanceVariableDefinition( AInstanceVariableDefinition node) throws AnalysisException { handleNameToken(node, node.getName()); handleNameToken(node, node.getOldname()); node.getExpression().apply(this); node.getType().apply(this); } @Override public void caseILexNameToken(ILexNameToken node) throws AnalysisException { handleNameToken(node.parent(), node); } @Override public void caseILexIdentifierToken(ILexIdentifierToken node) throws AnalysisException { handleLexIdToken(node.parent(), node); } private void handleNameToken(INode parent, ILexNameToken node) { Renaming r = findRenaming(node.getLocation()); if (r != null) { parent.replaceChild(node, consLexNameToken(node, r.getNewName(), r.getNewModule())); } } private void handleLexIdToken(INode parent, ILexIdentifierToken node) { Renaming r = findRenaming(node.getLocation()); if (r != null) { parent.replaceChild(node, consLexIdToken(node, r.getNewName())); } } private Renaming findRenaming(ILexLocation loc) { for (Renaming r : renamings) { if (loc.equals(r.getLoc())) { return r; } } return null; } private LexIdentifierToken consLexIdToken(ILexIdentifierToken defName, String newName) { return new LexIdentifierToken(newName, defName.getOld(), defName.getLocation()); } private LexNameToken consLexNameToken(ILexNameToken defName, String newName, String newModule) { LexNameToken newLexName = new LexNameToken(newModule, newName, defName.getLocation(), defName.getOld(), defName.getExplicit()); newLexName.setTypeQualifier(defName.getTypeQualifier()); return newLexName; } }