@@ -36,24 +36,35 @@ import Language.PureScript.Names (ModuleName)
3636import Language.PureScript.Sugar.Names.Env (Env , primEnv )
3737import 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.
3942newtype UpToDateStatus = UpToDateStatus Bool
4043
4144isUpToDate :: UpToDateStatus -> Bool
4245isUpToDate (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.
4653data 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
5869newtype BuildJob = BuildJob
5970 { bjResult :: C. MVar BuildJobResult
@@ -152,7 +163,6 @@ getPrevResult :: BuildPlan -> ModuleName -> Maybe (UpToDateStatus, ExternsFile)
152163getPrevResult buildPlan moduleName =
153164 fmap pbExternsFile <$> M. lookup moduleName (bpPreviousBuilt buildPlan)
154165
155-
156166data 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
300319maximumMaybe :: Ord a => [a ] -> Maybe a
301320maximumMaybe [] = Nothing
0 commit comments