Skip to content

Commit 2e3a49e

Browse files
committed
Add comments to BuildPlan
1 parent dbc3aac commit 2e3a49e

File tree

1 file changed

+30
-11
lines changed

1 file changed

+30
-11
lines changed

src/Language/PureScript/Make/BuildPlan.hs

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,24 +36,35 @@ import Language.PureScript.Names (ModuleName)
3636
import Language.PureScript.Sugar.Names.Env (Env, primEnv)
3737
import System.Directory (getCurrentDirectory)
3838

39+
-- This status tells if a module's exiting build artifacts are up to date with a
40+
-- current module's content. It would be safe to re-use them, but only if
41+
-- changes in its dependencies do require the module's rebuild.
3942
newtype UpToDateStatus = UpToDateStatus Bool
4043

4144
isUpToDate :: UpToDateStatus -> Bool
4245
isUpToDate (UpToDateStatus b) = b
4346

47+
data Prebuilt = Prebuilt
48+
{ pbExternsFile :: ExternsFile
49+
}
50+
4451
-- | The BuildPlan tracks information about our build progress, and holds all
4552
-- prebuilt modules for incremental builds.
4653
data BuildPlan = BuildPlan
4754
{ bpPrebuilt :: M.Map ModuleName Prebuilt
55+
-- ^ Valid prebuilt results for modules, that are needed for rebuild, but
56+
-- their rebuild is not required.
4857
, bpPreviousBuilt :: M.Map ModuleName (UpToDateStatus, Prebuilt)
58+
-- ^ Previously built results for modules that are potentially required to be
59+
-- rebuilt. We will always rebuild not up to date modules. But we will only
60+
-- rebuild up to date modules, if their deps' externs have effectively
61+
-- changed. Previously built result is needed to compare previous and newly
62+
-- built externs to know what have changed.
4963
, bpBuildJobs :: M.Map ModuleName BuildJob
5064
, bpEnv :: C.MVar Env
5165
, bpIndex :: C.MVar Int
5266
}
5367

54-
data Prebuilt = Prebuilt
55-
{ pbExternsFile :: ExternsFile
56-
}
5768

5869
newtype BuildJob = BuildJob
5970
{ bjResult :: C.MVar BuildJobResult
@@ -152,7 +163,6 @@ getPrevResult :: BuildPlan -> ModuleName -> Maybe (UpToDateStatus, ExternsFile)
152163
getPrevResult buildPlan moduleName =
153164
fmap pbExternsFile <$> M.lookup moduleName (bpPreviousBuilt buildPlan)
154165

155-
156166
data Options = Options
157167
{ optPreloadAllExterns :: Bool
158168
}
@@ -278,24 +288,33 @@ construct Options{..} MakeActions{..} cacheDb (sorted, graph) = do
278288
splitModules :: [RebuildStatus] -> (M.Map ModuleName (Maybe (UpToDateStatus, UTCTime)), M.Map ModuleName UTCTime)
279289
splitModules = foldl' collectByStatus (M.empty, M.empty)
280290

281-
collectByStatus (build, prev) (RebuildStatus mn rebuildNever _ mbPb upToDate)
282-
| Nothing <- mbPb = (M.insert mn Nothing build, prev)
291+
collectByStatus (build, prebuilt) (RebuildStatus mn rebuildNever _ mbPb upToDate)
292+
-- To build if no prebuilt result exits.
293+
| Nothing <- mbPb = (M.insert mn Nothing build, prebuilt)
294+
-- To build if not up to date.
283295
| Just pb <- mbPb, not upToDate = toRebuild (False, pb)
296+
-- To prebuilt because of policy.
284297
| Just pb <- mbPb, rebuildNever = toPrebuilt pb
298+
-- In other case analyze compilation times of dependencies.
285299
| Just pb <- mbPb = do
286300
let deps = moduleDeps mn
287-
let modTimes = map (flip M.lookup prev) deps
301+
let modTimes = map (flip M.lookup prebuilt) deps
288302

289303
case maximumMaybe (catMaybes modTimes) of
290304
-- Check if any of deps where build later. This means we should
291-
-- recompile even if the source is up-to-date.
305+
-- recompile even if the module's source is up-to-date. This may
306+
-- happen due to some partial builds or ide compilation
307+
-- workflows involved that do not assume full project
308+
-- compilation. We should treat those modules as NOT up to date
309+
-- to ensure they are rebuilt.
292310
Just depModTime | pb < depModTime -> toRebuild (False, pb)
293-
-- If one of the deps is not in the prebuilt, we should rebuild.
311+
-- If one of the deps is not in the prebuilt, though the module
312+
-- is up to date, we should add it in the rebuild queue.
294313
_ | any isNothing modTimes -> toRebuild (upToDate, pb)
295314
_ -> toPrebuilt pb
296315
where
297-
toRebuild (up, t) = (M.insert mn (Just (UpToDateStatus up, t)) build, prev)
298-
toPrebuilt v = (build, M.insert mn v prev)
316+
toRebuild (up, t) = (M.insert mn (Just (UpToDateStatus up, t)) build, prebuilt)
317+
toPrebuilt v = (build, M.insert mn v prebuilt)
299318

300319
maximumMaybe :: Ord a => [a] -> Maybe a
301320
maximumMaybe [] = Nothing

0 commit comments

Comments
 (0)