package Ġde . acc so . dependency analyzer Ċ Ċ import Ġcom . t ng tech . arch unit . core . domain . Java Class Ċ import Ġcom . t ng tech . arch unit . core . domain . Java Classes Ċ import Ġkotlin . reflect . K Class Ċ Ċ // Ġbackward Ġanalysis Ġ- Ġchecking Ġ_ incoming _ Ġdependencies Ċ // Ġto Ġcollect Ġtrans itive Ġdependencies Ġvia ĠArch Unit 's Ġdependency Ġgraph Ċ Ċ class ĠDependency Analyzer Backward Analysis Via Arch Unit Dependency Graph ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġanalyze Dependencies On Package sWith Prefix : ĠString , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġall Java Clazz es To Analyze : ĠJava Classes ) Ġ{ ĊĊĠĠĠ Ġfun Ġbackward Analysis To Find Transit ively Dependent Java Clazz es ( ĊĠĠĠĠĠĠĠ Ġto K Clazz es : ĠList < K Class <* >> ): ĠSet < Dependency Chain > ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdependent K Clazz es Ġ= Ġmutable Set Of < Dependency Chain >() ĊĊĠĠĠĠĠĠĠ Ġto K Clazz es . forEach Ġ{ Ġtarget K Clazz Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Java Clazz Ġ= Ġall Java Clazz es To Analyze . single OrNull Ġ{ Ġit . isEqualTo K Clazz ( target K Clazz ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( target Java Clazz Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget K Clazz . throw Exception Because Java Clazz NotFound For K Clazz ( analyze Dependencies On Package sWith Prefix ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ċ // TODO Ġhow Ġto Ġbe aut ify Ġthis , Ġhow Ġto Ġavoid Ġthe Ġmutable Ġcollection ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependent K Clazz es . addAll ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackward Analysis To Find Transit ively Dependent Java Clazz es Recursion ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Java Clazz , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Java Clazz , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). toSet () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdependent K Clazz es ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbackward Analysis To Find Transit ively Dependent Java Clazz es Recursion ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Java Clazz : ĠJava Class , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Target Java Clazz : ĠJava Class , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Dependency Chain : ĠDependency Chain ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalready Analy zed Java Clazz es : ĠMutable Set < Java Class > Ġ= Ġmutable Set Of ()): ĠSet < Dependency Chain > ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdependencies Ġ= Ġmutable Set Of < Dependency Chain >() ĊĊĠĠĠĠĠĠĠ Ġval Ġclazz es ToCheck In Recursion Ġ= Ġmutable Set Of < Java Class >() ĊĠĠĠĠĠĠĠ Ġval Ġmutable Analy zed Java Clazz es Ġ= Ġalready Analy zed Java Clazz es . plus ( to Java Clazz ). to Mutable Set () ĊĊĠĠĠĠĠĠĠ Ġto Java Clazz . direct Dependencies To Self . forEach Ġ{ Ġdependency Ġ-> Ċ // TODO Ġhow Ġto Ġbe aut ify Ġthis , Ġhow Ġto Ġavoid Ġthe Ġmutable Ġcollection ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdependencies Ġ+= Ġif Ġ( last Dependency Chain Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDependency Chain ( dependency . origin Class . to K Clazz (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Target Java Clazz . to K Clazz ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDependency Chain ( dependency . origin Class . to K Clazz (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( last Dependency Chain . from ) Ġ+ Ġlast Dependency Chain . dependencies , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Dependency Chain . to ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclazz es ToCheck In Recursion . add ( dependency . origin Class ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclazz es ToCheck In Recursion . forEach Ġ{ Ġnext Target Java Clazz Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! mutable Analy zed Java Clazz es . already Analy zed ( next Target Java Clazz )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Dependency Chain For Recursion Ġ= Ġif Ġ( last Dependency Chain Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDependency Chain ( next Target Java Clazz . to K Clazz (), Ġempty List (), Ġto Target Java Clazz . to K Clazz ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDependency Chain ( next Target Java Clazz . to K Clazz (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( last Dependency Chain . from ) Ġ+ Ġlast Dependency Chain . dependencies , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Dependency Chain . to ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ Ċ // TODO Ġhow Ġto Ġbe aut ify Ġthis , Ġhow Ġto Ġavoid Ġthe Ġmutable Ġcollection ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependencies Ġ+= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackward Analysis To Find Transit ively Dependent Java Clazz es Recursion ( Ġ// Ġrecursion ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Target Java Clazz , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Target Java Clazz , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Dependency Chain For Recursion , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmutable Analy zed Java Clazz es ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmutable Analy zed Java Clazz es . add ( next Target Java Clazz ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdependencies . toSet () ĊĠĠĠ Ġ} Ċ } Ċ