@@ -9,30 +9,26 @@ import Control.Concurrent.MVar (MVar, newMVar, newEmptyMVar, putMVar, readMVar,
99import Control.Monad (filterM, void)
1010import Control.Monad.Trans (liftIO)
1111import qualified Data.Map as Map
12−import qualified Data.Set as Set
1312import qualified Data.Map.Merge.Strict as Map
14−import Data.Map (Map)
15−import Data.Set (Set)
13+import qualified Data.Set as Set
1614import System.Directory (doesDirectoryExist)
1715import System.FilePath ((</>))
1816
19−import qualified Elm.Compiler.Objects as Obj
20−import qualified Elm.Docs as Docs
21−import qualified Elm.Interface as I
22−import qualified Elm.ModuleName as ModuleName
23−import Elm.Package (Name, Version)
24−import qualified Elm.PerUserCache as PerUserCache
25−import Elm.Project.Json (Project(..), AppInfo(..), PkgInfo(..))
26−import qualified Json.Encode as Encode
27−
2817import qualified Deps.Cache as Cache
2918import qualified Deps.Explorer as Explorer
3019import qualified Deps.Solver as Solver
3120import qualified Deps.Website as Website
3221import qualified Elm.Compiler as Compiler
22+import qualified Elm.Compiler.Objects as Obj
23+import qualified Elm.Constraint as Con
24+import qualified Elm.Interface as I
25+import qualified Elm.ModuleName as ModuleName
26+import qualified Elm.Package as Pkg
27+import qualified Elm.PerUserCache as PerUserCache
28+import Elm.Project.Json (Project(..), AppInfo(..), PkgInfo(..))
3329import qualified Elm.Project.Json as Project
34−import qualified Elm.Project.Constraint as Con
3530import qualified Elm.Project.Summary as Summary
31+import qualified Elm.Version as V
3632import qualified File.Args as Args
3733import qualified File.Compile as Compile
3834import qualified File.Crawl as Crawl
@@ -70,9 +66,9 @@ throw exit =
7066-- VERIFY APP
7167
7268
73−verifyApp :: AppInfo -> Task.Task (Map Name Version)
69+verifyApp :: AppInfo -> Task.Task (Map.Map Pkg.Name V.Version)
7470verifyApp info =
75− if _app_elm_version info /= Compiler.version then
71+ if _app_elm_version info /= V.compiler then
7672 throw (E.AppBadElm (_app_elm_version info))
7773
7874 else
@@ -95,7 +91,7 @@ verifyApp info =
9591-- VERIFY PKG
9692
9793
98−verifyPkg :: PkgInfo -> Task.Task (Map Name Version)
94+verifyPkg :: PkgInfo -> Task.Task (Map.Map Pkg.Name V.Version)
9995verifyPkg info =
10096 if not (Con.goodElm (_pkg_elm_version info)) then
10197 throw (E.PkgBadElm (_pkg_elm_version info))
@@ -117,19 +113,19 @@ verifyPkg info =
117113-- APP TO SOLUTION
118114
119115
120−appToSolution :: Project.AppInfo -> Task.Task (Map Name Version)
116+appToSolution :: Project.AppInfo -> Task.Task (Map.Map Pkg.Name V.Version)
121117appToSolution (Project.AppInfo _ _ depsDirect depsTrans testDirect testTrans) =
122118 do a <- union allowEqualDups depsTrans testDirect
123119 b <- union noDups depsDirect testTrans
124120 union noDups a b
125121
126122
127−noDups :: Name -> a -> a -> Task.Task a
123+noDups :: Pkg.Name -> a -> a -> Task.Task a
128124noDups _ _ _ =
129125 throw E.BadDeps
130126
131127
132−allowEqualDups :: Name -> Version -> Version -> Task.Task Version
128+allowEqualDups :: Pkg.Name -> V.Version -> V.Version -> Task.Task V.Version
133129allowEqualDups _ v1 v2 =
134130 if v1 == v2 then
135131 return v1
@@ -137,7 +133,7 @@ allowEqualDups _ v1 v2 =
137133 throw E.BadDeps
138134
139135
140−union :: (Name -> a -> a -> Task.Task a) -> Map Name a -> Map Name a -> Task.Task (Map Name a)
136+union :: (Pkg.Name -> a -> a -> Task.Task a) -> Map.Map Pkg.Name a -> Map.Map Pkg.Name a -> Task.Task (Map.Map Pkg.Name a)
141137union tieBreaker deps1 deps2 =
142138 Map.mergeA Map.preserveMissing Map.preserveMissing (Map.zipWithAMatched tieBreaker) deps1 deps2
143139
@@ -146,13 +142,13 @@ union tieBreaker deps1 deps2 =
146142-- VERIFY ARTIFACTS
147143
148144
149−verifyArtifacts :: Map Name Version -> Task.Task RawInfo
145+verifyArtifacts :: Map.Map Pkg.Name V.Version -> Task.Task RawInfo
150146verifyArtifacts solution =
151147 do Website.download =<< filterM noSrc (Map.toList solution)
152148 verifyBuildArtifacts solution
153149
154150
155−noSrc :: (Name, Version) -> Task.Task Bool
151+noSrc :: (Pkg.Name, V.Version) -> Task.Task Bool
156152noSrc (name, version) =
157153 do root <- Task.getPackageCacheDirFor name version
158154 liftIO $ not <$> doesDirectoryExist (root </> "src")
@@ -162,7 +158,7 @@ noSrc (name, version) =
162158-- VERIFY BUILD ARTIFACTS
163159
164160
165−verifyBuildArtifacts :: Map Name Version -> Task.Task RawInfo
161+verifyBuildArtifacts :: Map.Map Pkg.Name V.Version -> Task.Task RawInfo
166162verifyBuildArtifacts solution =
167163 do Task.report (Progress.BuildDepsStart (Map.size solution))
168164 startMVar <- liftIO newEmptyMVar
@@ -177,14 +173,14 @@ verifyBuildArtifacts solution =
177173
178174
179175data RawInfo =
180− RawInfo (Map Name PkgInfo) I.Interfaces
176+ RawInfo (Map.Map Pkg.Name PkgInfo) I.Interfaces
181177
182178
183179verifyBuild
184− :: MVar (Map Name (MVar Answer))
180+ :: MVar (Map.Map Pkg.Name (MVar Answer))
185181 -> MVar I.Interfaces
186− -> Name
187− -> Version
182+ -> Pkg.Name
183+ -> V.Version
188184 -> Task.Task (MVar Answer)
189185verifyBuild pkgInfoMVar ifacesMVar name version =
190186 do mvar <- liftIO newEmptyMVar
@@ -223,10 +219,10 @@ verifyBuild pkgInfoMVar ifacesMVar name version =
223219data Answer
224220 = Ok PkgInfo
225221 | Blocked
226− | Err Name Version
222+ | Err Pkg.Name V.Version
227223
228224
229−toInfo :: Name -> Answer -> Task.Task (Maybe PkgInfo)
225+toInfo :: Pkg.Name -> Answer -> Task.Task (Maybe PkgInfo)
230226toInfo _ answer =
231227 case answer of
232228 Ok info ->
@@ -240,7 +236,7 @@ toInfo _ answer =
240236 throw (E.BuildFailure elmHome name version)
241237
242238
243−ifNotBlocked :: Map Name Answer -> (Map Name PkgInfo -> IO Answer) -> IO Answer
239+ifNotBlocked :: Map.Map Pkg.Name Answer -> (Map.Map Pkg.Name PkgInfo -> IO Answer) -> IO Answer
244240ifNotBlocked answers callback =
245241 case traverse isOk answers of
246242 Nothing ->
@@ -263,32 +259,30 @@ isOk answer =
263259
264260
265261getIface
266− :: Name
267− -> Version
262+ :: Pkg.Name
263+ -> V.Version
268264 -> PkgInfo
269− -> Map Name PkgInfo
265+ -> Map.Map Pkg.Name PkgInfo
270266 -> I.Interfaces
271267 -> Task.Task I.Interfaces
272268getIface name version info infos depIfaces =
273269 do root <- Task.getPackageCacheDirFor name version
274270 let solution = Map.map _pkg_version infos
275271
276− cached <- isCached root solution
272+ cached <- liftIO $ isCached root solution
277273
278274 if cached
279− then IO.readBinary (root </> "ifaces.dat")
275+ then
276+ do maybeIfaces <- liftIO $ IO.readBinary (root </> "ifaces.dat")
277+ maybe (Task.throw (error "TODO corrupt binary 1")) return maybeIfaces
280278 else
281279 do Paths.removeStuff root
282− let docsPath = root </> "docs.json"
283−
284280 let summary = Summary.cheapInit root info infos depIfaces
285281 args <- Args.fromSummary summary
286282 graph <- Crawl.crawl summary args
287− (dirty, cachedIfaces) <- Plan.plan (Just docsPath) summary graph
288− answers <- Compile.compile (Pkg info) (Just docsPath) cachedIfaces dirty
283+ (dirty, cachedIfaces) <- Plan.plan summary graph
284+ answers <- Compile.compile (Pkg info) cachedIfaces dirty
289285 results <- Artifacts.ignore answers
290− _ <- Artifacts.writeDocs results docsPath
291−
292286 Paths.removeStuff root
293287
294288 updateCache root name info solution graph results
@@ -298,25 +292,29 @@ getIface name version info infos depIfaces =
298292-- IS CACHED?
299293
300294
301−isCached :: FilePath -> Map Name Version -> Task.Task Bool
295+isCached :: FilePath -> Map.Map Pkg.Name V.Version -> IO Bool
302296isCached root solution =
303297 IO.andM
304298 [ IO.exists (root </> "cached.dat")
305299 , IO.exists (root </> "ifaces.dat")
306300 , IO.exists (root </> "objs.dat")
307− , IO.exists (root </> "documentation.json")
308301 , isCachedHelp solution <$> IO.readBinary (root </> "cached.dat")
309302 ]
310303
311304
312−isCachedHelp :: Map Name Version -> Map Name (Set Version) -> Bool
313−isCachedHelp solution cachedDeps =
314− let
315− matches =
316− Map.intersectionWith Set.member solution cachedDeps
317− in
318− Map.size solution == Map.size matches
319− && Map.foldr (&&) True matches
305+isCachedHelp :: Map.Map Pkg.Name V.Version -> Maybe (Map.Map Pkg.Name (Set.Set V.Version)) -> Bool
306+isCachedHelp solution maybeCachedDeps =
307+ case maybeCachedDeps of
308+ Nothing ->
309+ False
310+
311+ Just cachedDeps ->
312+ let
313+ matches =
314+ Map.intersectionWith Set.member solution cachedDeps
315+ in
316+ Map.size solution == Map.size matches
317+ && Map.foldr (&&) True matches
320318
321319
322320
@@ -325,35 +323,31 @@ isCachedHelp solution cachedDeps =
325323
326324updateCache
327325 :: FilePath
328− -> Name
326+ -> Pkg.Name
329327 -> PkgInfo
330− -> Map Name Version
328+ -> Map.Map Pkg.Name V.Version
331329 -> Crawl.Result
332− -> Map ModuleName.Raw Compiler.Artifacts
330+ -> Map.Map ModuleName.Raw Compiler.Artifacts
333331 -> Task.Task I.Interfaces
334332updateCache root name info solution graph results =
335333 do let path = root </> "cached.dat"
336334 let deps = Map.map Set.singleton solution
337335 let elmi = crush name info results
338336
339− exists <- IO.exists path
337+ exists <- liftIO $ IO.exists path
340338
341339 if exists
342340 then
343− do oldDeps <- IO.readBinary path
344− IO.writeBinary path (Map.unionWith Set.union deps oldDeps)
341+ do maybeOldDeps <- liftIO $ IO.readBinary path
342+ oldDeps <- maybe (error "TODO corrupt binary 2") return maybeOldDeps
343+ liftIO $ IO.writeBinary path (Map.unionWith Set.union deps oldDeps)
345344 else
345+ liftIO $
346346 do IO.writeBinary (root </> "ifaces.dat") elmi
347−
348347 IO.writeBinary path deps
349−
350348 IO.writeBinary (root </> "objs.dat") $
351349 Map.foldr addGraph (objGraphFromKernels graph) results
352350
353− liftIO $ Encode.writeUgly (root </> "documentation.json") $
354− Encode.list Docs.encode $
355− Map.foldr addDocs [] results
356−
357351 return elmi
358352
359353
@@ -361,7 +355,7 @@ updateCache root name info solution graph results =
361355-- CRUSH INTERFACES
362356
363357
364−crush :: Name -> PkgInfo -> Map ModuleName.Raw Compiler.Artifacts -> I.Interfaces
358+crush :: Pkg.Name -> PkgInfo -> Map.Map ModuleName.Raw Compiler.Artifacts -> I.Interfaces
365359crush pkg info results =
366360 let
367361 exposed =
@@ -371,8 +365,8 @@ crush pkg info results =
371365 Map.mapMaybeWithKey (crushHelp exposed) results
372366
373367
374−crushHelp :: Set ModuleName.Raw -> ModuleName.Raw -> Compiler.Artifacts -> Maybe I.Interface
375−crushHelp exposed name (Compiler.Artifacts elmi _ _) =
368+crushHelp :: Set.Set ModuleName.Raw -> ModuleName.Raw -> Compiler.Artifacts -> Maybe I.Interface
369+crushHelp exposed name (Compiler.Artifacts elmi _) =
376370 if Set.member name exposed then
377371 Just elmi
378372
@@ -381,25 +375,11 @@ crushHelp exposed name (Compiler.Artifacts elmi _ _) =
381375
382376
383377
384−-- DOCUMENTATION
385−
386−
387−addDocs :: Compiler.Artifacts -> [Docs.Module] -> [Docs.Module]
388−addDocs (Compiler.Artifacts _ _ maybeDocs) docsList =
389− case maybeDocs of
390− Nothing ->
391− docsList
392−
393− Just docs ->
394− docs : docsList
395−
396−
397−
398378-- OBJECT GRAPH
399379
400380
401381addGraph :: Compiler.Artifacts -> Obj.Graph -> Obj.Graph
402−addGraph (Compiler.Artifacts _ elmo _) graph =
382+addGraph (Compiler.Artifacts _ elmo) graph =
403383 Obj.union elmo graph
404384
405385