package org.overture.codegen.analysis.vdm;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.overture.ast.definitions.PDefinition;
import org.overture.ast.intf.lex.ILexNameToken;
import org.overture.typechecker.assistant.ITypeCheckerAssistantFactory;
public class DefinitionInfo
{
private List<? extends PDefinition> nodeDefs;
private Map<PDefinition, List<? extends PDefinition>> localDefsMap;
private ITypeCheckerAssistantFactory af;
public DefinitionInfo(List<? extends PDefinition> nodeDefs,
ITypeCheckerAssistantFactory af)
{
this.nodeDefs = nodeDefs;
this.localDefsMap = new HashMap<PDefinition, List<? extends PDefinition>>();
this.af = af;
for (PDefinition d : nodeDefs)
{
localDefsMap.put(d, collectDefs(d));
}
}
public List<? extends PDefinition> getNodeDefs()
{
return nodeDefs;
}
public List<PDefinition> getAllLocalDefs()
{
return getLocalDefs(nodeDefs);
}
public List<ILexNameToken> getAllLocalDefNames()
{
List<PDefinition> allLocalDefs = getAllLocalDefs();
List<ILexNameToken> names = new LinkedList<ILexNameToken>();
for (PDefinition def : allLocalDefs)
{
names.add(def.getName());
}
return names;
}
public List<PDefinition> getLocalDefs(List<? extends PDefinition> defs)
{
List<PDefinition> localDefs = new LinkedList<PDefinition>();
for (PDefinition d : defs)
{
List<? extends PDefinition> dd = getLocalDefs(d);
localDefs.addAll(dd);
}
return localDefs;
}
public List<? extends PDefinition> getLocalDefs(PDefinition def)
{
return localDefsMap.get(def);
}
private List<PDefinition> collectDefs(PDefinition d)
{
return af.createPDefinitionAssistant().getDefinitions(d);
}
}