1-----------------------------------------------------------------------------
3-- Module : PureScript.TypeChecker
4-- Copyright : (c) Phil Freeman 2013
7-- Maintainer : Phil Freeman <paf31@cantab.net>
8-- Stability : experimental
13-----------------------------------------------------------------------------
15{-# LANGUAGE GeneralizedNewtypeDeriving, FlexibleInstances #-}
17module PureScript.TypeChecker (
18 module PureScript.TypeChecker.Monad,
19 module PureScript.TypeChecker.Kinds,
20 module PureScript.TypeChecker.Types,
24import PureScript.TypeChecker.Monad
25import PureScript.TypeChecker.Kinds
26import PureScript.TypeChecker.Types
32import PureScript.Values
33import PureScript.Types
34import PureScript.Kinds
35import PureScript.Declarations
37import Control.Monad.State
38import Control.Monad.Error
40import qualified Data.Map as M
42typeCheckAll :: [Declaration] -> Check ()
43typeCheckAll [] = return ()
44typeCheckAll (DataDeclaration dcs@(DataConstructors
45 { typeConstructorName = name
46 , typeArguments = args
47 , dataConstructors = ctors
49 rethrow (("Error in type constructor " ++ name ++ ": ") ++) $ do
51 guardWith (name ++ " is already defined") $ not $ M.member name (types env)
52 ctorKind <- kindsOf name args (catMaybes $ map snd ctors)
53 putEnv $ env { types = M.insert name ctorKind (types env) }
54 flip mapM_ ctors $ \(dctor, maybeTy) ->
55 rethrow (("Error in data constructor " ++ name ++ ": ") ++) $ do
57 guardWith (dctor ++ " is already defined") $ not $ flip M.member (names env') dctor
58 let retTy = foldl TypeApp (TypeConstructor name) (map TypeVar args)
59 let dctorTy = maybe retTy (\ty -> Function [ty] retTy) maybeTy
60 putEnv $ env' { names = M.insert dctor dctorTy (names env') }
62typeCheckAll (TypeDeclaration name ty : ValueDeclaration name' val : rest) | name == name' =
63 typeCheckAll (ValueDeclaration name (TypedValue val ty) : rest)
64typeCheckAll (TypeDeclaration name _ : _) = throwError $ "Orphan type declaration for " ++ name
65typeCheckAll (ValueDeclaration name val : rest) = do
66 rethrow (("Error in declaration " ++ name ++ ": ") ++) $ do
68 case M.lookup name (names env) of
69 Just ty -> throwError $ name ++ " is already defined"
72 putEnv (env { names = M.insert name ty (names env) })
74typeCheckAll (ExternDeclaration name ty : rest) = do
75 rethrow (("Error in extern declaration " ++ name ++ ": ") ++) $ do
77 case M.lookup name (names env) of
78 Just _ -> throwError $ name ++ " is already defined"
79 Nothing -> putEnv (env { names = M.insert name ty (names env) })
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list