@@ -66,19 +66,20 @@ data Env =
66 , _root :: FilePath
66 , _root :: FilePath
67 , _pkg :: Pkg.Name
67 , _pkg :: Pkg.Name
68 , _srcDirs :: [FilePath]
68 , _srcDirs :: [FilePath]
69+ , _buildID :: Details.BuildID
69 , _locals :: Map.Map ModuleName.Raw Details.Local
70 , _locals :: Map.Map ModuleName.Raw Details.Local
70 , _foreigns :: Map.Map ModuleName.Raw Details.Foreign
71 , _foreigns :: Map.Map ModuleName.Raw Details.Foreign
74makeEnv :: Reporting.BKey -> FilePath -> Details.Details -> Env
75makeEnv :: Reporting.BKey -> FilePath -> Details.Details -> Env
75−makeEnv key root (Details.Details _ validOutline locals foreigns _) =
76+makeEnv key root (Details.Details _ validOutline buildID locals foreigns _) =
76 case validOutline of
77 case validOutline of
77 Details.ValidApp srcDirs ->
78 Details.ValidApp srcDirs ->
78− Env key root Pkg.dummyName (NE.toList srcDirs) locals foreigns
79+ Env key root Pkg.dummyName (NE.toList srcDirs) buildID locals foreigns
80 Details.ValidPkg pkg _ _ ->
81 Details.ValidPkg pkg _ _ ->
81− Env key root pkg ["src"] locals foreigns
82+ Env key root pkg ["src"] buildID locals foreigns
@@ -238,7 +239,7 @@ crawlDeps env mvar deps blockedValue =
240crawlModule :: Env -> MVar StatusDict -> DocsNeed -> ModuleName.Raw -> IO Status
241crawlModule :: Env -> MVar StatusDict -> DocsNeed -> ModuleName.Raw -> IO Status
241−crawlModule env@(Env _ root pkg srcDirs locals foreigns) mvar docsNeed name =
242+crawlModule env@(Env _ root pkg srcDirs buildID locals foreigns) mvar docsNeed name =
242 do let fileName = ModuleName.toFilePath name <.> "elm"
243 do let fileName = ModuleName.toFilePath name <.> "elm"
243 let inRoot path = File.exists (root </> path)
244 let inRoot path = File.exists (root </> path)
@@ -251,18 +252,15 @@ crawlModule env@(Env _ root pkg srcDirs locals foreigns) mvar docsNeed name =
251 return $ SBadImport $ Import.Ambiguous path [] dep deps
252 return $ SBadImport $ Import.Ambiguous path [] dep deps
253 Nothing ->
254 Nothing ->
255+ do newTime <- File.getTime path
254− case Map.lookup name locals of
256+ case Map.lookup name locals of
255− Nothing ->
257+ Nothing ->
256− crawlFile env mvar docsNeed name path =<< File.getTime path
258+ crawlFile env mvar docsNeed name path newTime buildID
258− Just local@(Details.Local oldPath oldTime deps _) ->
260+ Just local@(Details.Local oldPath oldTime deps _ lastChange _) ->
260− then crawlFile env mvar docsNeed name path =<< File.getTime path
262− do newTime <- File.getTime path
263− if oldTime /= newTime || needsDocs docsNeed
261+ if path /= oldPath || oldTime /= newTime || needsDocs docsNeed
264− then crawlFile env mvar docsNeed name path newTime
262+ then crawlFile env mvar docsNeed name path newTime lastChange
265− else crawlDeps env mvar deps (SCached local)
263+ else crawlDeps env mvar deps (SCached local)
267 p1:p2:ps ->
265 p1:p2:ps ->
268 return $ SBadImport $ Import.AmbiguousLocal p1 p2 ps
266 return $ SBadImport $ Import.AmbiguousLocal p1 p2 ps
@@ -285,8 +283,8 @@ crawlModule env@(Env _ root pkg srcDirs locals foreigns) mvar docsNeed name =
285 return $ SBadImport Import.NotFound
283 return $ SBadImport Import.NotFound
288−crawlFile :: Env -> MVar StatusDict -> DocsNeed -> ModuleName.Raw -> FilePath -> File.Time -> IO Status
286+crawlFile :: Env -> MVar StatusDict -> DocsNeed -> ModuleName.Raw -> FilePath -> File.Time -> Details.BuildID -> IO Status
289−crawlFile env@(Env _ root pkg _ _ _) mvar docsNeed expectedName path time =
287+crawlFile env@(Env _ root pkg _ buildID _ _) mvar docsNeed expectedName path time lastChange =
290 do source <- File.readUtf8 (root </> path)
288 do source <- File.readUtf8 (root </> path)
292 case Parse.fromByteString pkg source of
290 case Parse.fromByteString pkg source of
@@ -302,7 +300,7 @@ crawlFile env@(Env _ root pkg _ _ _) mvar docsNeed expectedName path time =
302 if expectedName == actualName then
300 if expectedName == actualName then
304 deps = map Src.getImportName imports
302 deps = map Src.getImportName imports
305− local = Details.Local path time deps (any isMain values)
303+ local = Details.Local path time deps (any isMain values) lastChange buildID
307 crawlDeps env mvar deps (SChanged local source modul docsNeed)
305 crawlDeps env mvar deps (SChanged local source modul docsNeed)
@@ -325,7 +323,7 @@ type ResultDict =
325data Result
323data Result
326 = RNew !Details.Local !I.Interface !Opt.LocalGraph !(Maybe Docs.Module)
324 = RNew !Details.Local !I.Interface !Opt.LocalGraph !(Maybe Docs.Module)
327 | RSame !Details.Local !I.Interface !Opt.LocalGraph !(Maybe Docs.Module)
325 | RSame !Details.Local !I.Interface !Opt.LocalGraph !(Maybe Docs.Module)
328− | RCached Bool (MVar CachedInterface)
326+ | RCached Bool Details.BuildID (MVar CachedInterface)
329 | RNotFound Import.Problem
327 | RNotFound Import.Problem
330 | RProblem Error.Module
328 | RProblem Error.Module
331 | RBlocked
329 | RBlocked
@@ -340,11 +338,11 @@ data CachedInterface
342checkModule :: Env -> Dependencies -> MVar ResultDict -> ModuleName.Raw -> Status -> IO Result
340checkModule :: Env -> Dependencies -> MVar ResultDict -> ModuleName.Raw -> Status -> IO Result
343−checkModule env@(Env _ root pkg _ _ _) foreigns resultsMVar name status =
341+checkModule env@(Env _ root pkg _ _ _ _) foreigns resultsMVar name status =
344 case status of
342 case status of
345− SCached local@(Details.Local path time deps hasMain) ->
343+ SCached local@(Details.Local path time deps hasMain lastChange lastCompile) ->
346 do results <- readMVar resultsMVar
344 do results <- readMVar resultsMVar
347− depsStatus <- checkDeps root results deps
345+ depsStatus <- checkDeps root results deps lastCompile
348 case depsStatus of
346 case depsStatus of
349 DepsChange ifaces ->
347 DepsChange ifaces ->
350 do source <- File.readUtf8 path
348 do source <- File.readUtf8 path
@@ -356,7 +354,7 @@ checkModule env@(Env _ root pkg _ _ _) foreigns resultsMVar name status =
357 DepsSame _ _ ->
355 DepsSame _ _ ->
358 do mvar <- newMVar Unneeded
356 do mvar <- newMVar Unneeded
359− return (RCached hasMain mvar)
357+ return (RCached hasMain lastChange mvar)
361 DepsBlock ->
359 DepsBlock ->
362 return RBlocked
360 return RBlocked
@@ -371,9 +369,9 @@ checkModule env@(Env _ root pkg _ _ _) foreigns resultsMVar name status =
371 Left err ->
369 Left err ->
372 Error.BadSyntax err
370 Error.BadSyntax err
374− SChanged local@(Details.Local path time deps _) source modul@(Src.Module _ _ _ imports _ _ _ _ _) docsNeed ->
372+ SChanged local@(Details.Local path time deps _ _ lastCompile) source modul@(Src.Module _ _ _ imports _ _ _ _ _) docsNeed ->
375 do results <- readMVar resultsMVar
373 do results <- readMVar resultsMVar
376− depsStatus <- checkDeps root results deps
374+ depsStatus <- checkDeps root results deps lastCompile
377 case depsStatus of
375 case depsStatus of
378 DepsChange ifaces ->
376 DepsChange ifaces ->
379 compile env docsNeed local source ifaces modul
377 compile env docsNeed local source ifaces modul
@@ -418,29 +416,45 @@ data DepsStatus
418 | DepsNotFound (NE.List (ModuleName.Raw, Import.Problem))
416 | DepsNotFound (NE.List (ModuleName.Raw, Import.Problem))
421−checkDeps :: FilePath -> ResultDict -> [ModuleName.Raw] -> IO DepsStatus
419+checkDeps :: FilePath -> ResultDict -> [ModuleName.Raw] -> Details.BuildID -> IO DepsStatus
422−checkDeps root results deps =
420+checkDeps root results deps lastCompile =
423− checkDepsHelp root results deps [] [] [] [] False
421+ checkDepsHelp root results deps [] [] [] [] False 0 lastCompile
426type Dep = (ModuleName.Raw, I.Interface)
424type Dep = (ModuleName.Raw, I.Interface)
427type CDep = (ModuleName.Raw, MVar CachedInterface)
425type CDep = (ModuleName.Raw, MVar CachedInterface)
430−checkDepsHelp :: FilePath -> ResultDict -> [ModuleName.Raw] -> [Dep] -> [Dep] -> [CDep] -> [(ModuleName.Raw,Import.Problem)] -> Bool -> IO DepsStatus
428+checkDepsHelp :: FilePath -> ResultDict -> [ModuleName.Raw] -> [Dep] -> [Dep] -> [CDep] -> [(ModuleName.Raw,Import.Problem)] -> Bool -> Details.BuildID -> Details.BuildID -> IO DepsStatus
431−checkDepsHelp root results deps new same cached importProblems isBlocked =
429+checkDepsHelp root results deps new same cached importProblems isBlocked lastDepChange lastCompile =
432 case deps of
430 case deps of
433 dep:otherDeps ->
431 dep:otherDeps ->
434 do result <- readMVar (results ! dep)
432 do result <- readMVar (results ! dep)
435 case result of
433 case result of
434+ RNew (Details.Local _ _ _ _ lastChange _) iface _ _ ->
436− RNew _ iface _ _ -> checkDepsHelp root results otherDeps ((dep,iface) : new) same cached importProblems isBlocked
435+ checkDepsHelp root results otherDeps ((dep,iface) : new) same cached importProblems isBlocked (max lastChange lastDepChange) lastCompile
437+ RSame (Details.Local _ _ _ _ lastChange _) iface _ _ ->
437− RSame _ iface _ _ -> checkDepsHelp root results otherDeps new ((dep,iface) : same) cached importProblems isBlocked
438+ checkDepsHelp root results otherDeps new ((dep,iface) : same) cached importProblems isBlocked (max lastChange lastDepChange) lastCompile
440+ RCached _ lastChange mvar ->
438− RCached _ mvar -> checkDepsHelp root results otherDeps new same ((dep,mvar) : cached) importProblems isBlocked
441+ checkDepsHelp root results otherDeps new same ((dep,mvar) : cached) importProblems isBlocked (max lastChange lastDepChange) lastCompile
439− RNotFound prob -> checkDepsHelp root results otherDeps new same cached ((dep,prob) : importProblems) True
444+ checkDepsHelp root results otherDeps new same cached ((dep,prob) : importProblems) True lastDepChange lastCompile
440− RProblem _ -> checkDepsHelp root results otherDeps new same cached importProblems True
447+ checkDepsHelp root results otherDeps new same cached importProblems True lastDepChange lastCompile
441− RBlocked -> checkDepsHelp root results otherDeps new same cached importProblems True
450+ checkDepsHelp root results otherDeps new same cached importProblems True lastDepChange lastCompile
442− RForeign iface -> checkDepsHelp root results otherDeps new ((dep,iface) : same) cached importProblems isBlocked
453+ checkDepsHelp root results otherDeps new ((dep,iface) : same) cached importProblems isBlocked lastDepChange lastCompile
443− RKernel -> checkDepsHelp root results otherDeps new same cached importProblems isBlocked
456+ checkDepsHelp root results otherDeps new same cached importProblems isBlocked lastDepChange lastCompile
446 case reverse importProblems of
460 case reverse importProblems of
@@ -451,7 +465,7 @@ checkDepsHelp root results deps new same cached importProblems isBlocked =
451 if isBlocked then
465 if isBlocked then
452 return $ DepsBlock
466 return $ DepsBlock
454− else if null new then
468+ else if null new && lastDepChange <= lastCompile then
455 return $ DepsSame same cached
469 return $ DepsSame same cached
@@ -466,7 +480,7 @@ checkDepsHelp root results deps new same cached importProblems isBlocked =
468toImportErrors :: Env -> ResultDict -> [Src.Import] -> NE.List (ModuleName.Raw, Import.Problem) -> NE.List Import.Error
482toImportErrors :: Env -> ResultDict -> [Src.Import] -> NE.List (ModuleName.Raw, Import.Problem) -> NE.List Import.Error
469−toImportErrors (Env _ _ _ _ locals foreigns) results imports problems =
483+toImportErrors (Env _ _ _ _ _ locals foreigns) results imports problems =
471 knownModules =
485 knownModules =
472 Set.unions
486 Set.unions
@@ -600,12 +614,12 @@ addToGraph name status graph =
601 dependencies =
615 dependencies =
602 case status of
616 case status of
603− SCached (Details.Local _ _ deps _) -> deps
617+ SCached (Details.Local _ _ deps _ _ _) -> deps
604− SChanged (Details.Local _ _ deps _) _ _ _ -> deps
618+ SChanged (Details.Local _ _ deps _ _ _) _ _ _ -> deps
605− SBadImport _ -> []
619+ SBadImport _ -> []
606− SBadSyntax _ _ _ _ -> []
620+ SBadSyntax _ _ _ _ -> []
607− SForeign _ -> []
621+ SForeign _ -> []
608− SKernel -> []
622+ SKernel -> []
610 (name, name, dependencies) : graph
624 (name, name, dependencies) : graph
@@ -633,9 +647,9 @@ checkUniqueMains insides smains =
633mainStatusToNamePathPair :: MainStatus -> Maybe (ModuleName.Raw, OneOrMore.OneOrMore FilePath)
647mainStatusToNamePathPair :: MainStatus -> Maybe (ModuleName.Raw, OneOrMore.OneOrMore FilePath)
634mainStatusToNamePathPair smain =
648mainStatusToNamePathPair smain =
635 case smain of
649 case smain of
636− SInside _ -> Nothing
650+ SInside _ -> Nothing
637− SOutsideOk (Details.Local path _ _ _) _ modul -> Just (Src.getName modul, OneOrMore.one path)
651+ SOutsideOk (Details.Local path _ _ _ _ _) _ modul -> Just (Src.getName modul, OneOrMore.one path)
638− SOutsideErr _ -> Nothing
652+ SOutsideErr _ -> Nothing
641checkOutside :: ModuleName.Raw -> OneOrMore.OneOrMore FilePath -> Either Exit.BuildProjectProblem FilePath
655checkOutside :: ModuleName.Raw -> OneOrMore.OneOrMore FilePath -> Either Exit.BuildProjectProblem FilePath
@@ -648,12 +662,12 @@ checkOutside name paths =
648checkInside :: ModuleName.Raw -> FilePath -> Status -> Either Exit.BuildProjectProblem ()
662checkInside :: ModuleName.Raw -> FilePath -> Status -> Either Exit.BuildProjectProblem ()
649checkInside name p1 status =
663checkInside name p1 status =
650 case status of
664 case status of
651− SCached (Details.Local p2 _ _ _) -> Left (Exit.BP_MainNameDuplicate name p1 p2)
665+ SCached (Details.Local p2 _ _ _ _ _) -> Left (Exit.BP_MainNameDuplicate name p1 p2)
652− SChanged (Details.Local p2 _ _ _) _ _ _ -> Left (Exit.BP_MainNameDuplicate name p1 p2)
666+ SChanged (Details.Local p2 _ _ _ _ _) _ _ _ -> Left (Exit.BP_MainNameDuplicate name p1 p2)
653− SBadImport _ -> Right ()
667+ SBadImport _ -> Right ()
654− SBadSyntax _ _ _ _ -> Right ()
668+ SBadSyntax _ _ _ _ -> Right ()
655− SForeign _ -> Right ()
669+ SForeign _ -> Right ()
656− SKernel -> Right ()
670+ SKernel -> Right ()
@@ -661,7 +675,7 @@ checkInside name p1 status =
663compile :: Env -> DocsNeed -> Details.Local -> B.ByteString -> Map.Map ModuleName.Raw I.Interface -> Src.Module -> IO Result
677compile :: Env -> DocsNeed -> Details.Local -> B.ByteString -> Map.Map ModuleName.Raw I.Interface -> Src.Module -> IO Result
664−compile (Env key root pkg _ _ _) docsNeed local@(Details.Local path time _ _) source ifaces modul =
678+compile (Env key root pkg _ buildID _ _) docsNeed (Details.Local path time deps main lastChange _) source ifaces modul =
665 case Compile.compile pkg ifaces modul of
679 case Compile.compile pkg ifaces modul of
666 Right (Compile.Artifacts canonical annotations objects) ->
680 Right (Compile.Artifacts canonical annotations objects) ->
667 do let name = Src.getName modul
681 do let name = Src.getName modul
@@ -674,12 +688,14 @@ compile (Env key root pkg _ _ _) docsNeed local@(Details.Local path time _ _) so
674 Just oldi | oldi == iface ->
688 Just oldi | oldi == iface ->
675 do -- iface should be fully forced by equality check
689 do -- iface should be fully forced by equality check
676 Reporting.report key Reporting.BDone
690 Reporting.report key Reporting.BDone
691+ let local = Details.Local path time deps main lastChange buildID
677 return (RSame local iface objects docs)
692 return (RSame local iface objects docs)
680 do -- iface may be lazy still
695 do -- iface may be lazy still
681 File.writeBinary elmi iface
696 File.writeBinary elmi iface
682 Reporting.report key Reporting.BDone
697 Reporting.report key Reporting.BDone
698+ let local = Details.Local path time deps main buildID buildID
683 return (RNew local iface objects docs)
699 return (RNew local iface objects docs)
685 Left err ->
701 Left err ->
@@ -692,9 +708,9 @@ compile (Env key root pkg _ _ _) docsNeed local@(Details.Local path time _ _) so
694writeDetails :: FilePath -> Details.Details -> Map.Map ModuleName.Raw Result -> IO ()
710writeDetails :: FilePath -> Details.Details -> Map.Map ModuleName.Raw Result -> IO ()
695−writeDetails root (Details.Details time outline locals foreigns extras) results =
711+writeDetails root (Details.Details time outline buildID locals foreigns extras) results =
696 File.writeBinary (Stuff.details root) $
712 File.writeBinary (Stuff.details root) $
697− Details.Details time outline (Map.foldrWithKey addNewLocal locals results) foreigns extras
713+ Details.Details time outline buildID (Map.foldrWithKey addNewLocal locals results) foreigns extras
700addNewLocal :: ModuleName.Raw -> Result -> Map.Map ModuleName.Raw Details.Local -> Map.Map ModuleName.Raw Details.Local
716addNewLocal :: ModuleName.Raw -> Result -> Map.Map ModuleName.Raw Details.Local -> Map.Map ModuleName.Raw Details.Local
@@ -702,7 +718,7 @@ addNewLocal name result locals =
702 case result of
718 case result of
703 RNew local _ _ _ -> Map.insert name local locals
719 RNew local _ _ _ -> Map.insert name local locals
704 RSame local _ _ _ -> Map.insert name local locals
720 RSame local _ _ _ -> Map.insert name local locals
705− RCached _ _ -> locals
721+ RCached _ _ _ -> locals
706 RNotFound _ -> locals
722 RNotFound _ -> locals
707 RProblem _ -> locals
723 RProblem _ -> locals
708 RBlocked -> locals
724 RBlocked -> locals
@@ -731,7 +747,7 @@ addErrors result errors =
731 case result of
747 case result of
732 RNew _ _ _ _ -> errors
748 RNew _ _ _ _ -> errors
733 RSame _ _ _ _ -> errors
749 RSame _ _ _ _ -> errors
734− RCached _ _ -> errors
750+ RCached _ _ _ -> errors
735 RNotFound _ -> errors
751 RNotFound _ -> errors
736 RProblem e -> e:errors
752 RProblem e -> e:errors
737 RBlocked -> errors
753 RBlocked -> errors
@@ -744,7 +760,7 @@ addImportProblems results name problems =
744 case results ! name of
760 case results ! name of
745 RNew _ _ _ _ -> problems
761 RNew _ _ _ _ -> problems
746 RSame _ _ _ _ -> problems
762 RSame _ _ _ _ -> problems
747− RCached _ _ -> problems
763+ RCached _ _ _ -> problems
748 RNotFound p -> (name, p) : problems
764 RNotFound p -> (name, p) : problems
749 RProblem _ -> problems
765 RProblem _ -> problems
750 RBlocked -> problems
766 RBlocked -> problems
@@ -802,7 +818,7 @@ toDocs result =
802 case result of
818 case result of
803 RNew _ _ _ d -> d
819 RNew _ _ _ d -> d
804 RSame _ _ _ d -> d
820 RSame _ _ _ d -> d
805− RCached _ _ -> Nothing
821+ RCached _ _ _ -> Nothing
806 RNotFound _ -> Nothing
822 RNotFound _ -> Nothing
807 RProblem _ -> Nothing
823 RProblem _ -> Nothing
808 RBlocked -> Nothing
824 RBlocked -> Nothing
@@ -831,7 +847,7 @@ data ReplArtifacts =
831fromRepl :: FilePath -> Details.Details -> B.ByteString -> IO (Either Exit.Repl ReplArtifacts)
847fromRepl :: FilePath -> Details.Details -> B.ByteString -> IO (Either Exit.Repl ReplArtifacts)
832fromRepl root details source =
848fromRepl root details source =
834− env@(Env _ _ pkg _ _ _) = makeEnv Reporting.ignorer root details
850+ env@(Env _ _ pkg _ _ _ _) = makeEnv Reporting.ignorer root details
836 case Parse.fromByteString pkg source of
852 case Parse.fromByteString pkg source of
837 Left syntaxError ->
853 Left syntaxError ->
@@ -857,12 +873,12 @@ fromRepl root details source =
857 putMVar rmvar resultMVars
873 putMVar rmvar resultMVars
858 results <- traverse readMVar resultMVars
874 results <- traverse readMVar resultMVars
859 writeDetails root details results
875 writeDetails root details results
860− depsStatus <- checkDeps root resultMVars deps
876+ depsStatus <- checkDeps root resultMVars deps 0
861 finalizeReplArtifacts env source modul depsStatus resultMVars results
877 finalizeReplArtifacts env source modul depsStatus resultMVars results
864finalizeReplArtifacts :: Env -> B.ByteString -> Src.Module -> DepsStatus -> ResultDict -> Map.Map ModuleName.Raw Result -> IO (Either Exit.Repl ReplArtifacts)
880finalizeReplArtifacts :: Env -> B.ByteString -> Src.Module -> DepsStatus -> ResultDict -> Map.Map ModuleName.Raw Result -> IO (Either Exit.Repl ReplArtifacts)
865−finalizeReplArtifacts env@(Env _ root pkg _ _ _) source modul@(Src.Module _ _ _ imports _ _ _ _ _) depsStatus resultMVars results =
881+finalizeReplArtifacts env@(Env _ root pkg _ _ _ _) source modul@(Src.Module _ _ _ imports _ _ _ _ _) depsStatus resultMVars results =
867 compileInput ifaces =
883 compileInput ifaces =
868 case Compile.compile pkg ifaces modul of
884 case Compile.compile pkg ifaces modul of
@@ -958,7 +974,7 @@ findLocation env path =
960findLoc :: Env -> FilePath -> FilePath -> IO (Either Exit.BuildProjectProblem Location)
976findLoc :: Env -> FilePath -> FilePath -> IO (Either Exit.BuildProjectProblem Location)
961−findLoc (Env _ root _ srcDirs _ _) path absolutePath =
977+findLoc (Env _ root _ srcDirs _ _ _) path absolutePath =
963 (dirs, file) = FP.splitFileName absolutePath
979 (dirs, file) = FP.splitFileName absolutePath
964 (final, ext) = FP.splitExtension file
980 (final, ext) = FP.splitExtension file
@@ -1054,7 +1070,7 @@ data MainStatus
1056crawlMain :: Env -> MVar StatusDict -> MainLocation -> IO MainStatus
1072crawlMain :: Env -> MVar StatusDict -> MainLocation -> IO MainStatus
1057−crawlMain env@(Env _ _ pkg _ _ _) mvar given =
1073+crawlMain env@(Env _ _ pkg _ buildID _ _) mvar given =
1058 case given of
1074 case given of
1059 LInside name ->
1075 LInside name ->
1060 do statusMVar <- newEmptyMVar
1076 do statusMVar <- newEmptyMVar
@@ -1069,7 +1085,7 @@ crawlMain env@(Env _ _ pkg _ _ _) mvar given =
1069 case Parse.fromByteString pkg source of
1085 case Parse.fromByteString pkg source of
1070 Right modul@(Src.Module _ _ _ imports values _ _ _ _) ->
1086 Right modul@(Src.Module _ _ _ imports values _ _ _ _) ->
1071 do let deps = map Src.getImportName imports
1087 do let deps = map Src.getImportName imports
1072− let local = Details.Local path time deps (any isMain values)
1088+ let local = Details.Local path time deps (any isMain values) buildID buildID
1073 crawlDeps env mvar deps (SOutsideOk local source modul)
1089 crawlDeps env mvar deps (SOutsideOk local source modul)
1075 Left syntaxError ->
1091 Left syntaxError ->
@@ -1089,7 +1105,7 @@ data MainResult
1091checkMain :: Env -> ResultDict -> MainStatus -> IO MainResult
1107checkMain :: Env -> ResultDict -> MainStatus -> IO MainResult
1092−checkMain env@(Env _ root _ _ _ _) results pendingMain =
1108+checkMain env@(Env _ root _ _ _ _ _) results pendingMain =
1093 case pendingMain of
1109 case pendingMain of
1094 SInside name ->
1110 SInside name ->
1095 return (RInside name)
1111 return (RInside name)
@@ -1097,8 +1113,8 @@ checkMain env@(Env _ root _ _ _ _) results pendingMain =
1097 SOutsideErr err ->
1113 SOutsideErr err ->
1098 return (ROutsideErr err)
1114 return (ROutsideErr err)
1100− SOutsideOk local@(Details.Local path time deps _) source modul@(Src.Module _ _ _ imports _ _ _ _ _) ->
1116+ SOutsideOk local@(Details.Local path time deps _ _ lastCompile) source modul@(Src.Module _ _ _ imports _ _ _ _ _) ->
1101− do depsStatus <- checkDeps root results deps
1117+ do depsStatus <- checkDeps root results deps lastCompile
1102 case depsStatus of
1118 case depsStatus of
1103 DepsChange ifaces ->
1119 DepsChange ifaces ->
1104 compileOutside env local source ifaces modul
1120 compileOutside env local source ifaces modul
@@ -1118,7 +1134,7 @@ checkMain env@(Env _ root _ _ _ _) results pendingMain =
1120compileOutside :: Env -> Details.Local -> B.ByteString -> Map.Map ModuleName.Raw I.Interface -> Src.Module -> IO MainResult
1136compileOutside :: Env -> Details.Local -> B.ByteString -> Map.Map ModuleName.Raw I.Interface -> Src.Module -> IO MainResult
1121−compileOutside (Env key _ pkg _ _ _) (Details.Local path time _ _) source ifaces modul =
1137+compileOutside (Env key _ pkg _ _ _ _) (Details.Local path time _ _ _ _) source ifaces modul =
1123 name = Src.getName modul
1139 name = Src.getName modul
@@ -1141,7 +1157,7 @@ data Main
1143toArtifacts :: Env -> Dependencies -> Map.Map ModuleName.Raw Result -> NE.List MainResult -> Either Exit.BuildProblem Artifacts
1159toArtifacts :: Env -> Dependencies -> Map.Map ModuleName.Raw Result -> NE.List MainResult -> Either Exit.BuildProblem Artifacts
1144−toArtifacts (Env _ _ pkg _ _ _) foreigns results mainResults =
1160+toArtifacts (Env _ _ pkg _ _ _ _) foreigns results mainResults =
1145 case gatherProblemsOrMains results mainResults of
1161 case gatherProblemsOrMains results mainResults of
1146 Left (NE.List e es) ->
1162 Left (NE.List e es) ->
1147 Left (Exit.BuildBadModules e es)
1163 Left (Exit.BuildBadModules e es)
@@ -1178,7 +1194,7 @@ addInside name result modules =
1178 case result of
1194 case result of
1179 RNew _ iface objs _ -> Fresh name iface objs : modules
1195 RNew _ iface objs _ -> Fresh name iface objs : modules
1180 RSame _ iface objs _ -> Fresh name iface objs : modules
1196 RSame _ iface objs _ -> Fresh name iface objs : modules
1181− RCached main mvar -> Cached name main mvar : modules
1197+ RCached main _ mvar -> Cached name main mvar : modules
1182 RNotFound _ -> error (badInside name)
1198 RNotFound _ -> error (badInside name)
1183 RProblem _ -> error (badInside name)
1199 RProblem _ -> error (badInside name)
1184 RBlocked -> error (badInside name)
1200 RBlocked -> error (badInside name)