0N/ACopyright : (c) Christian Maeder and Uni Bremen 2003
0N/AMaintainer : maeder@tzi.de
0N/AStability : experimental
0N/APortability : portable
0N/A-- ---------------------------------------------------------------------------
0N/A-- analyse class decls
0N/A-- ---------------------------------------------------------------------------
0N/AanaClassDecls :: ClassDecl -> State Env ClassDecl
0N/AanaClassDecls (ClassDecl cls k ps) =
0N/A mapM_ (addClassDecl ak) cls
0N/A return $ ClassDecl cls ak ps
0N/A-- ---------------------------------------------------------------------------
0N/A-- ---------------------------------------------------------------------------
0N/A-- | store a class map
0N/AputClassMap :: ClassMap -> State Env ()
0N/AputClassMap ce = do { e <- get; put e { classMap = ce } }
0N/AaddClassDecl :: Kind -> ClassId
0N/AaddClassDecl kind ci =
0N/A if showId ci "" == "Type" then
0N/A do addDiags [mkDiag Error
0N/A "illegal universe class declaration" ci]
0N/A cMap <- gets classMap
0N/A ClassInfo { classKinds = [kind] } cMap
addDiags [mkDiag Warning "redeclared class" ci]
let superClasses = classKinds info
addDiags $ checkKinds ci kind $ head superClasses
if kind `elem` superClasses then
else if cyclicClassId ci kind then
addDiags [mkDiag Error "cyclic class" ci]
(kind:superClasses) } cMap
showClassList :: [ClassId] -> ShowS
showClassList is = showParen (not $ isSingle is)
$ showSepList ("," ++) showId is
wrongClassDecl :: ClassId -> [Diagnosis]
("inconsistent redefinition of '" ++ showId ci "'")