module ScopeProgram(scopeProgram,scopeProgram',PNT(..)) where
import ScopeModule
import PNT(PNT(..))
import PrettyPrint
import OutputM
import HsModule(hsModName)
scopeProgram (mss0,wms) =
if null errors
then return (mss,wms)
else fail (pp $ vcat errors)
where
(mss,mrefs) = scopeProgram' (mss0,wms)
errors = [m<>": "<>msg | (m,refs)<-mrefs, (sp,i,os)<-refs, msg<-err i os]
err i [] = [not_in_scope i]
err i [o] = []
err i os = [ambiguous i os]
not_in_scope i = "Not in scope: "<>i
ambiguous i os = "Ambiguous: "<>i<>": "<>os
scopeProgram' (mss,wms) = listOutput $ mapM (mapM scopeMod) mss
where
-- Hmm. scopeModule outputs exactly one element
scopeMod mod = p (scopeModule wm mod)
where
Just wm = lookup m wms
m = hsModName mod
p (x,refs) = output (m,refs) >> return x