@@ -84,50 +84,59 @@ addValue moduleName name ty = do
84 env <- getEnv
84 env <- getEnv
85 putEnv (env { names = M.insert (moduleName, name) (qualifyAllUnqualifiedNames moduleName env ty, Value) (names env) })
85 putEnv (env { names = M.insert (moduleName, name) (qualifyAllUnqualifiedNames moduleName env ty, Value) (names env) })
87−typeCheckAll :: ModuleName -> [Declaration] -> Check ()
87+typeCheckAll :: ModuleName -> [Declaration] -> Check [Declaration]
88−typeCheckAll _ [] = return ()
88+typeCheckAll _ [] = return []
89−typeCheckAll moduleName (DataDeclaration name args dctors : rest) = do
89+typeCheckAll moduleName (d@(DataDeclaration name args dctors) : rest) = do
90 rethrow (("Error in type constructor " ++ show name ++ ":\n") ++) $ do
90 rethrow (("Error in type constructor " ++ show name ++ ":\n") ++) $ do
91 typeIsNotDefined moduleName name
91 typeIsNotDefined moduleName name
92 ctorKind <- kindsOf moduleName name args (mapMaybe snd dctors)
92 ctorKind <- kindsOf moduleName name args (mapMaybe snd dctors)
93 addDataType moduleName name args dctors ctorKind
93 addDataType moduleName name args dctors ctorKind
94− typeCheckAll moduleName rest
94+ ds <- typeCheckAll moduleName rest
95−typeCheckAll moduleName (DataBindingGroupDeclaration tys : rest) = do
96+typeCheckAll moduleName (d@(DataBindingGroupDeclaration tys) : rest) = do
96 rethrow (("Error in data binding group " ++ show (map (\(name, _, _) -> name) tys) ++ ":\n") ++) $ do
97 rethrow (("Error in data binding group " ++ show (map (\(name, _, _) -> name) tys) ++ ":\n") ++) $ do
97 forM_ tys $ \(name, _, _) ->
98 forM_ tys $ \(name, _, _) ->
98 typeIsNotDefined moduleName name
99 typeIsNotDefined moduleName name
99 ks <- kindsOfAll moduleName (map (\(name, args, dctors) -> (name, args, mapMaybe snd dctors)) tys)
100 ks <- kindsOfAll moduleName (map (\(name, args, dctors) -> (name, args, mapMaybe snd dctors)) tys)
100 forM_ (zip tys ks) $ \((name, args, dctors), ctorKind) ->
101 forM_ (zip tys ks) $ \((name, args, dctors), ctorKind) ->
101 addDataType moduleName name args dctors ctorKind
102 addDataType moduleName name args dctors ctorKind
102− typeCheckAll moduleName rest
103+ ds <- typeCheckAll moduleName rest
103−typeCheckAll moduleName (TypeSynonymDeclaration name args ty : rest) = do
105+typeCheckAll moduleName (d@(TypeSynonymDeclaration name args ty) : rest) = do
104 rethrow (("Error in type synonym " ++ show name ++ ":\n") ++) $ do
106 rethrow (("Error in type synonym " ++ show name ++ ":\n") ++) $ do
105 typeIsNotDefined moduleName name
107 typeIsNotDefined moduleName name
106 kind <- kindsOf moduleName name args [ty]
108 kind <- kindsOf moduleName name args [ty]
107 addTypeSynonym moduleName name args ty kind
109 addTypeSynonym moduleName name args ty kind
108− typeCheckAll moduleName rest
110+ ds <- typeCheckAll moduleName rest
109typeCheckAll _ (TypeDeclaration _ _ : _) = error "Type declarations should have been removed"
112typeCheckAll _ (TypeDeclaration _ _ : _) = error "Type declarations should have been removed"
110typeCheckAll moduleName (ValueDeclaration name [] Nothing val : rest) = do
113typeCheckAll 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
112 valueIsNotDefined moduleName name
115 valueIsNotDefined moduleName name
113− [ty] <- typesOf moduleName [(name, val)]
116+ [(_, (val', ty))] <- typesOf moduleName [(name, val)]
114 addValue moduleName name ty
117 addValue moduleName name ty
118+ return $ ValueDeclaration name [] Nothing val'
115− typeCheckAll moduleName rest
119+ ds <- typeCheckAll moduleName rest
116typeCheckAll _ (ValueDeclaration _ _ _ _ : _) = error "Binders were not desugared"
121typeCheckAll _ (ValueDeclaration _ _ _ _ : _) = error "Binders were not desugared"
117typeCheckAll moduleName (BindingGroupDeclaration vals : rest) = do
122typeCheckAll 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
119 forM_ (map fst vals) $ \name ->
124 forM_ (map fst vals) $ \name ->
120 valueIsNotDefined moduleName name
125 valueIsNotDefined moduleName name
121 tys <- typesOf moduleName vals
126 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
123 addValue moduleName name ty
128 addValue moduleName name ty
130+ return $ BindingGroupDeclaration vals'
124− typeCheckAll moduleName rest
131+ ds <- typeCheckAll moduleName rest
125−typeCheckAll moduleName (ExternDataDeclaration name kind : rest) = do
133+typeCheckAll moduleName (d@(ExternDataDeclaration name kind) : rest) = do
126 env <- getEnv
134 env <- getEnv
127 guardWith (show name ++ " is already defined") $ not $ M.member (moduleName, name) (types env)
135 guardWith (show name ++ " is already defined") $ not $ M.member (moduleName, name) (types env)
128 putEnv $ env { types = M.insert (moduleName, name) (kind, TypeSynonym) (types env) }
136 putEnv $ env { types = M.insert (moduleName, name) (kind, TypeSynonym) (types env) }
129− typeCheckAll moduleName rest
137+ ds <- typeCheckAll moduleName rest
130−typeCheckAll moduleName (ExternDeclaration name _ ty : rest) = do
139+typeCheckAll moduleName (d@(ExternDeclaration name _ ty) : rest) = do
131 rethrow (("Error in foreign import declaration " ++ show name ++ ":\n") ++) $ do
140 rethrow (("Error in foreign import declaration " ++ show name ++ ":\n") ++) $ do
132 env <- getEnv
141 env <- getEnv
133 kind <- kindOf moduleName ty
142 kind <- kindOf moduleName ty
@@ -135,12 +144,14 @@ typeCheckAll moduleName (ExternDeclaration name _ ty : rest) = do
135 case M.lookup (moduleName, name) (names env) of
144 case M.lookup (moduleName, name) (names env) of
136 Just _ -> throwError $ show name ++ " is already defined"
145 Just _ -> throwError $ show name ++ " is already defined"
137 Nothing -> putEnv (env { names = M.insert (moduleName, name) (qualifyAllUnqualifiedNames moduleName env ty, Extern) (names env) })
146 Nothing -> putEnv (env { names = M.insert (moduleName, name) (qualifyAllUnqualifiedNames moduleName env ty, Extern) (names env) })
138− typeCheckAll moduleName rest
147+ ds <- typeCheckAll moduleName rest
139−typeCheckAll moduleName (FixityDeclaration _ name : rest) = do
149+typeCheckAll moduleName (d@(FixityDeclaration _ name) : rest) = do
140− typeCheckAll moduleName rest
150+ ds <- typeCheckAll moduleName rest
141 env <- getEnv
151 env <- getEnv
142 guardWith ("Fixity declaration with no binding: " ++ name) $ M.member (moduleName, Op name) $ names env
152 guardWith ("Fixity declaration with no binding: " ++ name) $ M.member (moduleName, Op name) $ names env
143−typeCheckAll currentModule (ImportDeclaration moduleName idents : rest) = do
154+typeCheckAll currentModule (d@(ImportDeclaration moduleName idents) : rest) = do
144 env <- getEnv
155 env <- getEnv
145 rethrow errorMessage $ do
156 rethrow errorMessage $ do
146 guardWith ("Module " ++ show moduleName ++ " does not exist") $ moduleExists env
157 guardWith ("Module " ++ show moduleName ++ " does not exist") $ moduleExists env
@@ -151,7 +162,8 @@ typeCheckAll currentModule (ImportDeclaration moduleName idents : rest) = do
151 Just idents' -> do
162 Just idents' -> do
152 shadowIdents (lefts idents') env
163 shadowIdents (lefts idents') env
153 shadowTypes (rights idents') env
164 shadowTypes (rights idents') env
154− typeCheckAll currentModule rest
165+ ds <- typeCheckAll currentModule rest
155 where errorMessage = (("Error in import declaration " ++ show moduleName ++ ":\n") ++)
167 where errorMessage = (("Error in import declaration " ++ show moduleName ++ ":\n") ++)
156 filterModule = filter ((== moduleName) . fst) . M.keys
168 filterModule = filter ((== moduleName) . fst) . M.keys
157 moduleExists env = not (null (filterModule (names env))) || not (null (filterModule (types env)))
169 moduleExists env = not (null (filterModule (names env))) || not (null (filterModule (types env)))
@@ -185,10 +197,12 @@ typeCheckAll currentModule (ImportDeclaration moduleName idents : rest) = do
185 constructs (Function _ ty) pn = ty `constructs` pn
197 constructs (Function _ ty) pn = ty `constructs` pn
186 constructs (TypeApp ty _) pn = ty `constructs` pn
198 constructs (TypeApp ty _) pn = ty `constructs` pn
187 constructs fn _ = error $ "Invalid arguments to constructs: " ++ show fn
199 constructs fn _ = error $ "Invalid arguments to constructs: " ++ show fn
188−typeCheckAll moduleName (TypeClassDeclaration name arg decls : rest) = do
200+typeCheckAll moduleName (d@(TypeClassDeclaration _ _ _) : rest) = do
189− typeCheckAll moduleName rest
201+ ds <- typeCheckAll moduleName rest
190−typeCheckAll moduleName (TypeInstanceDeclaration deps name ty decls : rest) = do
203+typeCheckAll moduleName (d@(TypeInstanceDeclaration _ _ _ _) : rest) = do
191− typeCheckAll moduleName rest
204+ ds <- typeCheckAll moduleName rest
193qualifyAllUnqualifiedNames :: (Data d) => ModuleName -> Environment -> d -> d
207qualifyAllUnqualifiedNames :: (Data d) => ModuleName -> Environment -> d -> d
194qualifyAllUnqualifiedNames mn env = everywhere (mkT go)
208qualifyAllUnqualifiedNames mn env = everywhere (mkT go)