/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 1 Ġ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 . gradle . incremental Ċ Ċ import Ġcom . google . common . annotations . Visible ForTesting Ċ import Ġcom . intellij . openapi . util . io . File Util Ċ import Ġorg . jetbrains . kotlin . build . report . Build Reporter Ċ import Ġorg . jetbrains . kotlin . build . report . IC Reporter Ċ import Ġorg . jetbrains . kotlin . build . report . metrics .* Ċ import Ġorg . jetbrains . kotlin . cli . common . ExitCode Ċ import Ġorg . jetbrains . kotlin . incremental .* Ċ import Ġjava . io . File Ċ import Ġorg . jetbrains . kotlin . gradle . incremental . Changes Collector Result . Success Ċ import Ġorg . jetbrains . kotlin . gradle . incremental . Changes Collector Result . Failure Ċ import Ġorg . jetbrains . kotlin . incremental . storage . File To Canonical Path Converter Ċ import Ġjava . util .* Ċ Ċ /** ĠComputes Ġ[ Classpath Changes ] Ġbetween Ġtwo Ġ[ Classpath Snapshot ] s Ġ. */ Ċ object ĠClass path Changes Computer Ġ{ ĊĊĠĠĠ Ġfun Ġget Changes ( current : ĠClass path Snapshot , Ġprevious : ĠClass path Snapshot ): ĠClass path Changes Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchanges Collector Ġ= ĠChanges Collector () ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( collect Classpath Changes ( current , Ġprevious , Ġchanges Collector )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSuccess Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( lookup Symbols , Ġfq Names , Ġ_) Ġ= Ġchanges Collector . get Dirty Data ( emptyList (), ĠNo Op Build Reporter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass path Changes . Available ( lookup Symbols . toList (), Ġfq Names . toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFailure Ġ-> ĠClass path Changes . Not Available . Unable To Compute ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcollect Classpath Changes ( ĊĠĠĠĠĠĠĠ Ġcurrent : ĠClass path Snapshot , ĊĠĠĠĠĠĠĠ Ġprevious : ĠClass path Snapshot , ĊĠĠĠĠĠĠĠ Ġchanges Collector : ĠChanges Collector ĊĠĠĠ Ġ): ĠChanges Collector Result Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( current . classpath Entry Snapshots . size Ġ!= Ġprevious . classpath Entry Snapshots . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFailure . Added Removed Classpath Entries ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġcurrent . classpath Entry Snapshots . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcollect Classpath Entry Changes ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent . classpath Entry Snapshots [ index ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious . classpath Entry Snapshots [ index ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanges Collector ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġis ĠFailure ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠSuccess ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcollect Classpath Entry Changes ( ĊĠĠĠĠĠĠĠ Ġcurrent : ĠClass path Entry Snapshot , ĊĠĠĠĠĠĠĠ Ġprevious : ĠClass path Entry Snapshot , ĊĠĠĠĠĠĠĠ Ġchanges Collector : ĠChanges Collector ĊĠĠĠ Ġ): ĠChanges Collector Result Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( current . class Snapshots . size Ġ!= Ġprevious . class Snapshots . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFailure . Added Removed Classes ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( key Ġin Ġcurrent . class Snapshots . keys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Snapshot Ġ= Ġcurrent . class Snapshots [ key ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious Snapshot Ġ= Ġprevious . class Snapshots [ key ] Ġ?: Ġreturn ĠFailure . Added Removed Classes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcollect Class Changes ( current Snapshot , Ġprevious Snapshot , Ġchanges Collector ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ! is ĠSuccess ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠSuccess ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcollect Class Changes ( ĊĠĠĠĠĠĠĠ Ġcurrent : ĠClass Snapshot , ĊĠĠĠĠĠĠĠ Ġprevious : ĠClass Snapshot , ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UNUSED _ PARAMETER ") Ġchanges Collector : ĠChanges Collector ĊĠĠĠ Ġ): ĠChanges Collector Result Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( current Ġis ĠJava Class Snapshot Ġ&& Ġprevious Ġis ĠJava Class Snapshot Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( current Ġ! is ĠRegular Java Class Snapshot Ġ|| Ġprevious Ġ! is ĠRegular Java Class Snapshot ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFailure . Not Y et Implemented ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠStore Ġresults Ġin Ġchanges Collector Ġand Ġreturn ĠSUCCESS Ġhere ĊĠĠĠĠĠĠĠ Ġcompute Class Changes ( current , Ġprevious ) ĊĠĠĠĠĠĠĠ Ġreturn ĠFailure . Not Y et Implemented ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġinternal Ġfun Ġcompute Class Changes ( current : ĠClass Snapshot , Ġprevious : ĠClass Snapshot ): ĠDir ty Data Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO ĠCreate ĠIncrement al Jvm Cache Ġearly Ġonce Ġand Ġreuse Ġit Ġhere ĊĠĠĠĠĠĠĠ Ġval Ġworking Dir Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile Util . create Temp Directory ( this :: class . java . simple Name , Ġ"_ Working Dir _${ UUID . randomUUID () }", Ġ/* Ġdelete On Exit Ġ*/ Ġtrue ) ĊĠĠĠĠĠĠĠ Ġval Ġincremental Jvm Cache Ġ= ĠIncrement al Jvm Cache ( working Dir , Ġ/* Ġtarget Output Dir Ġ*/ Ġnull , ĠFile To Canonical Path Converter ) ĊĠĠĠĠĠĠĠ Ġval Ġchanges Collector Ġ= ĠChanges Collector () ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ġis ĠKotlin Class Snapshot Ġ&& Ġprevious Ġis ĠKotlin Class Snapshot Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollect Kotlin Class Changes ( current , Ġprevious , Ġincremental Jvm Cache , Ġchanges Collector ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ġis ĠJava Class Snapshot Ġ&& Ġprevious Ġis ĠJava Class Snapshot Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollect Java Class Changes ( current , Ġprevious , Ġincremental Jvm Cache , Ġchanges Collector ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠHandle Ġcurrent Ġis ĠKotlin Class Snapshot Ġ&& Ġprevious Ġis ĠJava Class Snapshot , Ġand Ġvice Ġvers a ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" In compatible Ġtypes : Ġ${ current . java Class . name } Ġvs . Ġ${ previous . java Class . name }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġworking Dir . delete Re cursively () ĊĠĠĠĠĠĠĠ Ġreturn Ġchanges Collector . get Dirty Data ( listOf ( incremental Jvm Cache ), ĠNo Op Build Reporter . No Op IC Reporter ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcollect Kotlin Class Changes ( ĊĠĠĠĠĠĠĠ Ġcurrent : ĠKotlin Class Snapshot , ĊĠĠĠĠĠĠĠ Ġprevious : ĠKotlin Class Snapshot , ĊĠĠĠĠĠĠĠ Ġincremental Jvm Cache : ĠIncrement al Jvm Cache , ĊĠĠĠĠĠĠĠ Ġchanges Collector : ĠChanges Collector ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠStore Ġprevious Ġsnapshot Ġin Ġincremental Jvm Cache , Ġthe Ġreturned ĠChanges Collector Ġresult Ġis Ġnot Ġused . ĊĠĠĠĠĠĠĠ Ġincremental Jvm Cache . save Class To Cache ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin Class Info Ġ= Ġprevious . class Info , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Files Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchanges Collector Ġ= ĠChanges Collector () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġincremental Jvm Cache . clear Cache For Removed Classes ( changes Collector ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCompute Ġchanges Ġbetween Ġthe Ġcurrent Ġsnapshot Ġand Ġthe Ġpreviously Ġstored Ġsnapshot , Ġand Ġstore Ġthe Ġresult Ġin Ġchanges Collector . ĊĠĠĠĠĠĠĠ Ġincremental Jvm Cache . save Class To Cache ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin Class Info Ġ= Ġcurrent . class Info , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Files Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchanges Collector Ġ= Ġchanges Collector ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġincremental Jvm Cache . clear Cache For Removed Classes ( changes Collector ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcollect Java Class Changes ( ĊĠĠĠĠĠĠĠ Ġcurrent : ĠJava Class Snapshot , ĊĠĠĠĠĠĠĠ Ġprevious : ĠJava Class Snapshot , ĊĠĠĠĠĠĠĠ Ġincremental Jvm Cache : ĠIncrement al Jvm Cache , ĊĠĠĠĠĠĠĠ Ġchanges Collector : ĠChanges Collector ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠStore Ġprevious Ġsnapshot Ġin Ġincremental Jvm Cache , Ġthe Ġreturned ĠChanges Collector Ġresult Ġis Ġnot Ġused . ĊĠĠĠĠĠĠĠ Ġval Ġprevious Snapshot Ġ= Ġ( previous Ġas ĠRegular Java Class Snapshot ). serialized Java Class Ġ// ĠTODO ĠHandle Ġunsafe Ġcast ĊĠĠĠĠĠĠĠ Ġincremental Jvm Cache . save Java Class Proto (/* Ġsource Ġ*/ Ġnull , Ġprevious Snapshot , ĠChanges Collector ()) ĊĠĠĠĠĠĠĠ Ġincremental Jvm Cache . clear Cache For Removed Classes ( changes Collector ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCompute Ġchanges Ġbetween Ġthe Ġcurrent Ġsnapshot Ġand Ġthe Ġpreviously Ġstored Ġsnapshot , Ġand Ġstore Ġthe Ġresult Ġin Ġchanges Collector . ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Snapshot Ġ= Ġ( current Ġas ĠRegular Java Class Snapshot ). serialized Java Class ĊĠĠĠĠĠĠĠ Ġincremental Jvm Cache . save Java Class Proto (/* Ġsource Ġ*/ Ġnull , Ġcurrent Snapshot , Ġchanges Collector ) ĊĠĠĠĠĠĠĠ Ġincremental Jvm Cache . clear Cache For Removed Classes ( changes Collector ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġsealed Ġclass ĠChanges Collector Result Ġ{ ĊĊĠĠĠ Ġobject ĠSuccess Ġ: ĠChanges Collector Result () ĊĊĠĠĠ Ġsealed Ġclass ĠFailure Ġ: ĠChanges Collector Result () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠHandle Ġthese Ġcases ĊĠĠĠĠĠĠĠ Ġobject ĠAdded Removed Classpath Entries Ġ: ĠFailure () ĊĠĠĠĠĠĠĠ Ġobject ĠAdded Removed Classes Ġ: ĠFailure () ĊĠĠĠĠĠĠĠ Ġobject ĠNot Y et Implemented Ġ: ĠFailure () ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġobject ĠNo Op Build Reporter Ġ: ĠBuild Reporter ( No Op IC Reporter , ĠNo Op Build Metrics Reporter ) Ġ{ ĊĊĠĠĠ Ġobject ĠNo Op IC Reporter Ġ: ĠIC Reporter Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġreport ( message : Ġ() Ġ-> ĠString ) Ġ{} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġreport Verbose ( message : Ġ() Ġ-> ĠString ) Ġ{} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġreport Compile Iteration ( incremental : ĠBoolean , Ġsource Files : ĠCollection < File >, Ġexit Code : ĠExit Code ) Ġ{} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġreport Mark Dirty Class ( affected Files : ĠIterable < File >, Ġclass Fq Name : ĠString ) Ġ{} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġreport Mark Dirty Member ( affected Files : ĠIterable < File >, Ġscope : ĠString , Ġname : ĠString ) Ġ{} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġreport Mark Dirty ( affected Files : ĠIterable < File >, Ġreason : ĠString ) Ġ{} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject ĠNo Op Build Metrics Reporter Ġ: ĠBuild Metrics Reporter Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġstart Measure ( time : ĠBuild Time , Ġstart Ns : ĠLong ) Ġ{} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġend Measure ( time : ĠBuild Time , Ġend Ns : ĠLong ) Ġ{} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġadd Time Metric ( metric : ĠBuild Time , Ġduration Ms : ĠLong ) Ġ{} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġadd Metric ( metric : ĠBuild Performance Metric , Ġvalue : ĠLong ) Ġ{} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġadd Attribute ( attribute : ĠBuild Attribute ) Ġ{} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Metrics (): ĠBuild Metrics Ġ= ĠBuild Metrics () ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġadd Metrics ( metrics : ĠBuild Metrics ?) Ġ{} ĊĠĠĠ Ġ} Ċ } Ċ