@@ -5,14 +5,14 @@ module Stuff.Verify
8−import Prelude hiding (read)
8+import Control.Monad (liftM2, liftM3, liftM4)
9−import qualified Data.Map as Map
9+import Data.Binary
10import Data.Map (Map)
10import Data.Map (Map)
12+import qualified Elm.Compiler.Module as Module
12import Elm.Package (Name, Version)
13import Elm.Package (Name, Version)
14import qualified Deps.Verify as Verify
15import qualified Deps.Verify as Verify
15−import Elm.Project.Json (Project(..), PkgInfo(..))
16import qualified Elm.Project.Json as Project
16import qualified Elm.Project.Json as Project
17import qualified Elm.Project.Constraint as Con
17import qualified Elm.Project.Constraint as Con
18import qualified Elm.Project.Summary as Summary
18import qualified Elm.Project.Summary as Summary
@@ -25,72 +25,99 @@ import qualified Stuff.Paths as Path
28−verify :: FilePath -> Project -> Task.Task Summary.Summary
28+verify :: FilePath -> Project.Project -> Task.Task Summary.Summary
29verify root project =
29verify root project =
30− do fresh <-
30+ do exists <- IO.exists Path.summary
32− [ IO.exists Path.solution
32+ then
33+ do (MiniSummary deps exposed ifaces graph) <- IO.readBinary Path.summary
34+ if isValidMiniSummary deps project
36+ return (Summary.Summary root project exposed ifaces graph)
33− , IO.exists Path.summary
38+ do IO.remove Path.summary
34− , checkSolution project
39+ cacheSummary root project
41+ cacheSummary root project
44+cacheSummary :: FilePath -> Project.Project -> Task.Task Summary.Summary
45+cacheSummary root project =
46+ do summary@(Summary.Summary _ _ exposed ifaces graph) <- Verify.verify root project
47+ IO.writeBinary Path.summary (MiniSummary (getDeps project) exposed ifaces graph)
38− then read root project
39− else rebuildCache root project
42−rebuildCache :: FilePath -> Project -> Task.Task Summary.Summary
52+-- MINI SUMMARY
43−rebuildCache root project =
44− do IO.remove Path.solution
45− IO.remove Path.summary
47− (solution, summary) <- Verify.verify root project
49− IO.writeBinary Path.solution solution
55+data MiniSummary =
50− write summary
56+ MiniSummary
51− return summary
57+ { _deps :: ProjectDeps
58+ , _exposed :: Summary.ExposedModules
59+ , _ifaces :: Module.Interfaces
60+ , _depsGraph :: Summary.DepsGraph
65+ = App (Map Name Version) (Map Name Version) (Map Name Version)
66+ | Pkg (Map Name Con.Constraint) (Map Name Con.Constraint)
69+getDeps :: Project.Project -> ProjectDeps
72+ Project.App (Project.AppInfo _ _ direct test trans) ->
73+ App direct test trans
58−read :: FilePath -> Project -> Task.Task Summary.Summary
75+ Project.Pkg (Project.PkgInfo _ _ _ _ _ direct test _) ->
59−read root project =
76+ Pkg direct test
60− do (exposed, ifaces, graph) <- IO.readBinary Path.summary
61− return (Summary.Summary root project exposed ifaces graph)
64−write :: Summary.Summary -> Task.Task ()
79+isValidMiniSummary :: ProjectDeps -> Project.Project -> Bool
65−write (Summary.Summary _ _ exposed ifaces graph) =
80+isValidMiniSummary deps project =
66− IO.writeBinary Path.summary ( exposed, ifaces, graph )
81+ case deps of
82+ App cachedDirect cachedTest cachedTrans ->
87+ Project.App (Project.AppInfo _ _ direct test trans) ->
88+ cachedDirect == direct
89+ && cachedTest == test
90+ && cachedTrans == trans
92+ Pkg cachedDirect cachedTest ->
94+ Project.Pkg (Project.PkgInfo _ _ _ _ _ direct test _) ->
95+ cachedDirect == direct
96+ && cachedTest == test
70−-- CHECK SOLUTION
98+ Project.App _ ->
73−checkSolution :: Project -> Task.Task Bool
74−checkSolution project =
75− checkSolutionHelp project <$> IO.readBinary Path.solution
78−checkSolutionHelp :: Project -> Map Name Version -> Bool
105+
79−checkSolutionHelp project solution =
106+instance Binary MiniSummary where
107+ get = liftM4 MiniSummary get get get get
108+ put (MiniSummary a b c d) = put a >> put b >> put c >> put d
112+instance Binary ProjectDeps where
80− case project of
114+ case deps of
81− App info ->
115+ App a b c -> putWord8 0 >> put a >> put b >> put c
82− solution == Project.appSolution info
116+ Pkg a b -> putWord8 1 >> put a >> put b
84− Pkg info ->
118+ get =
85− allGood (_pkg_test_deps info) solution
119+ do n <- getWord8
86− && allGood (_pkg_deps info) solution
120+ case n of
87−
121+ 0 -> liftM3 App get get get
88−
122+ 1 -> liftM2 Pkg get get
89−allGood :: Map Name Con.Constraint -> Map Name Version -> Bool
123+ _ -> error "binary encoding of ProjectDeps was corrupted"
93− Map.intersectionWith Con.satisfies cons vsns
95− Map.size cons == Map.size bools
96− && Map.foldr (&&) True bools