/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 Ġthe Ġoriginal Ġauthor Ġor Ġauthors . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġorg . gradle . instant execution Ċ Ċ import Ġorg . gradle . api . Project Ċ import Ġorg . gradle . api . internal . project . Project State Registry Ċ import Ġorg . gradle . api . invocation . Gradle Ċ import Ġorg . gradle . api . logging . LogLevel Ċ import Ġorg . gradle . api . logging . Logging Ċ import Ġorg . gradle . api . provider . Provider Ċ import Ġorg . gradle . execution . plan . Node Ċ import Ġorg . gradle . initialization . Gradle Properties Controller Ċ import Ġorg . gradle . initialization . Instant Execution Ċ import Ġorg . gradle . instant execution . coroutines . run To Completion Ċ import Ġorg . gradle . instant execution . extensions . unsafe Lazy Ċ import Ġorg . gradle . instant execution . fingerprint . Instant Execution Cache Fingerprint Controller Ċ import Ġorg . gradle . instant execution . fingerprint . Invalid ation Reason Ċ import Ġorg . gradle . instant execution . initialization . Instant Execution Start Parameter Ċ import Ġorg . gradle . instant execution . problems . Instant Execution Problems Ċ import Ġorg . gradle . instant execution . serialization . Default Read Context Ċ import Ġorg . gradle . instant execution . serialization . Default Write Context Ċ import Ġorg . gradle . instant execution . serialization . Is olate Owner Ċ import Ġorg . gradle . instant execution . serialization . Mutable Is olate Context Ċ import Ġorg . gradle . instant execution . serialization . beans . Bean Construct ors Ċ import Ġorg . gradle . instant execution . serialization . code cs . Code cs Ċ import Ġorg . gradle . instant execution . serialization . code cs . Work Node Codec Ċ import Ġorg . gradle . instant execution . serialization . log NotImplemented Ċ import Ġorg . gradle . instant execution . serialization . read Collection Ċ import Ġorg . gradle . instant execution . serialization . readFile Ċ import Ġorg . gradle . instant execution . serialization . read NonNull Ċ import Ġorg . gradle . instant execution . serialization . run Write Operation Ċ import Ġorg . gradle . instant execution . serialization . with Is olate Ċ import Ġorg . gradle . instant execution . serialization . write Collection Ċ import Ġorg . gradle . instant execution . serialization . writeFile Ċ import Ġorg . gradle . internal . Factory Ċ import Ġorg . gradle . internal . build . event . Build EventListener Registry Internal Ċ import Ġorg . gradle . internal . operations . Build Operation Executor Ċ import Ġorg . gradle . internal . serialize . Decoder Ċ import Ġorg . gradle . internal . serialize . Encoder Ċ import Ġorg . gradle . internal . serialize . k ry o . K ry o Back ed Decoder Ċ import Ġorg . gradle . internal . serialize . k ry o . K ry o Back ed Encoder Ċ import Ġorg . gradle . kotlin . dsl . support . use To Run Ċ import Ġorg . gradle . tool ing . events . Operation Completion Listener Ċ import Ġorg . gradle . util . Gradle Version Ċ import Ġjava . io . File Ċ import Ġjava . io . OutputStream Ċ import Ġjava . nio . file . Files Ċ import Ġjava . util . ArrayList ĊĊ Ċ class ĠDefault Instant Execution Ġinternal Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġhost : ĠHost , ĊĠĠĠ Ġprivate Ġval Ġstart Parameter : ĠInstant Execution Start Parameter , ĊĠĠĠ Ġprivate Ġval Ġproblems : ĠInstant Execution Problems , ĊĠĠĠ Ġprivate Ġval Ġscope Registry Listener : ĠInstant Execution ClassLoader Scope Registry Listener , ĊĠĠĠ Ġprivate Ġval Ġcache Fingerprint Controller : ĠInstant Execution Cache Fingerprint Controller , ĊĠĠĠ Ġprivate Ġval Ġbean Construct ors : ĠBean Construct ors , ĊĠĠĠ Ġprivate Ġval Ġgradle Properties Controller : ĠGradle Properties Controller Ċ ) Ġ: ĠInstant Execution Ġ{ ĊĊĠĠĠ Ġinterface ĠHost Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġcurrent Build : ĠV int age Gradle Build ĊĊĠĠĠĠĠĠĠ Ġfun Ġcreate Build ( root ProjectName : ĠString ): ĠInstant Execution Build ĊĊĠĠĠĠĠĠĠ Ġfun Ġ< T > Ġservice ( service Type : ĠClass < T >): ĠT ĊĊĠĠĠĠĠĠĠ Ġfun Ġ< T > Ġfactory ( service Type : ĠClass < T >): ĠFactory < T > ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcan Execute Instant aneous ly (): ĠBoolean Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġ! is Instant Execution Enabled Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġstart Parameter . re create Cache Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog (" Re creating Ġinstant Ġexecution Ġcache ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġstart Parameter . is Refresh Dependencies Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Calcul ating Ġtask Ġgraph Ġas Ġinstant Ġexecution Ġcache Ġcannot Ġbe Ġreused Ġdue Ġto Ġ{}", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"-- refresh - dependencies " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ! instant Execution Fingerprint File . isFile Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Calcul ating Ġtask Ġgraph Ġas Ġno Ġinstant Ġexecution Ġcache Ġis Ġavailable Ġfor Ġtasks : Ġ{}", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Parameter . requested Task Names . join ToString (" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfingerprint Changed Reason Ġ= Ġcheck Fingerprint () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfingerprint Changed Reason Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Calcul ating Ġtask Ġgraph Ġas Ġinstant Ġexecution Ġcache Ġcannot Ġbe Ġreused Ġbecause Ġ{} .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfingerprint Changed Reason ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Re using Ġinstant Ġexecution Ġcache . ĠThis Ġis Ġnot Ġguaranteed Ġto Ġwork Ġin Ġany Ġway ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprepare For Build Logic Execution () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! is Instant Execution Enabled ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġstart Collect ing Cache Fingerprint () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsave Scheduled Work () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! is Instant Execution Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNo Ġneed Ġto Ġhold Ġonto Ġthe Ġ` ClassLoader Scope ` Ġtree ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġwe Ġare Ġnot Ġwriting Ġit . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope Registry Listener . dispose () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġstop Collect ing Cache Fingerprint () ĊĊĠĠĠĠĠĠĠ Ġbuild Operation Executor . with Store Operation Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstant Execution State File . create Parent Directories () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice < Project State Registry >(). with Len ient State Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Write Context For ( instant Execution State File ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġencode Scheduled Work () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Instant Execution Cache Fingerprint () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( error : ĠInstant Execution Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn validate Ġun usable Ġstate Ġon Ġerrors ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate Instant Execution State () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproblems . request Console Summary () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( start Parameter . fail On Problems ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn validate Ġstate Ġon Ġproblems Ġthat Ġfail Ġthe Ġbuild ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproblems . run If Problems Ġ{ Ġinvalidate Instant Execution State () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġload Scheduled Work () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġrequire ( is Instant Execution Enabled ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠNo Ġneed Ġto Ġrecord Ġthe Ġ` ClassLoader Scope ` Ġtree ĊĠĠĠĠĠĠĠ Ġ// Ġwhen Ġloading Ġthe Ġtask Ġgraph . ĊĠĠĠĠĠĠĠ Ġscope Registry Listener . dispose () ĊĊĠĠĠĠĠĠĠ Ġbuild Operation Executor . with Load Operation Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Read Context For ( instant Execution State File ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecode Scheduled Work () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġsuspend Ġfun ĠDefault Write Context . encode Scheduled Work () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuild Ġ= Ġhost . current Build ĊĠĠĠĠĠĠĠ Ġwrite String ( build . root Project . name ) ĊĊĠĠĠĠĠĠĠ Ġwrite Gradle State ( build . gradle ) ĊĊĠĠĠĠĠĠĠ Ġval Ġscheduled Nodes Ġ= Ġbuild . scheduled Work ĊĠĠĠĠĠĠĠ Ġwrite Re levant Projects For ( scheduled Nodes ) ĊĊĠĠĠĠĠĠĠ ĠWork Node Codec ( build . gradle , Ġcodecs . internal Types Codec ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Work ( scheduled Nodes ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġsuspend Ġfun ĠDefault Read Context . decode Scheduled Work () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġroot ProjectName Ġ= Ġread String () ĊĠĠĠĠĠĠĠ Ġval Ġbuild Ġ= Ġhost . create Build ( root ProjectName ) ĊĊĠĠĠĠĠĠĠ Ġread Gradle State ( build . gradle ) ĊĊĠĠĠĠĠĠĠ Ġread Re levant Projects ( build ) ĊĊĠĠĠĠĠĠĠ Ġbuild . register Projects () ĊĊĠĠĠĠĠĠĠ Ġinit Project Provider ( build :: getProject ) ĊĊĠĠĠĠĠĠĠ Ġval Ġscheduled Nodes Ġ= ĠWork Node Codec ( build . gradle , Ġcodecs . internal Types Codec ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġread Work () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbuild . schedule Nodes ( scheduled Nodes ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun Ġstart Collect ing Cache Fingerprint () Ġ{ ĊĠĠĠĠĠĠĠ Ġcache Fingerprint Controller . start Collect ing Fingerprint Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache Fingerprint Writer Context For ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun Ġstop Collect ing Cache Fingerprint () Ġ{ ĊĠĠĠĠĠĠĠ Ġcache Fingerprint Controller . stop Collect ing Fingerprint () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun Ġwrite Instant Execution Cache Fingerprint () Ġ{ ĊĠĠĠĠĠĠĠ Ġcache Fingerprint Controller . commit Fingerprint To ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstant Execution Fingerprint File ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun Ġcache Fingerprint Writer Context For ( output Stream : ĠOutputStream ) Ġ= ĊĠĠĠĠĠĠĠ Ġwriter Context For ( output Stream ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpush ( Is olate Owner . Owner Host ( host ), Ġcodecs . user Types Codec ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun Ġcheck Fingerprint (): ĠIn validation Reason ? Ġ{ ĊĠĠĠĠĠĠĠ Ġload Gradle Properties () ĊĠĠĠĠĠĠĠ Ġreturn Ġcheck Instant Execution Fingerprint File () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun Ġcheck Instant Execution Fingerprint File (): ĠIn validation Reason ? Ġ= ĊĠĠĠĠĠĠĠ Ġwith Read Context For ( instant Execution Fingerprint File ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Host Is olate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache Fingerprint Controller . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Fingerprint () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun Ġload Gradle Properties () Ġ{ ĊĠĠĠĠĠĠĠ Ġgradle Properties Controller . load Gradle Properties From ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Parameter . settings Directory ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun Ġinvalidate Instant Execution State () Ġ{ ĊĠĠĠĠĠĠĠ Ġinstant Execution Fingerprint File . delete () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun Ġwith Write Context For ( file : ĠFile , Ġwrite Operation : Ġsuspend ĠDefault Write Context . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwriter Context For ( file . output Stream ()). use To Run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Write Operation ( write Operation ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun Ġwriter Context For ( output Stream : ĠOutputStream ) Ġ= ĊĠĠĠĠĠĠĠ Ġwrite Context For ( K ry o Back ed Encoder ( output Stream )) ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun Ġ< R > Ġwith Read Context For ( file : ĠFile , Ġread Operation : Ġsuspend ĠDefault Read Context . () Ġ-> ĠR ): ĠR Ġ= ĊĠĠĠĠĠĠĠ ĠK ry o Back ed Decoder ( file . inputStream ()). use Ġ{ Ġdecoder Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġread Context For ( decoder ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit ClassLoader ( java Class . class Loader ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun To Completion Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Operation () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun Ġwrite Context For ( ĊĠĠĠĠĠĠĠ Ġencoder : ĠEncoder ĊĠĠĠ Ġ) Ġ= ĠDefault Write Context ( ĊĠĠĠĠĠĠĠ Ġcodecs . user Types Codec , ĊĠĠĠĠĠĠĠ Ġencoder , ĊĠĠĠĠĠĠĠ Ġscope Registry Listener , ĊĠĠĠĠĠĠĠ Ġlogger , ĊĠĠĠĠĠĠĠ Ġproblems :: on Problem ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun Ġread Context For ( decoder : ĠK ry o Back ed Decoder ) Ġ= ĠDefault Read Context ( ĊĠĠĠĠĠĠĠ Ġcodecs . user Types Codec , ĊĠĠĠĠĠĠĠ Ġdecoder , ĊĠĠĠĠĠĠĠ Ġservice (), ĊĠĠĠĠĠĠĠ Ġbean Construct ors , ĊĠĠĠĠĠĠĠ Ġlogger , ĊĠĠĠĠĠĠĠ Ġproblems :: on Problem ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġval Ġcodecs : ĠCode cs Ġby Ġunsafe Lazy Ġ{ ĊĠĠĠĠĠĠĠ ĠCode cs ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirectory File Tree Factory Ġ= Ġservice (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Collection Factory Ġ= Ġservice (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Lookup Ġ= Ġservice (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Factory Ġ= Ġservice (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Property Factory Ġ= Ġservice (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Resolver Ġ= Ġservice (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstanti ator Ġ= Ġservice (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener Manager Ġ= Ġservice (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject State Registry Ġ= Ġservice (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask Node Factory Ġ= Ġservice (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinger printer Registry Ġ= Ġservice (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Finder Ġ= Ġservice (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Operation Executor Ġ= Ġservice (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Loader Hierarchy Hash er Ġ= Ġservice (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ol atable Factory Ġ= Ġservice (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Snapshot ter Ġ= Ġservice (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Service Registry Ġ= Ġservice (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmanaged Factory Registry Ġ= Ġservice (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Scheme Ġ= Ġservice (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Scheme Ġ= Ġservice (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattributes Factory Ġ= Ġservice (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransform Listener Ġ= Ġservice (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Source Provider Factory Ġ= Ġservice (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpattern Set Factory Ġ= Ġfactory (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Operations Ġ= Ġservice (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile System Ġ= Ġservice (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Factory Ġ= Ġservice () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġsuspend Ġfun ĠDefault Write Context . write Gradle State ( gradle : ĠGradle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Gradle Is olate ( gradle ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( gradle . included Build s . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog NotImplemented (" included Ġbuilds ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Listener Registry Ġ= Ġservice < Build EventListener Registry Internal >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Collection ( event Listener Registry . subscriptions ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġsuspend Ġfun ĠDefault Read Context . read Gradle State ( gradle : ĠGradle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Gradle Is olate ( gradle ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Listener Registry Ġ= Ġservice < Build EventListener Registry Internal >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġread Collection Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprovider Ġ= Ġread NonNull < Provider < Operation Completion Listener >>() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Listener Registry . subscribe ( provider ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġinline Ġfun Ġ< T Ġ: ĠMutable Is olate Context , ĠR > ĠT . with Gradle Is olate ( gradle : ĠGradle , Ġblock : ĠT . () Ġ-> ĠR ): ĠR Ġ= ĊĠĠĠĠĠĠĠ Ġwith Is olate ( Is olate Owner . Owner Gradle ( gradle ), Ġcodecs . user Types Codec ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġinline Ġfun Ġ< T Ġ: ĠMutable Is olate Context , ĠR > ĠT . with Host Is olate ( block : ĠT . () Ġ-> ĠR ): ĠR Ġ= ĊĠĠĠĠĠĠĠ Ġwith Is olate ( Is olate Owner . Owner Host ( host ), Ġcodecs . user Types Codec ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun ĠEncoder . write Re levant Projects For ( nodes : ĠList < Node >) Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite Collection ( fill The G aps Of ( relevant Project Paths For ( nodes ))) Ġ{ Ġproject Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite String ( project . path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite File ( project . project Dir ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun ĠDecoder . read Re levant Projects ( build : ĠInstant Execution Build ) Ġ{ ĊĠĠĠĠĠĠĠ Ġread Collection Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproject Path Ġ= Ġread String () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproject Dir Ġ= ĠreadFile () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild . create Project ( project Path , Ġproject Dir ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun Ġrelevant Project Paths For ( nodes : ĠList < Node >): ĠList < Project > Ġ= ĊĠĠĠĠĠĠĠ Ġnodes . map NotNull To ( mutable ListOf ()) Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . own ing Project ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . take If Ġ{ Ġit . parent Ġ!= Ġnull Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun Ġlog ( message : ĠString , Ġvar arg Ġargs : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . log ( instant Execution LogLevel , Ġmessage , Ġ* args ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġval Ġbuild Operation Executor : ĠBuild Operation Executor ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġservice () ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT > Ġservice () Ġ= ĊĠĠĠĠĠĠĠ Ġhost . service < T >() ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT > Ġfactory () Ġ= ĊĠĠĠĠĠĠĠ Ġhost . factory ( T :: class . java ) ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun ĠFile . create Parent Directories () Ġ{ ĊĠĠĠĠĠĠĠ ĠFiles . create Directories ( parent File . to Path ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġval Ġinstant Execution Fingerprint File Ġby Ġunsafe Lazy Ġ{ ĊĠĠĠĠĠĠĠ Ġinstant Execution State File . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Sibling ("$ name . fingerprint ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġval Ġinstant Execution State File Ġby Ġunsafe Lazy Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcache Dir Ġ= Ġabsolute File (". instant - execution - state /${ current Gradle Version () }") ĊĠĠĠĠĠĠĠ Ġval Ġbase Name Ġ= Ġstart Parameter . instant Execution CacheKey ĊĠĠĠĠĠĠĠ Ġval Ġcache FileName Ġ= Ġ"$ base Name . bin " ĊĠĠĠĠĠĠĠ ĠFile ( cacheDir , Ġcache FileName ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun Ġcurrent Gradle Version (): ĠString Ġ= ĊĠĠĠĠĠĠĠ ĠGradle Version . current (). version ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun Ġabsolute File ( path : ĠString ) Ġ= ĊĠĠĠĠĠĠĠ ĠFile ( root Directory , Ġpath ). absolute File ĊĊĠĠĠ Ġ// ĠSkip Ġinstant Ġexecution Ġfor Ġbuild Src Ġfor Ġnow . ĠShould Ġinstead Ġcollect Ġup Ġthe Ġinputs Ġof Ġits Ġtasks Ġand Ġtreat Ġas Ġtask Ġgraph Ġcache Ġinputs ĊĠĠĠ Ġprivate ĊĠĠĠ Ġval Ġis Instant Execution Enabled : ĠBoolean Ġby Ġunsafe Lazy Ġ{ ĊĠĠĠĠĠĠĠ Ġstart Parameter . isEnabled Ġ&& Ġ! host . current Build . build Src ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġval Ġinstant Execution LogLevel : ĠLogLevel ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġwhen Ġ( start Parameter . is Quiet ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> ĠLogLevel . INFO ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠLogLevel . LI FE CYCLE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġval Ġroot Directory ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġstart Parameter . root Directory Ċ } ĊĊ Ċ inline Ġfun Ġ< re ified ĠT > ĠDefault Instant Execution . Host . service (): ĠT Ġ= ĊĠĠĠ Ġservice ( T :: class . java ) ĊĊ Ċ internal Ċ fun Ġfill The G aps Of ( projects : ĠCollection < Project >): ĠList < Project > Ġ{ ĊĠĠĠ Ġval Ġprojects Without G aps Ġ= ĠArrayList < Project >( projects . size ) ĊĠĠĠ Ġvar Ġindex Ġ= Ġ 0 ĊĠĠĠ Ġprojects . forEach Ġ{ Ġproject Ġ-> ĊĠĠĠĠĠĠĠ Ġvar Ġparent Ġ= Ġproject . parent ĊĠĠĠĠĠĠĠ Ġvar Ġadded Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( parent Ġ!== Ġnull Ġ&& Ġparent Ġ! in Ġprojects Without G aps ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprojects Without G aps . add ( index , Ġparent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadded Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Ġ= Ġparent . parent ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprojects Without G aps . add ( project ) ĊĠĠĠĠĠĠĠ Ġadded Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠ Ġindex Ġ+= Ġadded ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġprojects Without G aps Ċ } ĊĊ Ċ private Ċ val Ġlogger Ġ= ĠLogging . getLogger ( Default Instant Execution :: class . java ) Ċ