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.statements.PStm;
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.obligation.ProofObligationList;
import org.overture.pog.pub.IProofObligationList;
import org.overture.pog.pub.ProofObligationGenerator;
import org.overture.typechecker.assistant.definition.PDefinitionAssistantTC;
public class PDefinitionAssistantInterpreter extends PDefinitionAssistantTC implements IAstAssistant
{
protected static IInterpreterAssistantFactory af;
@SuppressWarnings("static-access")
public PDefinitionAssistantInterpreter(IInterpreterAssistantFactory af)
{
super(af);
this.af = af;
}
public NameValuePairList getNamedValues(PDefinition def,
Context initialContext)
{
try
{
return def.apply(af.getNamedValueLister(), initialContext);
} catch (AnalysisException e)
{
return null;
}
}
public IProofObligationList getProofObligations(PDefinition def,
POContextStack ctxt)
{
try
{
ProofObligationGenerator.generateProofObligations(def);
} catch (AnalysisException e)
{
e.printStackTrace();
}
return new ProofObligationList();
}
/**
* Return a list of external values that are read by the definition.
*
* @param def
* @param ctxt
* The context in which to evaluate the expressions.
* @return A list of values read.
*/
public ValueList getValues(PDefinition def, ObjectContext ctxt)
{
try
{
return def.apply(af.getValuesDefinitionLocator(), ctxt);
} catch (AnalysisException e)
{
return null;
}
}
public PExp findExpression(PDefinition def, int lineno)
{
try
{
return def.apply(af.getExpressionFinder(), lineno);
} catch (AnalysisException e)
{
return null;
}
}
public boolean isTypeDefinition(PDefinition def)
{
try
{
return def.apply(af.getTypeDefinitionChecker());
} catch (AnalysisException e)
{
return false;
}
}
public boolean isRuntime(PDefinition def)
{
try
{
return def.apply(af.getDefinitionRunTimeChecker());
} catch (AnalysisException e)
{
return true;
}
}
public boolean isValueDefinition(PDefinition def)
{
try
{
return def.apply(af.getDefintionValueChecker());
} catch (AnalysisException e)
{
return false;
}
}
public boolean isInstanceVariable(PDefinition def)
{
try
{
return def.apply(af.getInstanceVariableChecker());
} catch (AnalysisException e)
{
return false;
}
}
public PStm findStatement(LinkedList<PDefinition> definitions, int lineno)
{
for (PDefinition d : definitions)
{
PStm found = findStatement(d, lineno);
if (found != null)
{
return found;
}
}
return null;
}
private PStm findStatement(PDefinition def, int lineno)
{
try
{
return def.apply(af.getDefinitionStatementFinder(), lineno);
} catch (AnalysisException e)
{
return null;
}
}
}