TypeDecl.hs revision bbae6e6ca0de7f2ffbb44d2c8da179f2b717237f
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder Authors: Christian Maeder
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder analyse type decls
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maederimport qualified Common.Lib.Map as Map
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder-- ---------------------------------------------------------------------------
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder-- analyse types as state
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder-- ---------------------------------------------------------------------------
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian MaederputTypeMap :: TypeMap -> State Env ()
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian MaederputTypeMap tk = do { e <- get; put e { typeMap = tk } }
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian MaederfromReadR :: a -> ReadR (ClassMap, TypeMap) a -> State Env a
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian MaederfromReadR a r = toState a ( \ e -> (classMap e, typeMap e)) r
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian MaederanaTypeS :: (Kind, Type) -> State Env (Kind, Type)
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian MaederanaTypeS kt = fromReadR kt $ anaType kt
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian MaedercompatibleTypeDefn :: TypeDefn -> TypeDefn -> Id -> [Diagnosis]
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian MaedercompatibleTypeDefn d1 d2 i =
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder if case (d1, d2) of
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder (TypeVarDefn, TypeVarDefn) -> True
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder (TypeVarDefn, _) -> False
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder (_, TypeVarDefn) -> False
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder then [] else [mkDiag Error "incompatible redeclaration of type" i]
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian MaederaddTypeKind :: TypeDefn -> Id -> Kind -> State Env ()
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian MaederaddTypeKind d i k =
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder if isPrefix i then do addSingleTypeKind d i k
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder addSingleTypeKind d (stripFinalPlaces i) k
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder else addSingleTypeKind d i k
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian MaederaddSingleTypeKind :: TypeDefn -> Id -> Kind -> State Env ()
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian MaederaddSingleTypeKind d i k =
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder do tk <- gets typeMap
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder Nothing -> putTypeMap $ Map.insert i
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder (TypeInfo k [] [] d) tk
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder Just (TypeInfo ok ks sups defn) ->
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder do checkKindsS i k ok
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder if any (==k) (ok:ks)
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder then addDiag $ mkDiag Warning
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder "redeclared type" i
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder else putTypeMap $ Map.insert i
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder (k:ks) sups defn) tk
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian MaederaddSuperType :: Type -> Id -> State Env ()
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian MaederaddSuperType t i =
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder do tk <- gets typeMap
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder Nothing -> return () -- previous error
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder Just (TypeInfo ok ks sups defn) ->
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder (TypeInfo ok ks (t:sups) defn)
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian MaederanaTypeItem :: GenKind -> Instance -> TypeItem -> State Env ()
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian MaederanaTypeItem _ inst (TypeDecl pats kind _) =
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder do anaKindS kind
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder let Result ds (Just is) = convertTypePatterns pats
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder appendDiags ds
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder mapM_ (anaTypeId NoTypeDefn inst kind) is
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian MaederanaTypeItem _ inst (SubtypeDecl pats t _) =
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder do anaTypeS (star, t)
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder let Result ds (Just is) = convertTypePatterns pats
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder appendDiags ds
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder mapM_ (anaTypeId NoTypeDefn inst star) is
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder mapM_ (addSuperType t) is
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian MaederanaTypeItem _ inst (IsoDecl pats _) =
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder do let Result ds (Just is) = convertTypePatterns pats
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder appendDiags ds
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder mapM_ (anaTypeId NoTypeDefn inst star) is
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder mapM_ ( \ i -> mapM_ (addSuperType (TypeName i star 0)) is) is
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian MaederanaTypeItem _ inst (SubtypeDefn pat v t f ps) =
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder do (k, newT) <- anaTypeS (star, t)
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder checkKindsS t star k
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder addDiag $ Diag Warning ("unchecked formula '" ++ showPretty f "'")
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder $ firstPos [v] ps
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder let Result ds m = convertTypePattern pat
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder appendDiags ds
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder Nothing -> return ()
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder Just i -> do anaTypeId (Supertype v newT $ item f)
4cc271fa22221d0d20cf303553f86c4e3b1a56e4Christian Maeder addSuperType newT i