/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 9 Ġ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 Ċ Ċ import Ġorg . jetbrains . kotlin . gradle . util . modify Ċ import Ġorg . junit . Assert . assertEquals Ċ import Ġorg . junit . Assert . assertTrue Ċ import Ġorg . junit . Ass ume Ċ import Ġorg . junit . Test Ċ import Ġjava . io . File Ċ import Ġkotlin . test . assertFalse Ċ Ċ class ĠK apt Incremental With Ag greg ating A pt Ġ: ĠK apt Incremental IT () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġget Project () Ġ= ĊĠĠĠĠĠĠĠ ĠProject ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" k apt Incremental Compilation Project ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGradle Version Required . None ĊĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Incremental A pt Project (" AGG REG ATING ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdefault Build Options (): ĠBuild Options Ġ= ĊĠĠĠĠĠĠĠ Ġsuper . default Build Options (). copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġincremental Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġk apt Options Ġ= ĠK apt Options ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverbose Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse Workers Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġincremental K apt Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinclude Compile Classpath Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Incremental Changes () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproject Ġ= Ġget Project () ĊĊĠĠĠĠĠĠĠ Ġproject . build (" clean ", Ġ" build ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Successful () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġproject . project File (" use B . kt "). modify Ġ{ Ġcurrent Ġ-> Ġ"$ current \ n fun Ġother Function () Ġ{} " Ġ} ĊĠĠĠĠĠĠĠ Ġproject . build (" build ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Successful () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile In Working Dir (" build / tmp / k apt 3 / stubs / main / bar / Use BK t . java "). canonical Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile In Working Dir (" build / tmp / k apt 3 / stubs / main / bar / B . java "). canonical Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile In Working Dir (" build / tmp / k apt 3 / stubs / main / baz / Util Kt . java "). canonical Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile In Working Dir (" build / tmp / k apt 3 / stubs / main / foo / A . java "). canonical Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile In Working Dir (" build / tmp / k apt 3 / stubs / main / error / Non Ex istent Class . java "). canonical Path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), Ġget Processed Sources ( output ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġproject . project File (" Java Class . java "). modify Ġ{ Ġcurrent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Brace Ġ= Ġcurrent . lastIndexOf (" }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent . substring ( 0 , Ġlast Brace ) Ġ+ Ġ" private Ġvoid Ġanother Fun () Ġ{}\ n Ġ}" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġproject . build (" build ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Successful () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . project File (" Java Class . java "). canonical Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile In Working Dir (" build / tmp / k apt 3 / stubs / main / bar / Use BK t . java "). canonical Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile In Working Dir (" build / tmp / k apt 3 / stubs / main / bar / B . java "). canonical Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile In Working Dir (" build / tmp / k apt 3 / stubs / main / baz / Util Kt . java "). canonical Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile In Working Dir (" build / tmp / k apt 3 / stubs / main / foo / A . java "). canonical Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile In Working Dir (" build / tmp / k apt 3 / stubs / main / error / Non Ex istent Class . java "). canonical Path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Processed Sources ( output ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Incremental Change sWith J dk 9 () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjava Home Ġ= ĠFile ( System . getProperty (" jdk 9 Home ") !! ) ĊĠĠĠĠĠĠĠ ĠAssume . assume True (" JDK Ġ 9 Ġisn 't Ġavailable ", Ġjava Home . isDirectory ) ĊĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= Ġdefault Build Options (). copy ( java Home Ġ= Ġjava Home ) ĊĠĠĠĠĠĠĠ Ġval Ġproject Ġ= Ġget Project () ĊĊĠĠĠĠĠĠĠ Ġproject . build (" clean ", Ġ" build ", Ġoptions Ġ= Ġoptions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Successful () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġproject . project File (" use B . kt "). modify Ġ{ Ġcurrent Ġ-> Ġ"$ current \ n fun Ġother Function () Ġ{} " Ġ} ĊĠĠĠĠĠĠĠ Ġproject . build (" build ", Ġoptions Ġ= Ġoptions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Successful () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile In Working Dir (" build / tmp / k apt 3 / stubs / main / bar / Use BK t . java "). canonical Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile In Working Dir (" build / tmp / k apt 3 / stubs / main / bar / B . java "). canonical Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile In Working Dir (" build / tmp / k apt 3 / stubs / main / baz / Util Kt . java "). canonical Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile In Working Dir (" build / tmp / k apt 3 / stubs / main / foo / A . java "). canonical Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile In Working Dir (" build / tmp / k apt 3 / stubs / main / error / Non Ex istent Class . java "). canonical Path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), Ġget Processed Sources ( output ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Classpath Changes () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproject Ġ= ĠProject ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" incremental Multi project ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGradle Version Required . None ĊĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Working Dir () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprocessor Path Ġ= Ġgenerate Processor (" AGG REG ATING ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Dir . resolve (" app / build . gradle "). append Text ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapply Ġplugin : Ġ" kotlin - k apt " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependencies Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimplementation Ġ" org . jetbrains . kotlin : kotlin - stdlib :${ '$ '} kotlin _ version " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġk apt Ġfiles ("${ processor Path . in variant Separ ators Path }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Dir . resolve (" lib / build . gradle "). append Text ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependencies Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimplementation Ġ" org . jetbrains . kotlin : kotlin - stdlib :${ '$ '} kotlin _ version " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġproject . build (" clean ", Ġ": app : build ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Successful () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġproject . project File (" A . kt "). modify Ġ{ Ġcurrent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Brace Ġ= Ġcurrent . lastIndexOf (" }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent . substring ( 0 , Ġlast Brace ) Ġ+ Ġ" fun Ġanother Fun () Ġ{}\ n Ġ}" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġproject . build (" build ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Successful () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile In Working Dir (" app / build / tmp / k apt 3 / stubs / main / foo / AA . java "). canonical Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile In Working Dir (" app / build / tmp / k apt 3 / stubs / main / foo / AAA . java "). canonical Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile In Working Dir (" app / build / tmp / k apt 3 / stubs / main / foo / BB . java "). canonical Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile In Working Dir (" app / build / tmp / k apt 3 / stubs / main / foo / Foo Use AK t . java "). canonical Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile In Working Dir (" app / build / tmp / k apt 3 / stubs / main / foo / Foo Use BK t . java "). canonical Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile In Working Dir (" app / build / tmp / k apt 3 / stubs / main / foo / Foo Use AA Kt . java "). canonical Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile In Working Dir (" app / build / tmp / k apt 3 / stubs / main / foo / Foo Use BB Kt . java "). canonical Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile In Working Dir (" app / build / tmp / k apt 3 / stubs / main / error / Non Ex istent Class . java "). canonical Path ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), Ġget Processed Sources ( output ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġproject . project File (" A . kt "). modify Ġ{ Ġcurrent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Brace Ġ= Ġcurrent . lastIndexOf (" }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent . substring ( 0 , Ġlast Brace ) Ġ+ Ġ" private Ġfun Ġprivate Function () Ġ{}\ n Ġ}" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġproject . build (" build ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Successful () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( get Processed Sources ( output ). isEmpty ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest In compatible Classpath Changes () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproject Ġ= Ġget Project () ĊĠĠĠĠĠĠĠ Ġproject . project File (" use B . kt "). modify Ġ{ Ġcurrent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ġ+ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ example . Example Annotation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġadded Function B () Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġproject . build (" clean ", Ġ" build ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Successful () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġproject . project File (" use B . kt "). modify Ġ{ Ġcurrent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent . replace (" fun Ġadded Function B ", Ġ" fun Ġrenamed Function B ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġproject . gradle Build Script (). append Text (""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġdependencies Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompile Ġ' com . google . gu ava : gu ava : 1 2 . 0 ' ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent ()) ĊĠĠĠĠĠĠĠ Ġproject . build (" build ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Successful () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile In Working Dir (" build / generated / source / k apt / main / bar / Added Function B Generated . java "). exists (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Generated Ġfile Ġshould Ġbe Ġdeleted Ġfor Ġrenamed Ġfunction Ġwhen Ġclasspath Ġchanges ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }