/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 8 ĠJetBrains Ġs . r . o . Ġand ĠKotlin ĠProgramming ĠLanguage Ġcontributors . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe Ġlicense / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . j ps . targets Ċ Ċ import Ġorg . jetbrains . j ps . Module Chunk Ċ import Ġorg . jetbrains . j ps . builders . storage . Build Data Paths Ċ import Ġorg . jetbrains . j ps . incremental . Compile Context Ċ import Ġorg . jetbrains . j ps . incremental . Module Build Target Ċ import Ġorg . jetbrains . j ps . incremental . Module Level Builder Ċ import Ġorg . jetbrains . j ps . incremental . Project Build Exception Ċ import Ġorg . jetbrains . j ps . model . java . J ps Java Classpath Kind Ċ import Ġorg . jetbrains . j ps . model . java . J ps Java Extension Service Ċ import Ġorg . jetbrains . j ps . model . module . J ps Module Ċ import Ġorg . jetbrains . j ps . util . J ps Path Util Ċ import Ġorg . jetbrains . kotlin . build . Build Meta Info Ċ import Ġorg . jetbrains . kotlin . build . Build Meta Info Factory Ċ import Ġorg . jetbrains . kotlin . build . Generated File Ċ import Ġorg . jetbrains . kotlin . cli . common . arguments . Common Compiler Arguments Ċ import Ġorg . jetbrains . kotlin . cli . common . messages . Compiler Message Severity Ċ import Ġorg . jetbrains . kotlin . compiler Runner . J ps Compiler Environment Ċ import Ġorg . jetbrains . kotlin . config . ApiVersion Ċ import Ġorg . jetbrains . kotlin . config . Language Version Ċ import Ġorg . jetbrains . kotlin . config . Services Ċ import Ġorg . jetbrains . kotlin . incremental . Changes Collector Ċ import Ġorg . jetbrains . kotlin . incremental . Expect Actual Tracker Impl Ċ import Ġorg . jetbrains . kotlin . incremental . components . Expect Actual Tracker Ċ import Ġorg . jetbrains . kotlin . incremental . components . Lookup Tracker Ċ import Ġorg . jetbrains . kotlin . j ps . build .* Ċ import Ġorg . jetbrains . kotlin . j ps . incremental . Cache Attributes Diff Ċ import Ġorg . jetbrains . kotlin . j ps . incremental . J ps Incremental Cache Ċ import Ġorg . jetbrains . kotlin . j ps . incremental . load Diff Ċ import Ġorg . jetbrains . kotlin . j ps . incremental . local Cache Version Manager Ċ import Ġorg . jetbrains . kotlin . j ps . model . production Output FilePath Ċ import Ġorg . jetbrains . kotlin . j ps . model . test Output FilePath Ċ import Ġorg . jetbrains . kotlin . modules . Target Id Ċ import Ġorg . jetbrains . kotlin . progress . Compilation Canceled Exception Ċ import Ġorg . jetbrains . kotlin . progress . Compilation Canceled Status Ċ import Ġorg . jetbrains . kotlin . utils . add If NotNull Ċ import Ġjava . io . File Ċ Ċ /** Ċ Ġ* ĠProperties Ġand Ġactions Ġfor ĠKotlin Ġtest Ġ/ Ġproduction Ġmodule Ġbuild Ġtarget . Ċ Ġ*/ Ċ abstract Ġclass ĠKotlin Module Build Target < Build Meta Info Type Ġ: ĠBuild Meta Info > Ġinternal Ġconstructor ( ĊĠĠĠ Ġval Ġkotlin Context : ĠKotlin Compile Context , ĊĠĠĠ Ġval Ġj ps Module Build Target : ĠModule Build Target Ċ ) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNote : Ġbew are Ġof Ġusing Ġthis Ġcontext Ġfor Ġgetting Ġcompilation Ġround Ġdependent Ġdata : ĊĠĠĠĠ Ġ* Ġfor Ġexample Ġgro ovy Ġcan Ġprovide Ġtemp Ġsource Ġroots Ġwith Ġstub s , Ġand Ġit Ġwill Ġbe Ġvisible ĊĠĠĠĠ Ġ* Ġonly Ġin Ġround Ġlocal Ġcompile Ġcontext . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠTODO ( 1 . 2 . 8 0 ): Ġgot Ġrid Ġof Ġj ps Global Context Ġand Ġreplace Ġit Ġwith Ġkotlin Context ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġj ps Global Context : ĠCompile Context ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġkotlin Context . j ps Context ĊĊĠĠĠ Ġ// ĠInitialized Ġin ĠKotlin Compile Context . load Targets ĊĠĠĠ Ġlateinit Ġvar Ġchunk : ĠKotlin Chunk ĊĊĠĠĠ Ġabstract Ġval Ġglobal Lookup Cache Id : ĠString ĊĊĠĠĠ Ġabstract Ġval Ġis Incremental Compilation Enabled : ĠBoolean ĊĊĠĠĠ Ġopen Ġfun Ġis Enabled ( chunk Compiler Arguments : ĠCommon Compiler Arguments ): ĠBoolean Ġ= Ġtrue ĊĊĠĠĠ Ġ@ Suppress (" Le aking This ") ĊĠĠĠ Ġval Ġlocal Cache Version Manager Ġ= Ġlocal Cache Version Manager ( ĊĠĠĠĠĠĠĠ Ġkotlin Context . data Paths . getTarget Data Root ( j ps Module Build Target ), ĊĠĠĠĠĠĠĠ Ġis Incremental Compilation Enabled ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġinitial Local Cache Attributes Diff : ĠCache Attributes Diff < *> Ġ= Ġlocal Cache Version Manager . load Diff () ĊĊĠĠĠ Ġval Ġmodule : ĠJ ps Module ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġj ps Module Build Target . module ĊĊĠĠĠ Ġval Ġis Tests : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġj ps Module Build Target . is Tests ĊĊĠĠĠ Ġopen Ġval Ġtarget Id : ĠTarget Id ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSince ĠIDEA Ġ 2 0 1 6 Ġeach Ġgradle Ġsource Ġroot Ġis Ġimported Ġas Ġa Ġseparate Ġmodule . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOne Ġgradle Ġmodule ĠX Ġis Ġimported Ġas Ġtwo ĠJ PS Ġmodules : ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 1 . ĠX - production Ġwith Ġone Ġproduction Ġtarget ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 2 . ĠX - test Ġwith Ġone Ġtest Ġtarget . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġbreaks Ġkotlin Ġcode Ġsince Ġinternal Ġmembers ' Ġnames Ġare Ġm angled Ġusing Ġmodule Ġname . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFor Ġexample , Ġa Ġdeclaration Ġof Ġa Ġfunction Ġ' f ' Ġin Ġ' X - production ' Ġbecomes Ġ' f X Production ', Ġbut Ġa Ġcall Ġ' f ' Ġin Ġ' X - test ' Ġbecomes Ġ' f X Test () '. ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġworkaround Ġis Ġto Ġreplace Ġa Ġname Ġof Ġsuch Ġtest Ġtarget Ġwith Ġthe Ġname Ġof Ġcorresponding Ġproduction Ġmodule . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSee ĠK T - 1 1 9 9 3 . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġrelated Production Module ?. name Ġ?: Ġj ps Module Build Target . id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTarget Id ( name , Ġj ps Module Build Target . target Type . type Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġoutput Dir Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexplicit Output Path Ġ= Ġif Ġ( is Tests ) Ġmodule . test Output FilePath Ġelse Ġmodule . production Output FilePath ĊĠĠĠĠĠĠĠ Ġval Ġexplicit Output Dir Ġ= Ġexplicit Output Path ?. let Ġ{ ĠFile ( it ). absolute File . parent File Ġ} ĊĠĠĠĠĠĠĠ Ġreturn @ lazy Ġexplicit Output Dir ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġj ps Module Build Target . output Dir ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠProject Build Exception (" No Ġoutput Ġdirectory Ġfound Ġfor Ġ" Ġ+ Ġthis ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġfriend Build Targets : ĠList < Kotlin Module Build Target <* >> ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable ListOf < Kotlin Module Build Target <* >>() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Tests ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add If NotNull ( kotlin Context . targets Binding [ module . production Build Target ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add If NotNull ( kotlin Context . targets Binding [ related Production Module ?. production Build Target ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult . filter Ġ{ Ġit . sources . isNotEmpty () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġfriend Output Dirs : ĠList < File > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġfriend Build Targets . map NotNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJ ps Java Extension Service . getInstance (). getOutput Directory ( it . module , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġrelated Production Module : ĠJ ps Module ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠJ ps Java Extension Service . getInstance (). getTest Module Properties ( module )?. production Module ĊĊĠĠĠ Ġdata Ġclass ĠDependency ( ĊĠĠĠĠĠĠĠ Ġval Ġsrc : ĠKotlin Module Build Target <* >, ĊĠĠĠĠĠĠĠ Ġval Ġtarget : ĠKotlin Module Build Target <* >, ĊĠĠĠĠĠĠĠ Ġval Ġexported : ĠBoolean ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// ĠTODO ( 1 . 2 . 8 0 ): Ġtry Ġreplace Ġall Dependencies Ġwith ĠKotlin Chunk . collect Dependent Chunks Re cursively Exported Only ĊĠĠĠ Ġ@ Deprecated (" Consider Ġusing Ġpre calculated ĠKotlin Chunk . collect Dependent Chunks Re cursively Exported Only ") ĊĠĠĠ Ġval Ġall Dependencies Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠJ ps Java Extension Service . dependencies ( module ). re cursively (). exported Only () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. included In ( J ps Java Classpath Kind . compile ( is Tests )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAll Ġsources Ġof Ġthis Ġtarget Ġ( including Ġnon Ġdirty ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠLazy Ġinitialization Ġis Ġrequired Ġsince Ġvalue Ġis Ġrequired Ġonly Ġin Ġrare Ġcases . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠBefore Ġfirst Ġround Ġinitialized Ġl az ily Ġbased Ġon Ġglobal Ġcontext . ĊĠĠĠĠ Ġ* ĠThis Ġis Ġrequired Ġfor Ġfriend Ġbuild Ġtargets , Ġwhen Ġfriends Ġare Ġnot Ġcompiled Ġin Ġthis Ġbuild Ġrun . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠLazy Ġvalue Ġwill Ġbe Ġinvalid ated Ġon Ġeach Ġround Ġ( should Ġbe Ġre calculated Ġbased Ġon Ġround Ġlocal Ġcontext ). ĊĠĠĠĠ Ġ* ĠUpdate Ġrequired Ġsince Ġsource Ġroots Ġcan Ġbe Ġchanged , Ġfor Ġexample Ġgro ovy Ġcan Ġprovide Ġnew Ġtemporary Ġsource Ġroots Ġwith Ġstub s . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠU gly Ġdeleg ation Ġto Ġlazy Ġis Ġused Ġto Ġcapture Ġlocal Ġcompile Ġcontext Ġand Ġreset Ġcalculated Ġvalue . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġsources : ĠMap < File , ĠSource > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ sources . value ĊĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġvar Ġ_ sources : ĠLazy < Map < File , ĠSource >> Ġ= Ġlazy Ġ{ Ġcompute Sources List ( j ps Global Context ) Ġ} ĊĊĠĠĠ Ġfun Ġnext Round ( local Context : ĠCompile Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ sources Ġ= Ġlazy Ġ{ Ġcompute Sources List ( local Context ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcompute Sources List ( local Context : ĠCompile Context ): ĠMap < File , ĠSource > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable Map Of < File , ĠSource >() ĊĠĠĠĠĠĠĠ Ġval Ġmodule Exclude s Ġ= Ġmodule . exclude Roots List . urls . map To ( java . util . HashSet (), ĠJ ps Path Util :: url ToFile ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcompiler Exclude s Ġ= ĠJ ps Java Extension Service . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get OrCreate Compiler Configuration ( module . project ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. compiler Exclude s ĊĊĠĠĠĠĠĠĠ Ġval Ġbuild Root Index Ġ= Ġlocal Context . project Descriptor . build Root Index ĊĠĠĠĠĠĠĠ Ġval Ġroots Ġ= Ġbuild Root Index . getTarget Roots ( j ps Module Build Target , Ġlocal Context ) ĊĠĠĠĠĠĠĠ Ġroots . forEach Ġ{ Ġroot Descriptor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Cross Compiled Ġ= Ġroot Descriptor Ġis ĠKotlin Included Module Source Root ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Descriptor . root . walk Top Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Enter Ġ{ Ġfile Ġ-> Ġfile Ġ! in Ġmodule Exclude s Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġfile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! compiler Exclude s . is Excluded ( file ) Ġ&& Ġfile . isFile Ġ&& Ġfile . is Kotlin SourceFile ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ file ] Ġ= ĠSource ( file , Ġis Cross Compiled ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ property Ġis Cross Compiled Ġsources Ġthat Ġare Ġcross - compiled Ġto Ġmultiple Ġtargets ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠSource ( ĊĠĠĠĠĠĠĠ Ġval Ġfile : ĠFile , ĊĠĠĠĠĠĠĠ Ġval Ġis Cross Compiled : ĠBoolean ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġfun Ġis From Included Source Root ( file : ĠFile ): ĠBoolean Ġ= Ġsources [ file ]?. is Cross Compiled Ġ== Ġtrue ĊĊĠĠĠ Ġval Ġsource Files : ĠCollection < File > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġsources . keys ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġj ps Module Build Target . toString () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġfor Ġ` Module Chunk . represent ative Target ` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġcompile Module Chunk ( ĊĠĠĠĠĠĠĠ Ġcommon Arguments : ĠCommon Compiler Arguments , ĊĠĠĠĠĠĠĠ Ġdirty Files Holder : ĠKotlin Dirty Source Files Holder , ĊĠĠĠĠĠĠĠ Ġenvironment : ĠJ ps Compiler Environment ĊĠĠĠ Ġ): ĠBoolean ĊĊĠĠĠ Ġopen Ġfun Ġregister Output Items ( output Consumer : ĠModule Level Builder . Output Consumer , Ġoutput Items : ĠList < Generated File >) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( output Ġin Ġoutput Items ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Consumer . register OutputFile ( j ps Module Build Target , Ġoutput . outputFile , Ġoutput . source Files . map Ġ{ Ġit . path Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġreport And Skip Circular ( environment : ĠJ ps Compiler Environment ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( chunk . targets . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġdo Ġnot Ġsupport Ġcircular Ġdependencies , Ġbut Ġif Ġthey Ġare Ġpresent , Ġwe Ġdo Ġour Ġbest Ġshould Ġnot Ġbreak Ġthe Ġbuild , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġso Ġwe Ġsimply Ġyield Ġa Ġwarning Ġand Ġreport ĠNOT H ING _ DONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenvironment . message Collector . report ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCompiler Message Severity . STRONG _ WARNING , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Circular Ġdependencies Ġare Ġnot Ġsupported . ĠThe Ġfollowing Ġmodules Ġdepend Ġon Ġeach Ġother : Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġchunk . present able ShortName Ġ+ Ġ" Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" Kotlin Ġis Ġnot Ġcompiled Ġfor Ġthese Ġmodules " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġdo After Build () Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġval Ġhas Caches : ĠBoolean Ġ= Ġtrue ĊĊĠĠĠ Ġabstract Ġfun Ġcreate Cache Storage ( paths : ĠBuild Data Paths ): ĠJ ps Incremental Cache ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġfor Ġ` Module Chunk . represent ative Target ` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġupdate Chunk Mappings ( ĊĠĠĠĠĠĠĠ Ġlocal Context : ĠCompile Context , ĊĠĠĠĠĠĠĠ Ġchunk : ĠModule Chunk , ĊĠĠĠĠĠĠĠ Ġdirty Files Holder : ĠKotlin Dirty Source Files Holder , ĊĠĠĠĠĠĠĠ Ġoutput Items : ĠMap < Module Build Target , ĠIterable < Generated File >>, ĊĠĠĠĠĠĠĠ Ġincremental Caches : ĠMap < Kotlin Module Build Target <* >, ĠJ ps Incremental Cache > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġby Ġdefault Ġdo Ġnothing ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġupdate Caches ( ĊĠĠĠĠĠĠĠ Ġdirty Files Holder : ĠKotlin Dirty Source Files Holder , ĊĠĠĠĠĠĠĠ Ġj ps Incremental Cache : ĠJ ps Incremental Cache , ĊĠĠĠĠĠĠĠ Ġfiles : ĠList < Generated File >, ĊĠĠĠĠĠĠĠ Ġchanges Collector : ĠChanges Collector , ĊĠĠĠĠĠĠĠ Ġenvironment : ĠJ ps Compiler Environment ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchanged And Removed Files Ġ= Ġdirty Files Holder . get Dirty Files ( j ps Module Build Target ). keys Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirty Files Holder . get Removed Files ( j ps Module Build Target ) ĊĠĠĠĠĠĠĠ Ġval Ġexpect Actual Tracker Ġ= Ġenvironment . services [ Expect Actual Tracker :: class . java ] Ġas ĠExpect Actual Tracker Impl ĊĊĠĠĠĠĠĠĠ Ġj ps Incremental Cache . update Comp lement ary Files ( changed And Removed Files , Ġexpect Actual Tracker ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġmake Services ( ĊĠĠĠĠĠĠĠ Ġbuilder : ĠServices . Builder , ĊĠĠĠĠĠĠĠ Ġincremental Caches : ĠMap < Kotlin Module Build Target <* >, ĠJ ps Incremental Cache >, ĊĠĠĠĠĠĠĠ Ġlookup Tracker : ĠLookup Tracker , ĊĠĠĠĠĠĠĠ Ġexcept Actual Tracer : ĠExpect Actual Tracker ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( builder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister ( Lookup Tracker :: class . java , Ġlookup Tracker ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister ( Expect Actual Tracker :: class . java , Ġexcept Actual Tracer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister ( Compilation Canceled Status :: class . java , Ġobject Ġ: ĠCompilation Canceled Status Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcheck Canceled () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( j ps Global Context . cancel Status . is Canceled ) Ġthrow ĠCompilation Canceled Exception () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠShould Ġbe Ġused Ġonly Ġfor Ġparticular Ġtarget Ġin Ġchunk Ġ( jvm ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠShould Ġnot Ġbe Ġcached Ġsince Ġmay Ġbe Ġvary Ġin Ġdifferent Ġrounds . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġcollect Sources To Compile ( ĊĠĠĠĠĠĠĠ Ġdirty Files Holder : ĠKotlin Dirty Source Files Holder ĊĠĠĠ Ġ) Ġ= ĠS ources To Compile ( ĊĠĠĠĠĠĠĠ Ġsources Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchunk . represent ative Target . is Incremental Compilation Enabled Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirty Files Holder . get Dirty Files ( j ps Module Build Target ). values ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsources . values ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġremoved Files Ġ= Ġdirty Files Holder . get Removed Files ( j ps Module Build Target ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġinner Ġclass ĠS ources To Compile ( ĊĠĠĠĠĠĠĠ Ġsources : ĠCollection < Kotlin Module Build Target . Source >, ĊĠĠĠĠĠĠĠ Ġval Ġremoved Files : ĠCollection < File > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġall Files Ġ= Ġsources . map Ġ{ Ġit . file Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcross Compiled Files Ġ= Ġsources . filter Ġ{ Ġit . is Cross Compiled Ġ}. map Ġ{ Ġit . file Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġtrue , Ġif Ġthere Ġare Ġremoved Ġfiles Ġor Ġfiles Ġto Ġcompile ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġlog Files (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhas Removed Sources Ġ= Ġremoved Files . isNotEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhas Dirty Or Removed Sources Ġ= Ġall Files . isNotEmpty () Ġ|| Ġhas Removed Sources ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Dirty Or Removed Sources ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlogger Ġ= Ġj ps Global Context . logging Manager . project Builder Logger ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( logger . isEnabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . log Compiled Files ( all Files , ĠKotlin Builder . K OT LIN _ BUILDER _ NAME , Ġ" Comp iling Ġfiles :") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhas Dirty Or Removed Sources ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġval Ġbuild Meta Info Factory : ĠBuild Meta Info Factory < Build Meta Info Type > ĊĊĠĠĠ Ġabstract Ġval Ġbuild Meta Info FileName : ĠString ĊĊĠĠĠ Ġfun Ġis Version Changed ( chunk : ĠKotlin Chunk , Ġbuild Meta Info : ĠBuild Meta Info ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġchunk . build Meta Info File ( j ps Module Build Target ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! file . exists ()) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġprev Build Meta Info Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Meta Info Factory . deserialize FromString ( file . read Text ()) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Builder . LOG . error (" Could Ġnot Ġdeserialize Ġbuild Ġmeta Ġinfo ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġprev Lang Version Ġ= ĠLanguage Version . from Version String ( prev Build Meta Info . language Version String ) ĊĠĠĠĠĠĠĠ Ġval Ġprev ApiVersion Ġ= ĠApi Version . parse ( prev Build Meta Info . apiVersion String ) ĊĊĠĠĠĠĠĠĠ Ġval Ġreason To Rebuild Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchunk . lang Version Ġ!= Ġprev Lang Version Ġ-> Ġ" Language Ġversion Ġwas Ġchanged Ġ($ prev Lang Version Ġ-> Ġ${ chunk . lang Version })" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchunk . apiVersion Ġ!= Ġprev ApiVersion Ġ-> Ġ" Api Ġversion Ġwas Ġchanged Ġ($ prev ApiVersion Ġ-> Ġ${ chunk . apiVersion })" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprev Lang Version Ġ!= ĠLanguage Version . K OT LIN _ 1 _ 0 Ġ&& Ġprev Build Meta Info . is E AP Ġ&& Ġ! build Meta Info . is E AP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf ĠE AP -> Non - E AP Ġbuild Ġwith ĠIC , Ġthen Ġrebuild Ġall Ġkotlin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Last Ġbuild Ġwas Ġcompiled Ġwith ĠE AP - plugin " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( reason To Rebuild Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Builder . LOG . info ("$ reason To Rebuild . ĠPerform ing Ġnon - incremental Ġrebuild Ġ( kotlin Ġonly )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Represent ative Target ( chunk : ĠKotlin Chunk ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( chunk . represent ative Target Ġ== Ġthis ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Represent ative Target ( chunk : ĠModule Chunk ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( chunk . represent ative Target () Ġ== Ġj ps Module Build Target ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Represent ative Target ( chunk : ĠList < Kotlin Module Build Target <* >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( chunk . first () Ġ== Ġthis ) ĊĠĠĠ Ġ} Ċ }