1-----------------------------------------------------------------------------
3-- Module : Language.PureScript.ModuleDependencies
4-- Copyright : (c) 2013-15 Phil Freeman, (c) 2014-15 Gary Burgess
5-- License : MIT (http://opensource.org/licenses/MIT)
7-- Maintainer : Phil Freeman <paf31@cantab.net>
8-- Stability : experimental
11-- | Provides the ability to sort modules based on module dependencies
13-----------------------------------------------------------------------------
15{-# LANGUAGE FlexibleContexts #-}
17module Language.PureScript.ModuleDependencies (
22import Control.Monad.Error.Class (MonadError(..))
26import Data.Maybe (fromMaybe, mapMaybe)
28import Language.PureScript.AST
29import Language.PureScript.Names
30import Language.PureScript.Types
31import Language.PureScript.Errors
33-- | A list of modules with their transitive dependencies
34type ModuleGraph = [(ModuleName, [ModuleName])]
36-- | Sort a collection of modules based on module dependencies.
38-- Reports an error if the module graph contains a cycle.
40sortModules :: (MonadError MultipleErrors m) => [Module] -> m ([Module], ModuleGraph)
42 let verts = map (\m@(Module _ _ _ ds _) -> (m, getModuleName m, nub (concatMap usedModules ds))) ms
43 ms' <- mapM toModule $ stronglyConnComp verts
44 let (graph, fromVertex, toVertex) = graphFromEdges verts
45 moduleGraph = do (_, mn, _) <- verts
46 let v = fromMaybe (error "sortModules: vertex not found") (toVertex mn)
47 deps = reachable graph v
48 toKey i = case fromVertex i of (_, key, _) -> key
49 return (mn, filter (/= mn) (map toKey deps))
50 return (ms', moduleGraph)
53-- Calculate a list of used modules based on explicit imports and qualified names
55usedModules :: Declaration -> [ModuleName]
56usedModules = let (f, _, _, _, _) = everythingOnValues (++) forDecls forValues (const []) (const []) (const []) in nub . f
58 forDecls :: Declaration -> [ModuleName]
59 forDecls (ImportDeclaration mn _ _) = [mn]
62 forValues :: Expr -> [ModuleName]
63 forValues (Var (Qualified (Just mn) _)) = [mn]
64 forValues (Constructor (Qualified (Just mn) _)) = [mn]
65 forValues (TypedValue _ _ ty) = forTypes ty
68 forTypes :: Type -> [ModuleName]
69 forTypes (TypeConstructor (Qualified (Just mn) _)) = [mn]
70 forTypes (ConstrainedType cs _) = mapMaybe (\(Qualified mn _, _) -> mn) cs
74-- Convert a strongly connected component of the module graph to a module
76toModule :: (MonadError MultipleErrors m) => SCC Module -> m Module
77toModule (AcyclicSCC m) = return m
78toModule (CyclicSCC [m]) = return m
79toModule (CyclicSCC ms) = throwError . errorMessage $ CycleInModules (map getModuleName ms)
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list