1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
9import Control.Monad.Except (liftIO)
10import qualified Data.Map as Map
11import qualified Data.Maybe as Maybe
12import qualified Data.Name as Name
13import qualified System.FilePath as FP
14import qualified System.Directory as Dir
15import System.FilePath ((</>), (<.>))
17import qualified Elm.Compiler.Module as Module
18import qualified Elm.Package as Pkg
20import qualified Elm.Project.Json as Project
21import qualified Elm.Project.Summary as Summary
22import qualified Reporting.Exit.Crawl as E
23import qualified Reporting.Task as Task
32 | Kernel FilePath (Maybe FilePath)
41find :: Summary.Summary -> E.Origin -> Module.Raw -> Task.Task_ E.Problem Asset
42find (Summary.Summary root project exposed _ _) origin name =
43 do here <- liftIO Dir.getCurrentDirectory
44 let toRoot dir = FP.makeRelative here (root </> dir)
47 do let srcDirs = map toRoot (Project._app_source_dirs info)
48 findElm project srcDirs exposed origin name
51 if Name.isKernel name then
52 if Project.isPlatformPackage project then
53 findKernel (toRoot "src") exposed origin name
55 Task.throw $ E.ModuleNameReservedForKernel origin name
58 findElm project [ toRoot "src" ] exposed origin name
65findElm :: Project.Project -> [FilePath] -> Summary.ExposedModules -> E.Origin -> Module.Raw -> Task.Task_ E.Problem Asset
66findElm project srcDirs exposed origin name =
68 paths <- liftIO $ Maybe.catMaybes <$> mapM (elmExists name) srcDirs
70 case (paths, Map.lookup name exposed) of
80 Task.throw $ E.ModuleNotFound origin name (E.App srcDirs)
83 Task.throw $ E.ModuleNotFound origin name E.Pkg
86 Task.throw $ E.ModuleAmbiguous origin name paths (maybe [] id maybePkgs)
89elmExists :: Module.Raw -> FilePath -> IO (Maybe FilePath)
90elmExists name srcDir =
91 do let path = srcDir </> Module.nameToSlashPath name <.> "elm"
92 exists <- Dir.doesFileExist path
93 return $ if exists then Just path else Nothing
100findKernel :: FilePath -> Summary.ExposedModules -> E.Origin -> Module.Raw -> Task.Task_ E.Problem Asset
101findKernel srcDir exposed origin name =
102 do let clientPath = srcDir </> Module.nameToSlashPath name <.> "js"
103 let serverPath = srcDir </> Module.nameToSlashPath name <.> "server.js"
104 client <- liftIO $ Dir.doesFileExist clientPath
105 server <- liftIO $ Dir.doesFileExist serverPath
107 then return $ Kernel clientPath (if server then Just serverPath else Nothing)
109 case Map.lookup (Name.getKernel name) exposed of
110 Just [Pkg.Package pkg _vsn] | pkg == Pkg.core || pkg == Pkg.virtualDom ->
114 Task.throw $ E.ModuleNotFound origin name E.Pkg
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