@@ -39,15 +39,15 @@ import Language.PureScript.TypeClassDictionaries
39import Language.PureScript.Environment
39import Language.PureScript.Environment
40import Language.PureScript.Errors
40import Language.PureScript.Errors
42−addDataType ::
42+addDataType
43− (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
43+ :: (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m)
44− ModuleName ->
44+ => ModuleName
45− DataDeclType ->
45+ -> DataDeclType
46− ProperName ->
46+ -> ProperName 'TypeName
47− [(String, Maybe Kind)] ->
47+ -> [(String, Maybe Kind)]
48− [(ProperName, [Type])] ->
48+ -> [(ProperName 'ConstructorName, [Type])]
51addDataType moduleName dtype name args dctors ctorKind = do
51addDataType moduleName dtype name args dctors ctorKind = do
52 env <- getEnv
52 env <- getEnv
53 putEnv $ env { types = M.insert (Qualified (Just moduleName) name) (ctorKind, DataType args dctors) (types env) }
53 putEnv $ env { types = M.insert (Qualified (Just moduleName) name) (ctorKind, DataType args dctors) (types env) }
@@ -55,15 +55,15 @@ addDataType moduleName dtype name args dctors ctorKind = do
55 warnAndRethrow (addHint (ErrorInDataConstructor dctor)) $
55 warnAndRethrow (addHint (ErrorInDataConstructor dctor)) $
56 addDataConstructor moduleName dtype name (map fst args) dctor tys
56 addDataConstructor moduleName dtype name (map fst args) dctor tys
58−addDataConstructor ::
58+addDataConstructor
59− (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
59+ :: (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m)
60− ModuleName ->
60+ => ModuleName
61− DataDeclType ->
61+ -> DataDeclType
62− ProperName ->
62+ -> ProperName 'TypeName
63− [String] ->
63+ -> [String]
64− ProperName ->
64+ -> ProperName 'ConstructorName
65− [Type] ->
65+ -> [Type]
67addDataConstructor moduleName dtype name args dctor tys = do
67addDataConstructor moduleName dtype name args dctor tys = do
68 env <- getEnv
68 env <- getEnv
69 traverse_ checkTypeSynonyms tys
69 traverse_ checkTypeSynonyms tys
@@ -73,50 +73,50 @@ addDataConstructor moduleName dtype name args dctor tys = do
73 let fields = [Ident ("value" ++ show n) | n <- [0..(length tys - 1)]]
73 let fields = [Ident ("value" ++ show n) | n <- [0..(length tys - 1)]]
74 putEnv $ env { dataConstructors = M.insert (Qualified (Just moduleName) dctor) (dtype, name, polyType, fields) (dataConstructors env) }
74 putEnv $ env { dataConstructors = M.insert (Qualified (Just moduleName) dctor) (dtype, name, polyType, fields) (dataConstructors env) }
76−addTypeSynonym ::
76+addTypeSynonym
77− (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
77+ :: (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m)
78− ModuleName ->
78+ => ModuleName
79− ProperName ->
79+ -> ProperName 'TypeName
80− [(String, Maybe Kind)] ->
80+ -> [(String, Maybe Kind)]
84addTypeSynonym moduleName name args ty kind = do
84addTypeSynonym moduleName name args ty kind = do
85 env <- getEnv
85 env <- getEnv
86 checkTypeSynonyms ty
86 checkTypeSynonyms ty
87 putEnv $ env { types = M.insert (Qualified (Just moduleName) name) (kind, TypeSynonym) (types env)
87 putEnv $ env { types = M.insert (Qualified (Just moduleName) name) (kind, TypeSynonym) (types env)
88 , typeSynonyms = M.insert (Qualified (Just moduleName) name) (args, ty) (typeSynonyms env) }
88 , typeSynonyms = M.insert (Qualified (Just moduleName) name) (args, ty) (typeSynonyms env) }
90−valueIsNotDefined ::
90+valueIsNotDefined
91− (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
91+ :: (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m)
92− ModuleName ->
92+ => ModuleName
95valueIsNotDefined moduleName name = do
95valueIsNotDefined moduleName name = do
96 env <- getEnv
96 env <- getEnv
97 case M.lookup (moduleName, name) (names env) of
97 case M.lookup (moduleName, name) (names env) of
98 Just _ -> throwError . errorMessage $ RedefinedIdent name
98 Just _ -> throwError . errorMessage $ RedefinedIdent name
99 Nothing -> return ()
99 Nothing -> return ()
101−addValue ::
101+addValue
102− (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
102+ :: (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m)
103− ModuleName ->
103+ => ModuleName
104− Ident ->
104+ -> Ident
106− NameKind ->
106+ -> NameKind
108addValue moduleName name ty nameKind = do
108addValue moduleName name ty nameKind = do
109 env <- getEnv
109 env <- getEnv
110 putEnv (env { names = M.insert (moduleName, name) (ty, nameKind, Defined) (names env) })
110 putEnv (env { names = M.insert (moduleName, name) (ty, nameKind, Defined) (names env) })
112−addTypeClass ::
112+addTypeClass
113− (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
113+ :: (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m)
114− ModuleName ->
114+ => ModuleName
115− ProperName ->
115+ -> ProperName 'ClassName
116− [(String, Maybe Kind)] ->
116+ -> [(String, Maybe Kind)]
117− [Constraint] ->
117+ -> [Constraint]
118− [Declaration] ->
118+ -> [Declaration]
120addTypeClass moduleName pn args implies ds =
120addTypeClass moduleName pn args implies ds =
121 let members = map toPair ds in
121 let members = map toPair ds in
122 modify $ \st -> st { checkEnv = (checkEnv st) { typeClasses = M.insert (Qualified (Just moduleName) pn) (args, members, implies) (typeClasses . checkEnv $ st) } }
122 modify $ \st -> st { checkEnv = (checkEnv st) { typeClasses = M.insert (Qualified (Just moduleName) pn) (args, members, implies) (typeClasses . checkEnv $ st) } }
@@ -125,30 +125,30 @@ addTypeClass moduleName pn args implies ds =
125 toPair (PositionedDeclaration _ _ d) = toPair d
125 toPair (PositionedDeclaration _ _ d) = toPair d
126 toPair _ = internalError "Invalid declaration in TypeClassDeclaration"
126 toPair _ = internalError "Invalid declaration in TypeClassDeclaration"
128−addTypeClassDictionaries ::
128+addTypeClassDictionaries
129− (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
129+ :: (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m)
130− Maybe ModuleName ->
130+ => Maybe ModuleName
131− M.Map (Qualified ProperName) (M.Map (Qualified Ident) TypeClassDictionaryInScope) ->
131+ -> M.Map (Qualified (ProperName 'ClassName)) (M.Map (Qualified Ident) TypeClassDictionaryInScope)
133addTypeClassDictionaries mn entries =
133addTypeClassDictionaries mn entries =
134 modify $ \st -> st { checkEnv = (checkEnv st) { typeClassDictionaries = insertState st } }
134 modify $ \st -> st { checkEnv = (checkEnv st) { typeClassDictionaries = insertState st } }
135 where insertState st = M.insertWith (M.unionWith M.union) mn entries (typeClassDictionaries . checkEnv $ st)
135 where insertState st = M.insertWith (M.unionWith M.union) mn entries (typeClassDictionaries . checkEnv $ st)
137−checkDuplicateTypeArguments ::
137+checkDuplicateTypeArguments
138− (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
138+ :: (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m)
139− [String] ->
139+ => [String]
141checkDuplicateTypeArguments args = for_ firstDup $ \dup ->
141checkDuplicateTypeArguments args = for_ firstDup $ \dup ->
142 throwError . errorMessage $ DuplicateTypeArgument dup
142 throwError . errorMessage $ DuplicateTypeArgument dup
144 firstDup :: Maybe String
144 firstDup :: Maybe String
145 firstDup = listToMaybe $ args \\ nub args
145 firstDup = listToMaybe $ args \\ nub args
147−checkTypeClassInstance ::
147+checkTypeClassInstance
148− (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
148+ :: (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m)
149− ModuleName ->
149+ => ModuleName
152checkTypeClassInstance _ (TypeVar _) = return ()
152checkTypeClassInstance _ (TypeVar _) = return ()
153checkTypeClassInstance _ (TypeConstructor ctor) = do
153checkTypeClassInstance _ (TypeConstructor ctor) = do
154 env <- getEnv
154 env <- getEnv
@@ -160,10 +160,10 @@ checkTypeClassInstance _ ty = throwError . errorMessage $ InvalidInstanceHead ty
161-- Check that type synonyms are fully-applied in a type
161-- Check that type synonyms are fully-applied in a type
163−checkTypeSynonyms ::
163+checkTypeSynonyms
164− (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
164+ :: (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m)
167checkTypeSynonyms = void . replaceAllTypeSynonyms
167checkTypeSynonyms = void . replaceAllTypeSynonyms
@@ -179,12 +179,13 @@ checkTypeSynonyms = void . replaceAllTypeSynonyms
180-- * Process module imports
180-- * Process module imports
182−typeCheckAll :: forall m.
182+typeCheckAll
183− (Functor m, Applicative m, MonadSupply m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
184+ . (Functor m, Applicative m, MonadSupply m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m)
184− ModuleName ->
185+ => ModuleName
185− [DeclarationRef] ->
186+ -> [DeclarationRef]
186− [Declaration] ->
187+ -> [Declaration]
187− m [Declaration]
188+ -> m [Declaration]
188typeCheckAll moduleName _ ds = traverse go ds <* traverse_ checkFixities ds
189typeCheckAll moduleName _ ds = traverse go ds <* traverse_ checkFixities ds
190 go :: Declaration -> m Declaration
191 go :: Declaration -> m Declaration
@@ -197,7 +198,7 @@ typeCheckAll moduleName _ ds = traverse go ds <* traverse_ checkFixities ds
197 addDataType moduleName dtype name args' dctors ctorKind
198 addDataType moduleName dtype name args' dctors ctorKind
198 return $ DataDeclaration dtype name args dctors
199 return $ DataDeclaration dtype name args dctors
200− checkNewtype :: [(ProperName, [Type])] -> m ()
201+ checkNewtype :: [(ProperName 'ConstructorName, [Type])] -> m ()
201 checkNewtype [(_, [_])] = return ()
202 checkNewtype [(_, [_])] = return ()
202 checkNewtype [(_, _)] = throwError . errorMessage $ InvalidNewtype name
203 checkNewtype [(_, _)] = throwError . errorMessage $ InvalidNewtype name
203 checkNewtype _ = throwError . errorMessage $ InvalidNewtype name
204 checkNewtype _ = throwError . errorMessage $ InvalidNewtype name
@@ -308,7 +309,7 @@ typeCheckAll moduleName _ ds = traverse go ds <* traverse_ checkFixities ds
308 | otherwise = firstDuplicate xs
309 | otherwise = firstDuplicate xs
309 firstDuplicate _ = Nothing
310 firstDuplicate _ = Nothing
311− checkOrphanInstance :: Ident -> Qualified ProperName -> [Type] -> m ()
312+ checkOrphanInstance :: Ident -> Qualified (ProperName 'ClassName) -> [Type] -> m ()
312 checkOrphanInstance dictName className@(Qualified (Just mn') _) tys'
313 checkOrphanInstance dictName className@(Qualified (Just mn') _) tys'
313 | moduleName == mn' || any checkType tys' = return ()
314 | moduleName == mn' || any checkType tys' = return ()
314 | otherwise = throwError . errorMessage $ OrphanInstance dictName className tys'
315 | otherwise = throwError . errorMessage $ OrphanInstance dictName className tys'
@@ -335,10 +336,11 @@ typeCheckAll moduleName _ ds = traverse go ds <* traverse_ checkFixities ds
335-- Type check an entire module and ensure all types and classes defined within the module that are
336-- Type check an entire module and ensure all types and classes defined within the module that are
336-- required by exported members are also exported.
337-- required by exported members are also exported.
338−typeCheckModule :: forall m.
339+typeCheckModule
339− (Functor m, Applicative m, MonadSupply m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
341+ . (Functor m, Applicative m, MonadSupply m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m)
340− Module ->
342+ => Module
341− m Module
343+ -> m Module
342typeCheckModule (Module _ _ _ _ Nothing) = internalError "exports should have been elaborated"
344typeCheckModule (Module _ _ _ _ Nothing) = internalError "exports should have been elaborated"
343typeCheckModule (Module ss coms mn decls (Just exps)) = warnAndRethrow (addHint (ErrorInModule mn)) $ do
345typeCheckModule (Module ss coms mn decls (Just exps)) = warnAndRethrow (addHint (ErrorInModule mn)) $ do
344 modify (\s -> s { checkCurrentModule = Just mn })
346 modify (\s -> s { checkCurrentModule = Just mn })
@@ -403,7 +405,7 @@ typeCheckModule (Module ss coms mn decls (Just exps)) = warnAndRethrow (addHint
404 go (ConstrainedType cs _) = mapMaybe (fmap TypeClassRef . extractCurrentModuleClass . fst) cs
406 go (ConstrainedType cs _) = mapMaybe (fmap TypeClassRef . extractCurrentModuleClass . fst) cs
405 go _ = []
407 go _ = []
406− extractCurrentModuleClass :: Qualified ProperName -> Maybe ProperName
408+ extractCurrentModuleClass :: Qualified (ProperName 'ClassName) -> Maybe (ProperName 'ClassName)
407 extractCurrentModuleClass (Qualified (Just mn') name) | mn == mn' = Just name
409 extractCurrentModuleClass (Qualified (Just mn') name) | mn == mn' = Just name
408 extractCurrentModuleClass _ = Nothing
410 extractCurrentModuleClass _ = Nothing