@@ -33,6 +33,7 @@ import Control.Monad.Writer.Class
33import Language.PureScript.AST
33import Language.PureScript.AST
34import Language.PureScript.Names
34import Language.PureScript.Names
35import Language.PureScript.Errors
35import Language.PureScript.Errors
36+import Language.PureScript.Types
36import Language.PureScript.Linter.Exhaustive as L
37import Language.PureScript.Linter.Exhaustive as L
38-- | Lint the PureScript AST.
39-- | Lint the PureScript AST.
@@ -59,7 +60,7 @@ lint (Module _ _ mn ds _) = censor (onErrorMessages (ErrorInModule mn)) $ mapM_
60 f' :: Declaration -> MultipleErrors
61 f' :: Declaration -> MultipleErrors
61 f' (PositionedDeclaration pos _ dec) = onErrorMessages (PositionedError pos) (f' dec)
62 f' (PositionedDeclaration pos _ dec) = onErrorMessages (PositionedError pos) (f' dec)
62− f' dec = f dec
63+ f' dec = f dec <> checkShadowedTypeVars dec
64 in tell (f' d)
65 in tell (f' d)
@@ -75,17 +76,32 @@ lint (Module _ _ mn ds _) = censor (onErrorMessages (ErrorInModule mn)) $ mapM_
75 stepD s _ = (s, mempty)
76 stepD s _ = (s, mempty)
77 stepE :: S.Set Ident -> Expr -> (S.Set Ident, MultipleErrors)
78 stepE :: S.Set Ident -> Expr -> (S.Set Ident, MultipleErrors)
78− stepE s (Abs (Left name) _) = bind s name
79+ stepE s (Abs (Left name) _) = bindName s name
79 stepE s (Let ds' _) =
80 stepE s (Let ds' _) =
80− case mapAccumL bind s (nub (mapMaybe getDeclIdent ds')) of
81+ case mapAccumL bindName s (nub (mapMaybe getDeclIdent ds')) of
81 (s', es) -> (s', mconcat es)
82 (s', es) -> (s', mconcat es)
82 stepE s _ = (s, mempty)
83 stepE s _ = (s, mempty)
84 stepB :: S.Set Ident -> Binder -> (S.Set Ident, MultipleErrors)
85 stepB :: S.Set Ident -> Binder -> (S.Set Ident, MultipleErrors)
85− stepB s (VarBinder name) = bind s name
86+ stepB s (VarBinder name) = bindName s name
86− stepB s (NamedBinder name _) = bind s name
87+ stepB s (NamedBinder name _) = bindName s name
87 stepB s _ = (s, mempty)
88 stepB s _ = (s, mempty)
89− bind :: S.Set Ident -> Ident -> (S.Set Ident, MultipleErrors)
90+ bindName :: S.Set Ident -> Ident -> (S.Set Ident, MultipleErrors)
91+ bindName = bind ShadowedName
93+ checkShadowedTypeVars :: Declaration -> MultipleErrors
94+ checkShadowedTypeVars d =
95+ let (f, _, _, _, _) = accumTypes go in f d
97+ go :: Type -> MultipleErrors
98+ go = everythingWithContextOnTypes S.empty mempty mappend step
99+ step :: S.Set String -> Type -> (S.Set String, MultipleErrors)
100+ step s (ForAll tv _ _) = bindVar s tv
101+ step s _ = (s, mempty)
102+ bindVar :: S.Set String -> String -> (S.Set String, MultipleErrors)
103+ bindVar = bind ShadowedTypeVar
105+ bind :: (Ord a) => (a -> SimpleErrorMessage) -> S.Set a -> a -> (S.Set a, MultipleErrors)
90− bind s name | name `S.member` s = (s, errorMessage (ShadowedName name))
106+ bind mkError s name | name `S.member` s = (s, errorMessage (mkError name))
91− | otherwise = (S.insert name s, mempty)
107+ | otherwise = (S.insert name s, mempty)