@@ -12,9 +12,10 @@ module Language.PureScript.Sugar.Names.Imports
12import Prelude ()
12import Prelude ()
13import Prelude.Compat
13import Prelude.Compat
15−import Data.List (find, delete, (\\))
16−import Data.Maybe (fromMaybe, isJust, isNothing, fromJust)
17import Data.Foldable (traverse_, for_)
15import Data.Foldable (traverse_, for_)
16+import Data.Function (on)
17+import Data.List (find, sortBy, groupBy, (\\))
18+import Data.Maybe (fromMaybe, isNothing, fromJust)
18import Data.Traversable (for)
19import Data.Traversable (for)
20import Control.Arrow (first)
21import Control.Arrow (first)
@@ -68,29 +69,23 @@ resolveImports env (Module ss coms currentModule decls exps) =
69 for_ (M.toList imports) $ \(mn, imps) -> do
70 for_ (M.toList imports) $ \(mn, imps) -> do
71− -- Better ordering for the warnings: the list is in last-import-first
72− -- order, but we want the first appearence of an import to be the primary,
73− -- and warnings to appear for later imports
74− let imps' = reverse imps
76− warned <- foldM (checkDuplicateImports mn) [] (selfCartesianSubset imps')
72+ warned <- foldM (checkDuplicateImports mn) [] (selfCartesianSubset imps)
78− let unqual = filter (\(_, _, q) -> isJust q) (imps' \\ warned)
74+ let unwarned = imps \\ warned
80− warned' <- (warned ++) <$>
76+ = join
81− if (length unqual < 2)
78+ . filter ((> 1) . length)
82− then return []
79+ . groupBy ((==) `on` defQual)
83− else case find (\(_, typ, _) -> isImplicit typ) unqual of
80+ . sortBy (compare `on` defQual)
84− Just i ->
81+ $ unwarned
85− for (delete i unqual) $ \i'@(pos, typ, _) -> do
82+
86− warn pos $ RedundantUnqualifiedImport mn typ
83+ warned' <-
89− for (tail unqual) $ \i@(pos, _, _) -> do
84+ for duplicates $ \i@(pos, _, _) -> do
90− warn pos $ DuplicateSelectiveImport mn
85+ warn pos $ DuplicateSelectiveImport mn
93− for_ (imps' \\ warned') $ \(pos, typ, _) ->
88+ for_ (imps \\ (warned ++ warned')) $ \(pos, typ, _) ->
94 let (dupeRefs, dupeDctors) = findDuplicateRefs $ case typ of
89 let (dupeRefs, dupeDctors) = findDuplicateRefs $ case typ of
95 Explicit refs -> refs
90 Explicit refs -> refs
96 Hiding refs -> refs
91 Hiding refs -> refs
@@ -105,6 +100,9 @@ resolveImports env (Module ss coms currentModule decls exps) =
105 return (Module ss coms currentModule decls' exps, resolved)
100 return (Module ss coms currentModule decls' exps, resolved)
103+ defQual :: ImportDef -> Maybe ModuleName
104+ defQual (_, _, q) = q
108 selfCartesianSubset :: [a] -> [(a, a)]
106 selfCartesianSubset :: [a] -> [(a, a)]
109 selfCartesianSubset (x : xs) = [(x, y) | y <- xs] ++ selfCartesianSubset xs
107 selfCartesianSubset (x : xs) = [(x, y) | y <- xs] ++ selfCartesianSubset xs
110 selfCartesianSubset [] = []
108 selfCartesianSubset [] = []