package Ġorg . jon ny zz z . gradle . java 9 c Ċ Ċ import Ġorg . gradle . api . Project Ċ import Ġorg . gradle . api . tasks . Source Set Ċ import Ġjava . io . File Ċ import Ġjava . nio . file . Files Ċ import Ġjava . util . jar . Jar File Ċ import Ġkotlin . streams . as Sequence Ċ Ċ data Ġclass ĠPackage ( val Ġname Ġ: ĠString ) Ġ: ĠComparable < Package > Ġ{ ĊĠ Ġoverride Ġfun Ġcompare To ( other : ĠPackage ) Ġ= Ġthis . name . compareTo ( other . name ) Ċ } Ċ Ċ fun Ġlist App Packages FromFile ( root : ĠFile ): ĠSet < Package > Ġ{ ĊĠ Ġif Ġ(! root . isDirectory ) Ġreturn Ġempty Set () ĊĊĠ Ġval Ġroot Path Ġ= Ġroot . to Path () ĊĠ Ġreturn ĠFiles . walk ( rootPath ) ĊĠĠĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . to File (). path . endsWith (". class ") Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġit . to File () Ġ== ĠFile ( rootPath . to File (), Ġ" module - info . class ") Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġroot Path . rel ativ ize ( it . parent ). to File (). path Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . replace ('/', Ġ'.') Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠPackage ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ. to Sorted Set () Ċ } Ċ Ċ fun Ġlist App Packages From Jar ( root : ĠFile ): ĠSet < Package > Ġ{ ĊĠ Ġif Ġ(! root . isFile ) Ġreturn Ġempty Set () ĊĊĠ Ġreturn ĠJar File ( root ). use Ġ{ Ġjar Ġ-> ĊĠĠĠ Ġjar . entries (). as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ! it . isDirectory Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . name . endsWith (". class ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġit . name Ġ== Ġ" module - info . class " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Slash Ġ= Ġit . name . lastIndexOf ('/') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Slash Ġ>= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . name . substring ( 0 , Ġlast Slash ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . replace ('/', Ġ'.') Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠPackage ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Sorted Set () ĊĠ Ġ} Ċ } Ċ Ċ fun Ġscan Packages ( project : ĠProject , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Set : ĠSource Set ) Ġ= ĊĠĠĠĠĠĠĠ ĠResolver (). file Collection Resolver ( project , Ġsource Set ). flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġit . key ĊĠĠĠĠĠĠĠĠĠ Ġ( list App Packages FromFile ( file ) Ġ+ Ġlist App Packages From Jar ( file )). map Ġ{ Ġp Ġ-> Ġp Ġto Ġit . value Ġ} ĊĠĠĠĠĠĠĠ Ġ}. groupBy ( key Selector Ġ= Ġ{ Ġit . first Ġ}, Ġvalue Transform Ġ= Ġ{ Ġit . second Ġ}) ĊĠĠĠĠĠĠĠĠ Ġ. map Values Ġ{ ĊĠĠĠĠĠĠĠĠĠĠ Ġ// it Ġis Ġpossible Ġto Ġhave Ġseveral Ġclasspath Ġentries Ġfor Ġthe Ġsame Ġlogical Ġunit , Ġe . g . Ġjava Ġand Ġkotlin Ġcompiler Ġout out Ġdirs ĊĠĠĠĠĠĠĠĠĠĠ Ġit . value . to Sorted Set () ĊĠĠĠĠĠĠĠĠ Ġ} ĊĊ