@@ -28,6 +28,7 @@ import Control.Applicative (Applicative(..), (<$>), (<*>))
2828import Control.Monad
2929import Control.Monad.Error.Class (MonadError(..))
3030import Control.Monad.Writer (MonadWriter(..), censor)
31+import Control.Monad.State.Lazy
3132
3233import qualified Data.Map as M
3334
@@ -41,6 +42,7 @@ import Language.PureScript.Externs
4142import Language.PureScript.Sugar.Names.Env
4243import Language.PureScript.Sugar.Names.Imports
4344import Language.PureScript.Sugar.Names.Exports
45+import Language.PureScript.Linter.Imports
4446
4547-- |
4648-- Replaces all local names with qualified names within a list of modules. The
@@ -103,9 +105,11 @@ desugarImports externs modules = do
103105
104106 renameInModule' :: Env -> Module -> m Module
105107 renameInModule' env m@(Module _ _ mn _ _) =
106− rethrow (addHint (ErrorInModule mn)) $ do
108+ warnAndRethrow (addHint (ErrorInModule mn)) $ do
107109 let (_, imps, exps) = fromMaybe (internalError "Module is missing in renameInModule'") $ M.lookup mn env
108− elaborateImports imps <$> renameInModule env imps (elaborateExports exps m)
110+ (m', used) <- flip runStateT M.empty $ renameInModule env imps (elaborateExports exps m)
111+ findUnusedImports m imps used
112+ return $ elaborateImports imps m'
109113
110114-- |
111115-- Make all exports for a module explicit. This may still effect modules that
@@ -146,10 +150,11 @@ elaborateImports imps (Module ss coms mn decls exps) = Module ss coms mn decls'
146150-- Replaces all local names with qualified names within a module and checks that all existing
147151-- qualified names are valid.
148152--
149−renameInModule :: forall m. (Applicative m, MonadError MultipleErrors m) => Env -> Imports -> Module -> m Module
153+renameInModule :: forall m. (Applicative m, MonadError MultipleErrors m, MonadWriter MultipleErrors m, MonadState UsedImports m) => Env -> Imports -> Module -> m Module
150154renameInModule env imports (Module ss coms mn decls exps) =
151155 Module ss coms mn <$> parU decls go <*> pure exps
152156 where
157+
153158 (go, _, _, _, _) = everywhereWithContextOnValuesM (Nothing, []) updateDecl updateValue updateBinder updateCase defS
154159
155160 updateDecl :: (Maybe SourceSpan, [Ident]) -> Declaration -> m ((Maybe SourceSpan, [Ident]), Declaration)
@@ -168,7 +173,7 @@ renameInModule env imports (Module ss coms mn decls exps) =
168173 updateDecl (pos, bound) (ExternDeclaration name ty) =
169174 (,) (pos, name : bound) <$> (ExternDeclaration name <$> updateTypesEverywhere pos ty)
170175 updateDecl s d = return (s, d)
171−
176+ --
172177 updateValue :: (Maybe SourceSpan, [Ident]) -> Expr -> m ((Maybe SourceSpan, [Ident]), Expr)
173178 updateValue (_, bound) v@(PositionedValue pos' _ _) =
174179 return ((Just pos', bound), v)
@@ -189,7 +194,7 @@ renameInModule env imports (Module ss coms mn decls exps) =
189194 updateValue s@(pos, _) (TypedValue check val ty) =
190195 (,) s <$> (TypedValue check val <$> updateTypesEverywhere pos ty)
191196 updateValue s v = return (s, v)
192−
197+ --
193198 updateBinder :: (Maybe SourceSpan, [Ident]) -> Binder -> m ((Maybe SourceSpan, [Ident]), Binder)
194199 updateBinder (_, bound) v@(PositionedBinder pos _ _) =
195200 return ((Just pos, bound), v)
@@ -201,8 +206,8 @@ renameInModule env imports (Module ss coms mn decls exps) =
201206 return (s', TypedBinder t' b')
202207 updateBinder s v =
203208 return (s, v)
204−
205− updateCase :: (Maybe SourceSpan, [Ident]) -> CaseAlternative -> m ((Maybe SourceSpan, [Ident]), CaseAlternative)
209+ --
210+ updateCase :: (Maybe SourceSpan, [Ident]) -> CaseAlternative -> m ((Maybe SourceSpan, [Ident]), CaseAlternative)
206211 updateCase (pos, bound) c@(CaseAlternative bs _) =
207212 return ((pos, concatMap binderNames bs ++ bound), c)
208213
@@ -223,16 +228,16 @@ renameInModule env imports (Module ss coms mn decls exps) =
223228 updateConstraints pos = mapM (\(name, ts) -> (,) <$> updateClassName name pos <*> mapM (updateTypesEverywhere pos) ts)
224229
225230 updateTypeName :: Qualified ProperName -> Maybe SourceSpan -> m (Qualified ProperName)
226− updateTypeName = update UnknownType (importedTypes imports) (resolveType . exportedTypes)
231+ updateTypeName = update UnknownType (importedTypes imports) (resolveType . exportedTypes) IsProperName
227232
228233 updateDataConstructorName :: Qualified ProperName -> Maybe SourceSpan -> m (Qualified ProperName)
229− updateDataConstructorName = update (flip UnknownDataConstructor Nothing) (importedDataConstructors imports) (resolveDctor . exportedTypes)
234+ updateDataConstructorName = update (flip UnknownDataConstructor Nothing) (importedDataConstructors imports) (resolveDctor . exportedTypes) IsProperName
230235
231236 updateClassName :: Qualified ProperName -> Maybe SourceSpan -> m (Qualified ProperName)
232− updateClassName = update UnknownTypeClass (importedTypeClasses imports) (resolve . exportedTypeClasses)
237+ updateClassName = update UnknownTypeClass (importedTypeClasses imports) (resolve . exportedTypeClasses) IsProperName
233238
234239 updateValueName :: Qualified Ident -> Maybe SourceSpan -> m (Qualified Ident)
235− updateValueName = update UnknownValue (importedValues imports) (resolve . exportedValues)
240+ updateValueName = update UnknownValue (importedValues imports) (resolve . exportedValues) IdentName
236241
237242 -- Used when performing an update to qualify values and classes with their
238243 -- module of original definition.
@@ -255,16 +260,22 @@ renameInModule env imports (Module ss coms mn decls exps) =
255260 update :: (Ord a) => (Qualified a -> SimpleErrorMessage)
256261 -> M.Map (Qualified a) (Qualified a, ModuleName)
257262 -> (Exports -> a -> Maybe (Qualified a))
263+ -> (Qualified a -> Name)
258264 -> Qualified a
259265 -> Maybe SourceSpan
260266 -> m (Qualified a)
261− update unknown imps getE qname@(Qualified mn' name) pos = positioned $
267+ update unknown imps getE toName qname@(Qualified mn' name) pos = positioned $
262268 case (M.lookup qname imps, mn') of
263269 -- We found the name in our imports, so we return the name for it,
264270 -- qualifying with the name of the module it was originally defined in
265271 -- rather than the module we're importing from, to handle the case of
266272 -- re-exports.
267− (Just (_, mnOrig), _) -> return $ Qualified (Just mnOrig) name
273+ (Just (qn, mnOrig), _) -> do
274+ case qn of
275+ Qualified (Just mnNew) _ ->
276+ modify $ \result -> M.insert mnNew (maybe [toName qname] (toName qname :) (mnNew `M.lookup` result)) result
277+ _ -> return ()
278+ return $ Qualified (Just mnOrig) name
268279 -- If the name wasn't found in our imports but was qualified then we need
269280 -- to check whether it's a failed import from a "pseudo" module (created
270281 -- by qualified importing). If that's not the case, then we just need to