@@ -17,13 +17,13 @@ module Language.PureScript.ModuleDependencies (
17 ModuleGraph
17 ModuleGraph
21import Data.Graph
20import Data.Graph
23import Data.List (nub)
21import Data.List (nub)
22+import Data.Maybe (mapMaybe)
25import Language.PureScript.Declarations
24import Language.PureScript.Declarations
26import Language.PureScript.Names
25import Language.PureScript.Names
26+import Language.PureScript.Types
29-- A list of modules with their dependencies
29-- A list of modules with their dependencies
@@ -37,7 +37,7 @@ type ModuleGraph = [(ModuleName, [ModuleName])]
38sortModules :: [Module] -> Either String ([Module], ModuleGraph)
38sortModules :: [Module] -> Either String ([Module], ModuleGraph)
39sortModules ms = do
39sortModules ms = do
40− let verts = map (\m -> (m, getModuleName m, usedModules m)) ms
40+ let verts = map (\m@(Module _ ds _) -> (m, getModuleName m, nub (concatMap usedModules ds))) ms
41 ms' <- mapM toModule $ stronglyConnComp verts
41 ms' <- mapM toModule $ stronglyConnComp verts
42 let moduleGraph = map (\(_, mn, deps) -> (mn, deps)) verts
42 let moduleGraph = map (\(_, mn, deps) -> (mn, deps)) verts
43 return (ms', moduleGraph)
43 return (ms', moduleGraph)
@@ -45,19 +45,24 @@ sortModules ms = do
46-- Calculate a list of used modules based on explicit imports and qualified names
46-- Calculate a list of used modules based on explicit imports and qualified names
48−usedModules :: (Data d) => d -> [ModuleName]
48+usedModules :: Declaration -> [ModuleName]
49−usedModules = nub . everything (++) (mkQ [] qualifiedIdents `extQ` qualifiedProperNames `extQ` imports)
49+usedModules = let (f, _, _, _, _) = everythingOnValues (++) forDecls forValues (const []) (const []) (const []) in nub . f
51− qualifiedIdents :: Qualified Ident -> [ModuleName]
52− qualifiedIdents (Qualified (Just mn) _) = [mn]
53− qualifiedIdents _ = []
54− qualifiedProperNames :: Qualified ProperName -> [ModuleName]
55− qualifiedProperNames (Qualified (Just mn) _) = [mn]
56− qualifiedProperNames _ = []
57− imports :: Declaration -> [ModuleName]
51+ forDecls :: Declaration -> [ModuleName]
58− imports (ImportDeclaration mn _ _) = [mn]
52+ forDecls (ImportDeclaration mn _ _) = [mn]
59− imports (PositionedDeclaration _ d) = imports d
53+ forDecls _ = []
55+ forValues :: Value -> [ModuleName]
56+ forValues (Var (Qualified (Just mn) _)) = [mn]
57+ forValues (BinaryNoParens (Qualified (Just mn) _) _ _) = [mn]
58+ forValues (Constructor (Qualified (Just mn) _)) = [mn]
59+ forValues (TypedValue _ _ ty) = forTypes ty
62+ forTypes :: Type -> [ModuleName]
63+ forTypes (TypeConstructor (Qualified (Just mn) _)) = [mn]
64+ forTypes (ConstrainedType cs _) = mapMaybe (\(Qualified mn _, _) -> mn) cs
62getModuleName :: Module -> ModuleName
67getModuleName :: Module -> ModuleName
63getModuleName (Module mn _ _) = mn
68getModuleName (Module mn _ _) = mn