package org.overture.codegen.vdm2cpp.typesorter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Map;
import org.overture.codegen.cgast.INode;
import org.overture.codegen.cgast.NodeList;
import org.overture.codegen.cgast.analysis.AnalysisException;
import org.overture.codegen.cgast.analysis.DepthFirstAnalysisAdaptor;
import org.overture.codegen.cgast.declarations.AClassDeclCG;
import org.overture.codegen.cgast.declarations.ARecordDeclCG;
public class TypeDependency extends DepthFirstAnalysisAdaptor {
private ArrayList<TypeContainer> temporary_list;
private ArrayList<TypeContainer> final_list;
private ArrayList<INode> node_list;
public TypeDependency() {
temporary_list = new ArrayList<TypeContainer>();
final_list = new ArrayList<TypeContainer>();
node_list = new ArrayList<INode>();
}
@Override
public void inARecordDeclCG(ARecordDeclCG node) throws AnalysisException {
AClassDeclCG name = node.getAncestor(AClassDeclCG.class);
TypeContainer t = new TypeContainer(node.getName(), name.getName());
if(temporary_list.contains(t))
{
throw new AnalysisException("Cyclic dependency found");
}
temporary_list.add(t);
if(!final_list.contains(t))
{
Map<String, Object> m = node.getChildren(false);
for(String n : m.keySet())
{
Object ob = m.get(n);
if(ob instanceof NodeList<?>)
{
@SuppressWarnings("unchecked")
NodeList<INode> nl = ( (NodeList<INode>) m.get(n) );
for(INode nn : nl)
{
nn.apply(this);
}
}
}
final_list.add(t);
node_list.add(node);
}
}
public ArrayList<TypeContainer> getOrderedDependencies()
{
Collections.reverse(final_list);
return final_list;
}
public ArrayList<INode> getOrderedRecords()
{
Collections.reverse(node_list);
return node_list;
}
}