/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 ĠThe ĠB azel ĠAuthors . ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* Ġ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 Ġio . bazel . kotlin . builder . tasks . jvm Ċ Ċ import Ġcom . google . devtools . build . lib . view . proto . Deps Ċ import Ġjava . nio . file . Path Ċ import Ġjava . nio . file . Paths Ċ import Ġjava . util .* Ċ import Ġjava . util . function . Predicate Ċ Ċ internal Ġclass ĠJ deps Parser Ġprivate Ġconstructor ( private Ġval Ġfilename : ĠString , Ġprivate Ġval Ġis Implicit : ĠPredicate < String >) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġpackage Suffix : ĠString Ġ= Ġ" Ġ($ filename )" ĊĊĠĠĠ Ġprivate Ġval Ġdep Map Ġ= ĠHashMap < String , ĠDep s . Dependency . Builder >() ĊĠĠĠ Ġprivate Ġval Ġpackages Ġ= ĠHashSet < String >() ĊĊĠĠĠ Ġprivate Ġvar Ġmode Ġ= ĠMode . COLLECT _ DEPS ĊĊĠĠĠ Ġprivate Ġfun Ġconsume Jar Line ( class Jar Path : ĠString , Ġkind : ĠDep s . Dependency . Kind ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= ĠPaths . get ( class Jar Path ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġignore Ġabsolute Ġfiles , Ġ-- Ġj dk Ġjar Ġpaths Ġetc . ĊĠĠĠĠĠĠĠ Ġ// Ġonly Ġprocess Ġjar Ġfiles ĊĠĠĠĠĠĠĠ Ġif Ġ(!( path . is Absolute Ġ|| Ġ! class Jar Path . endsWith (". jar "))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= Ġdep Map . compute If Absent ( class Jar Path ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdep Builder Ġ= ĠDep s . Dependency . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdep Builder . path Ġ= Ġclass Jar Path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdep Builder . kind Ġ= Ġkind ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Implicit . test ( class Jar Path )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdep Builder . kind Ġ= ĠDep s . Dependency . Kind . IMP LICIT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdep Builder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdon 't Ġflip Ġan Ġimplicit Ġdep . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry . kind Ġ!= ĠDep s . Dependency . Kind . IMP LICIT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry . kind Ġ= Ġkind ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġenum Ġclass ĠMode Ġ{ ĊĠĠĠĠĠĠĠ ĠCOL LECT _ DEPS , ĊĠĠĠĠĠĠĠ ĠDET ER M INE _ JDK , ĊĠĠĠĠĠĠĠ ĠCOL LECT _ PACK AGES _ JDK 8 , ĊĠĠĠĠĠĠĠ ĠCOL LECT _ PACK AGES _ JDK 9 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġmaybe Ġsimplify Ġthis Ġby Ġtoken izing Ġon Ġwhitespace Ġand Ġarrows . ĊĠĠĠ Ġprivate Ġfun Ġprocess Line ( line : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtrimmed Line Ġ= Ġline . trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ} ĊĠĠĠĠĠĠĠ Ġwhen Ġ( mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMode . COLLECT _ DEPS Ġ-> Ġif Ġ(! line . startsWith (" Ġ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparts Ġ= Ġline . split (" Ġ-> Ġ". to Regex ()). drop Last While Ġ{ Ġit . isEmpty () Ġ}. to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parts . size Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parts [ 0 ] Ġ!= Ġfilename ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" should Ġonly Ġget Ġdependencies Ġfor Ġdep : Ġ$ filename ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsume Jar Line ( parts [ 1 ], ĠDep s . Dependency . Kind . EX PL IC IT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmode Ġ= ĠMode . DE TERM INE _ JDK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Line ( line ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMode . DE TERM INE _ JDK Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmode Ġ= ĠMode . COLLECT _ PACK AGES _ JDK 8 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! line . endsWith ( package Suffix )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmode Ġ= ĠMode . COLLECT _ PACK AGES _ JDK 9 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Line ( line ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMode . COLLECT _ PACK AGES _ JDK 8 Ġ-> Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrimmed Line . endsWith ( package Suffix ) Ġ-> Ġpackages . add ( trimmed Line . substring ( 0 , Ġtrimmed Line . length Ġ- Ġpackage Suffix . length )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrimmed Line . startsWith (" -> Ġ") Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġignore Ġpackage Ġdetail Ġlines , Ġin Ġthe Ġj dk 8 Ġformat Ġthese Ġstart Ġwith Ġarrows . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠRuntimeException (" unexpected Ġline Ġwhile Ġcollecting Ġpackages : Ġ$ line ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMode . COLLECT _ PACK AGES _ JDK 9 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpkg Ġ= Ġtrimmed Line . split ("\\ s +". to Regex ()). drop Last While Ġ{ Ġit . isEmpty () Ġ}. to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpackages . add ( pkg [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġpath Suffix Matching Predicate ( directory : ĠPath , Ġvar arg Ġj ars : ĠString ): ĠPredicate < String > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuffix es Ġ= Ġj ars . map Ġ{ Ġdirectory . resolve ( it ). toString () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPredicate Ġ{ Ġjar Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( implicit J ars Ending Ġin Ġsuffix es ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( jar . endsWith ( implicit J ars Ending )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ Predicate Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġparse ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlabel : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Jar : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Path : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġj dep Lines : ĠList < String >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Implicit : ĠPredicate < String > ĊĠĠĠĠĠĠĠ Ġ): ĠDep s . Dependencies Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfilename Ġ= ĠPaths . get ( class Jar ). fileName . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġj deps Parser Ġ= ĠJ deps Parser ( filename , Ġis Implicit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Path . split (" :" . to Regex ()). drop Last While Ġ{ Ġit . isEmpty () Ġ}. stream () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġx Ġ-> Ġj deps Parser . consume Jar Line ( x , ĠDep s . Dependency . Kind . UNUSED ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġj dep Lines . forEach Ġ{ Ġj deps Parser . process Line ( it ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroot Builder Ġ= ĠDep s . Dependencies . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Builder . success Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Builder . rule Label Ġ= Ġlabel ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Builder . addAll Cont ained Package ( j deps Parser . packages ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġj deps Parser . dep Map . values . forEach Ġ{ Ġb Ġ-> Ġroot Builder . add Dependency ( b . build ()) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Builder . success Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġroot Builder . build () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }