/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 Ġandroidx . room . compiler . processing . util . compiler Ċ Ċ import Ġandroidx . room . compiler . processing . util . Source Ċ import Ġjava . io . File Ċ Ċ /** Ċ Ġ* ĠRepresents Ġsources Ġthat Ġare Ġposition ed Ġin Ġthe Ġ[ root ] Ġfolder . Ċ Ġ* Ġsee : Ġ[ from Existing Files ] Ċ Ġ*/ Ċ internal Ġclass ĠSource Set ( ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġroot Ġsource Ġfolder Ġfor Ġthe Ġgiven Ġsources ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġroot : ĠFile , ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠList Ġof Ġactual Ġsources Ġin Ġthe Ġfolder ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġsources : ĠList < Source > Ċ ) Ġ{ ĊĠĠĠ Ġ// Ġalways Ġuse Ġcanonical Ġfiles ĊĠĠĠ Ġval Ġroot Ġ= Ġroot . canonical File ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( root . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ root Ġmust Ġbe Ġa Ġdirectory " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġhas Java Source Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġjava Sources . isNotEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġhas Kotlin Source Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġkotlin Sources . isNotEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġjava Sources Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġsources . filter Is Instance < Source . Java Source >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġkotlin Sources Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġsources . filter Is Instance < Source . Kotlin Source >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFinds Ġthe Ġsource Ġfile Ġmatching Ġthe Ġgiven Ġrelative Ġpath Ġ( from Ġroot ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfind SourceFile ( ĊĠĠĠĠĠĠĠ Ġpath : ĠString ĊĠĠĠ Ġ): ĠSource ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( path ). canonical File ĊĠĠĠĠĠĠĠ Ġif Ġ(! file . path . startsWith ( root . path )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġrelative Path Ġ= Ġpath . substring After ( root . canonical Path Ġ+ Ġ"/") ĊĠĠĠĠĠĠĠ Ġreturn Ġsources . first OrNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . relative Path Ġ== Ġrelative Path ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCreates Ġa Ġnew ĠSource Set Ġfrom Ġthe Ġgiven Ġfiles . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġfrom Existing Files ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot : ĠFile ĊĠĠĠĠĠĠĠ Ġ) Ġ= ĠSource Set ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Ġ= Ġroot , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsources Ġ= Ġroot . collect Sources (). toList () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCollect s Ġall Ġjava / kotlin Ġsources Ġin Ġa Ġgiven Ġdirectory . Ċ Ġ* ĠNote Ġthat Ġthe Ġpackage Ġname Ġfor Ġjava Ġsources Ġare Ġinherited Ġfrom Ġthe Ġgiven Ġrelative Ġpath . Ċ Ġ*/ Ċ private Ġfun ĠFile . collect Sources (): ĠSequence < Source > Ġ{ ĊĠĠĠ Ġval Ġroot Ġ= Ġthis ĊĠĠĠ Ġreturn Ġwalk Top Down (). map NotNull Ġ{ Ġfile Ġ-> ĊĠĠĠĠĠĠĠ Ġwhen Ġ( file . extension ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" java " Ġ-> ĠSource . load Java Source ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Ġ= Ġfile , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġq Name Ġ= Ġfile . relative To ( root ). path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ('/', Ġ'.') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. substring Before Last ('.') Ġ// Ġdrop Ġ. java ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" kt " Ġ-> ĠSource . load Kotlin Source ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Ġ= Ġfile , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelative Path Ġ= Ġfile . relative To ( root ). path ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ /** Ċ Ġ* ĠConverts Ġthe Ġfile Ġto Ġa Ġ[ Source Set ] Ġif Ġand Ġonly Ġif Ġit Ġis Ġa Ġdirectory . Ċ Ġ*/ Ċ internal Ġfun ĠFile . to Source Set () Ġ= Ġif Ġ( isDirectory ) Ġ{ ĊĠĠĠ ĠSource Set . from Existing Files ( this ) Ċ } Ġelse Ġ{ ĊĠĠĠ Ġnull Ċ }