package org.overture.interpreter.assistant.module; import java.util.HashSet; import java.util.Set; import org.overture.ast.analysis.AnalysisException; import org.overture.ast.lex.LexLocation; import org.overture.ast.modules.AModuleModules; import org.overture.ast.util.modules.ModuleList; import org.overture.interpreter.assistant.IInterpreterAssistantFactory; import org.overture.interpreter.debug.DBGPReader; import org.overture.interpreter.messages.Console; import org.overture.interpreter.runtime.CollectedContextException; import org.overture.interpreter.runtime.CollectedExceptions; import org.overture.interpreter.runtime.ContextException; import org.overture.interpreter.runtime.RootContext; import org.overture.interpreter.runtime.StateContext; import org.overture.pog.obligation.ProofObligationList; import org.overture.pog.pub.IProofObligationList; public class ModuleListAssistantInterpreter { protected static IInterpreterAssistantFactory af; @SuppressWarnings("static-access") public ModuleListAssistantInterpreter(IInterpreterAssistantFactory af) { this.af = af; } public RootContext initialize(ModuleList modules, DBGPReader dbgp) { StateContext initialContext = null; if (modules.isEmpty()) { initialContext = new StateContext(af, new LexLocation(), "global environment"); } else { initialContext = new StateContext(af, modules.get(0).getName().getLocation(), "global environment"); } initialContext.setThreadState(dbgp, null); Set<ContextException> problems = null; int retries = 5; do { problems = new HashSet<ContextException>(); for (AModuleModules m : modules) { Set<ContextException> e = af.createAModuleModulesAssistant().initialize(m, initialContext); if (e != null) { problems.addAll(e); } } } while (--retries > 0 && !problems.isEmpty()); if (!problems.isEmpty()) { ContextException toThrow = problems.iterator().next(); for (ContextException e : problems) { Console.err.println(e); if (e.number != 4034) // Not in scope err { toThrow = e; } } // throw toThrow; if (toThrow instanceof ContextException) { throw new CollectedContextException((ContextException) toThrow, problems); } else { throw new CollectedExceptions(problems); } } return initialContext; } public IProofObligationList getProofObligations(ModuleList modules) throws AnalysisException { IProofObligationList obligations = new ProofObligationList(); for (AModuleModules m : modules) { obligations.addAll(af.createAModuleModulesAssistant().getProofObligations(m)); } obligations.trivialCheck(); return obligations; } }