package org.overture.interpreter.assistant.definition;
import java.util.LinkedList;
import org.overture.ast.analysis.AnalysisException;
import org.overture.ast.assistant.IAstAssistant;
import org.overture.ast.definitions.PDefinition;
import org.overture.ast.expressions.PExp;
import org.overture.ast.lex.LexNameList;
import org.overture.interpreter.assistant.IInterpreterAssistantFactory;
import org.overture.interpreter.runtime.Context;
import org.overture.interpreter.runtime.ObjectContext;
import org.overture.interpreter.values.NameValuePairList;
import org.overture.interpreter.values.ValueList;
import org.overture.pog.contexts.POContextStack;
import org.overture.pog.contexts.PONameContext;
import org.overture.pog.obligation.ProofObligationList;
import org.overture.typechecker.assistant.definition.PDefinitionListAssistantTC;
public class PDefinitionListAssistantInterpreter extends
PDefinitionListAssistantTC implements IAstAssistant
{
protected static IInterpreterAssistantFactory af;
@SuppressWarnings("static-access")
public PDefinitionListAssistantInterpreter(IInterpreterAssistantFactory af)
{
super(af);
this.af = af;
}
public ProofObligationList getProofObligations(
LinkedList<PDefinition> defs, POContextStack ctxt)
{
ProofObligationList obligations = new ProofObligationList();
for (PDefinition d : defs)
{
ctxt.push(new PONameContext(af.createPDefinitionAssistant().getVariableNames(d)));
obligations.addAll(af.createPDefinitionAssistant().getProofObligations(d, ctxt));
ctxt.pop();
}
return obligations;
}
public ValueList getValues(LinkedList<PDefinition> defs, ObjectContext ctxt)
{
ValueList list = new ValueList();
for (PDefinition d : defs)
{
list.addAll(af.createPDefinitionAssistant().getValues(d, ctxt));
}
return list;
}
public PExp findExpression(LinkedList<PDefinition> list, int lineno)
{
for (PDefinition d : list)
{
PExp found = af.createPDefinitionAssistant().findExpression(d, lineno);
if (found != null)
{
return found;
}
}
return null;
}
public NameValuePairList getNamedValues(
LinkedList<PDefinition> definitions, Context ctxt)
{
NameValuePairList nvl = new NameValuePairList();
for (PDefinition d : definitions)
{
nvl.addAll(af.createPDefinitionAssistant().getNamedValues(d, ctxt));
}
return nvl;
}
public LexNameList getOldNames(LinkedList<PDefinition> definitions)
{
LexNameList list = new LexNameList();
for (PDefinition d : definitions)
{
try
{
list.addAll(d.apply(af.getOldNameCollector()));
} catch (AnalysisException e)
{
list.add(null);
}
}
return list;
}
}