@@ -84,50 +84,59 @@ addValue moduleName name ty = do
8484 env <- getEnv
8585 putEnv (env { names = M.insert (moduleName, name) (qualifyAllUnqualifiedNames moduleName env ty, Value) (names env) })
8686
87−typeCheckAll :: ModuleName -> [Declaration] -> Check ()
88−typeCheckAll _ [] = return ()
89−typeCheckAll moduleName (DataDeclaration name args dctors : rest) = do
87+typeCheckAll :: ModuleName -> [Declaration] -> Check [Declaration]
88+typeCheckAll _ [] = return []
89+typeCheckAll moduleName (d@(DataDeclaration name args dctors) : rest) = do
9090 rethrow (("Error in type constructor " ++ show name ++ ":\n") ++) $ do
9191 typeIsNotDefined moduleName name
9292 ctorKind <- kindsOf moduleName name args (mapMaybe snd dctors)
9393 addDataType moduleName name args dctors ctorKind
94− typeCheckAll moduleName rest
95−typeCheckAll moduleName (DataBindingGroupDeclaration tys : rest) = do
94+ ds <- typeCheckAll moduleName rest
95+ return $ d : ds
96+typeCheckAll moduleName (d@(DataBindingGroupDeclaration tys) : rest) = do
9697 rethrow (("Error in data binding group " ++ show (map (\(name, _, _) -> name) tys) ++ ":\n") ++) $ do
9798 forM_ tys $ \(name, _, _) ->
9899 typeIsNotDefined moduleName name
99100 ks <- kindsOfAll moduleName (map (\(name, args, dctors) -> (name, args, mapMaybe snd dctors)) tys)
100101 forM_ (zip tys ks) $ \((name, args, dctors), ctorKind) ->
101102 addDataType moduleName name args dctors ctorKind
102− typeCheckAll moduleName rest
103−typeCheckAll moduleName (TypeSynonymDeclaration name args ty : rest) = do
103+ ds <- typeCheckAll moduleName rest
104+ return $ d : ds
105+typeCheckAll moduleName (d@(TypeSynonymDeclaration name args ty) : rest) = do
104106 rethrow (("Error in type synonym " ++ show name ++ ":\n") ++) $ do
105107 typeIsNotDefined moduleName name
106108 kind <- kindsOf moduleName name args [ty]
107109 addTypeSynonym moduleName name args ty kind
108− typeCheckAll moduleName rest
110+ ds <- typeCheckAll moduleName rest
111+ return $ d : ds
109112typeCheckAll _ (TypeDeclaration _ _ : _) = error "Type declarations should have been removed"
110113typeCheckAll moduleName (ValueDeclaration name [] Nothing val : rest) = do
111− rethrow (("Error in declaration " ++ show name ++ ":\n") ++) $ do
114+ d <- rethrow (("Error in declaration " ++ show name ++ ":\n") ++) $ do
112115 valueIsNotDefined moduleName name
113− [ty] <- typesOf moduleName [(name, val)]
116+ [(_, (val', ty))] <- typesOf moduleName [(name, val)]
114117 addValue moduleName name ty
115− typeCheckAll moduleName rest
118+ return $ ValueDeclaration name [] Nothing val'
119+ ds <- typeCheckAll moduleName rest
120+ return $ d : ds
116121typeCheckAll _ (ValueDeclaration _ _ _ _ : _) = error "Binders were not desugared"
117122typeCheckAll moduleName (BindingGroupDeclaration vals : rest) = do
118− rethrow (("Error in binding group " ++ show (map fst vals) ++ ":\n") ++) $ do
123+ d <- rethrow (("Error in binding group " ++ show (map fst vals) ++ ":\n") ++) $ do
119124 forM_ (map fst vals) $ \name ->
120125 valueIsNotDefined moduleName name
121126 tys <- typesOf moduleName vals
122− forM_ (zip (map fst vals) tys) $ \(name, ty) ->
127+ vals' <- forM (zip (map fst vals) (map snd tys)) $ \(name, (val, ty)) -> do
123128 addValue moduleName name ty
124− typeCheckAll moduleName rest
125−typeCheckAll moduleName (ExternDataDeclaration name kind : rest) = do
129+ return (name, val)
130+ return $ BindingGroupDeclaration vals'
131+ ds <- typeCheckAll moduleName rest
132+ return $ d : ds
133+typeCheckAll moduleName (d@(ExternDataDeclaration name kind) : rest) = do
126134 env <- getEnv
127135 guardWith (show name ++ " is already defined") $ not $ M.member (moduleName, name) (types env)
128136 putEnv $ env { types = M.insert (moduleName, name) (kind, TypeSynonym) (types env) }
129− typeCheckAll moduleName rest
130−typeCheckAll moduleName (ExternDeclaration name _ ty : rest) = do
137+ ds <- typeCheckAll moduleName rest
138+ return $ d : ds
139+typeCheckAll moduleName (d@(ExternDeclaration name _ ty) : rest) = do
131140 rethrow (("Error in foreign import declaration " ++ show name ++ ":\n") ++) $ do
132141 env <- getEnv
133142 kind <- kindOf moduleName ty
@@ -135,12 +144,14 @@ typeCheckAll moduleName (ExternDeclaration name _ ty : rest) = do
135144 case M.lookup (moduleName, name) (names env) of
136145 Just _ -> throwError $ show name ++ " is already defined"
137146 Nothing -> putEnv (env { names = M.insert (moduleName, name) (qualifyAllUnqualifiedNames moduleName env ty, Extern) (names env) })
138− typeCheckAll moduleName rest
139−typeCheckAll moduleName (FixityDeclaration _ name : rest) = do
140− typeCheckAll moduleName rest
147+ ds <- typeCheckAll moduleName rest
148+ return $ d : ds
149+typeCheckAll moduleName (d@(FixityDeclaration _ name) : rest) = do
150+ ds <- typeCheckAll moduleName rest
141151 env <- getEnv
142152 guardWith ("Fixity declaration with no binding: " ++ name) $ M.member (moduleName, Op name) $ names env
143−typeCheckAll currentModule (ImportDeclaration moduleName idents : rest) = do
153+ return $ d : ds
154+typeCheckAll currentModule (d@(ImportDeclaration moduleName idents) : rest) = do
144155 env <- getEnv
145156 rethrow errorMessage $ do
146157 guardWith ("Module " ++ show moduleName ++ " does not exist") $ moduleExists env
@@ -151,7 +162,8 @@ typeCheckAll currentModule (ImportDeclaration moduleName idents : rest) = do
151162 Just idents' -> do
152163 shadowIdents (lefts idents') env
153164 shadowTypes (rights idents') env
154− typeCheckAll currentModule rest
165+ ds <- typeCheckAll currentModule rest
166+ return $ d : ds
155167 where errorMessage = (("Error in import declaration " ++ show moduleName ++ ":\n") ++)
156168 filterModule = filter ((== moduleName) . fst) . M.keys
157169 moduleExists env = not (null (filterModule (names env))) || not (null (filterModule (types env)))
@@ -185,10 +197,12 @@ typeCheckAll currentModule (ImportDeclaration moduleName idents : rest) = do
185197 constructs (Function _ ty) pn = ty `constructs` pn
186198 constructs (TypeApp ty _) pn = ty `constructs` pn
187199 constructs fn _ = error $ "Invalid arguments to constructs: " ++ show fn
188−typeCheckAll moduleName (TypeClassDeclaration name arg decls : rest) = do
189− typeCheckAll moduleName rest
190−typeCheckAll moduleName (TypeInstanceDeclaration deps name ty decls : rest) = do
191− typeCheckAll moduleName rest
200+typeCheckAll moduleName (d@(TypeClassDeclaration _ _ _) : rest) = do
201+ ds <- typeCheckAll moduleName rest
202+ return $ d : ds
203+typeCheckAll moduleName (d@(TypeInstanceDeclaration _ _ _ _) : rest) = do
204+ ds <- typeCheckAll moduleName rest
205+ return $ d : ds
192206
193207qualifyAllUnqualifiedNames :: (Data d) => ModuleName -> Environment -> d -> d
194208qualifyAllUnqualifiedNames mn env = everywhere (mkT go)