package org.overture.interpreter.assistant.module;
import java.io.File;
import java.util.HashSet;
import java.util.Set;
import org.overture.ast.analysis.AnalysisException;
import org.overture.ast.definitions.ARenamedDefinition;
import org.overture.ast.definitions.AStateDefinition;
import org.overture.ast.definitions.PDefinition;
import org.overture.ast.expressions.PExp;
import org.overture.ast.modules.AModuleModules;
import org.overture.ast.statements.PStm;
import org.overture.ast.util.modules.CombinedDefaultModule;
import org.overture.interpreter.assistant.IInterpreterAssistantFactory;
import org.overture.interpreter.runtime.Context;
import org.overture.interpreter.runtime.ContextException;
import org.overture.interpreter.runtime.StateContext;
import org.overture.interpreter.util.ModuleListInterpreter;
import org.overture.pog.pub.IProofObligationList;
import org.overture.pog.pub.ProofObligationGenerator;
import org.overture.typechecker.assistant.module.AModuleModulesAssistantTC;
public class AModuleModulesAssistantInterpreter extends
AModuleModulesAssistantTC
{
protected static IInterpreterAssistantFactory af;
@SuppressWarnings("static-access")
public AModuleModulesAssistantInterpreter(IInterpreterAssistantFactory af)
{
super(af);
this.af = af;
}
public PStm findStatement(ModuleListInterpreter modules, File file,
int lineno)
{
for (AModuleModules m : modules)
{
PStm stmt = null;
if (m instanceof CombinedDefaultModule)
{
stmt = findStatement((CombinedDefaultModule) m, file, lineno);
} else
{
stmt = findStatement(m, file, lineno);
}
if (stmt != null)
{
return stmt;
}
}
return null;
}
public PStm findStatement(CombinedDefaultModule m, File file, int lineno)
{
for (AModuleModules module : m.getModules())
{
PStm stmt = findStatement(module, file, lineno);
if (stmt != null)
{
return stmt;
}
}
return null;
}
public PStm findStatement(AModuleModules m, File file, int lineno)
{
if (m.getName().getLocation().getFile().equals(file))
{
return af.createPDefinitionAssistant().findStatement(m.getDefs(), lineno);
}
return null;
}
public PExp findExpression(ModuleListInterpreter modules, File file,
int lineno)
{
for (AModuleModules m : modules)
{
PExp exp = null;
if (m instanceof CombinedDefaultModule)
{
exp = findExpression((CombinedDefaultModule) m, file, lineno);
} else
{
exp = findExpression(m, file, lineno);
}
if (exp != null)
{
return exp;
}
}
return null;
}
public PExp findExpression(CombinedDefaultModule m, File file, int lineno)
{
for (AModuleModules module : m.getModules())
{
PExp exp = findExpression(module, file, lineno);
if (exp != null)
{
return exp;
}
}
return null;
}
public PExp findExpression(AModuleModules m, File file, int lineno)
{
if (m.getName().getLocation().getFile().equals(file))
{
return af.createPDefinitionListAssistant().findExpression(m.getDefs(), lineno);
}
return null;
}
public Context getStateContext(AModuleModules defaultModule)
{
AStateDefinition sdef = af.createPDefinitionListAssistant().findStateDefinition(defaultModule.getDefs());
if (sdef != null)
{
return af.createAStateDefinitionAssistant().getStateContext(sdef);
}
return null;
}
/**
* Initialize the system for execution from this module. The initial {@link Context} is created, and populated with
* name/value pairs from the local definitions and the imported definitions. If state is defined by the module, this
* is also initialized, creating the state Context.
*
* @param m
* @param initialContext
* @return True if initialized OK.
*/
public Set<ContextException> initialize(AModuleModules m,
StateContext initialContext)
{
Set<ContextException> trouble = new HashSet<ContextException>();
for (PDefinition d : m.getImportdefs())
{
if (d instanceof ARenamedDefinition)
{
try
{
initialContext.putList(af.createPDefinitionAssistant().getNamedValues(d, initialContext));
} catch (ContextException e)
{
trouble.add(e); // Carry on...
}
}
}
for (PDefinition d : m.getDefs())
{
try
{
initialContext.putList(af.createPDefinitionAssistant().getNamedValues(d, initialContext));
} catch (ContextException e)
{
trouble.add(e); // Carry on...
}
}
try
{
AStateDefinition sdef = af.createPDefinitionListAssistant().findStateDefinition(m.getDefs());
if (sdef != null)
{
af.createAStateDefinitionAssistant().initState(sdef, initialContext);
}
} catch (ContextException e)
{
trouble.add(e); // Carry on...
}
return trouble;
}
public IProofObligationList getProofObligations(AModuleModules m)
throws AnalysisException
{
return ProofObligationGenerator.generateProofObligations(m);
}
}