package Ġio . github . es ent so v . kotlin visibility Ċ Ċ import Ġcom . android . tools . lint . client . api . U Element Handler Ċ import Ġcom . android . tools . lint . detector . api .* Ċ import Ġcom . android . tools . lint . detector . api . Detector . U ast Scanner Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . impl . source . Psi Class Reference Type Ċ import Ġorg . jetbrains . kotlin . as Java . elements . Kt Light Declaration Ċ import Ġorg . jetbrains . u ast .* Ċ Ċ private Ġconst Ġval Ġfile Private Annotation Name Ġ= Ġ" io . github . es ent so v . File Private " Ċ private Ġconst Ġval Ġpackage Private Annotation Name Ġ= Ġ" io . github . es ent so v . Package Private " Ċ Ċ /** Ċ Ġ* ĠReports Ġusage s Ġof Ġmembers Ġmarked Ġwith Ġ[ file Private Annotation Name ] Ġannotation Ġor Ġ[ package Private Annotation Name ] Ġoutside Ġof Ġthe Ġrespective Ġscopes . Ċ Ġ*/ Ċ class ĠPrivate Members Usage Detector Ġ: ĠDetector (), ĠU ast Scanner Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCurrently Ġwe Ġcheck Ġthe Ġraw Ġexpressions , Ġthey Ġcover Ġall Ġmembers Ġusage . ĊĠĠĠĠ Ġ* ĠThe Ġ[ U ast Scanner ] Ġapi Ġseems Ġto Ġnot Ġcover Ġreferences Ġto Ġproperties , Ġdeclared Ġin Ġprimary Ġconstructors . ĊĠĠĠĠ Ġ* ĠIt Ġalso Ġresolves Ġproperty Ġassignment Ġexpressions Ġinto Ġgetter Ġcall , Ġchecking Ġfor Ġgetter Ġannotations ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġget Applicable U ast Types (): ĠList < Class < out ĠU Element >> ? Ġ= ĊĠĠĠĠĠĠĠ ĠlistOf ( U Expression :: class . java , ĠU Parameter :: class . java , ĠU Annotation :: class . java ) ĊĊĠĠĠ Ġoverride Ġfun Ġcreate U ast Handler ( context : ĠJava Context ): ĠU Element Handler ? Ġ= ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠU Element Handler () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Annotation ( node : ĠU Annotation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( node , Ġnode . resolve ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Parameter ( node : ĠU Parameter ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( node , Ġ( node . type Reference ?. type Ġas ? ĠPsi Class Reference Type )?. resolve ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Expression ( node : ĠU Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node Ġis ĠU Qualified Reference Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAvoid Ġduplication Ġby Ġhandling Ġlower Ġlevel Ġpart Ġof Ġthe Ġreference ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġe . g . Ġinstance . value Ġwill Ġbe Ġhandled Ġas Ġjust Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( node , Ġnode . try Resolve ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcheck ( node : ĠU Element , Ġresolved : ĠPsi Element ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( resolved Ġas ? ĠK t Light Declaration < *, Ġ* >) ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( resolved . is Annotated With ( file Private Annotation Name ) Ġ&& Ġare In Different Files ( node , Ġresolved )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . report ( File Private Issue , Ġnode , Ġcontext . getLocation ( node ), Ġ" Usage Ġof Ġprivate Ġapi ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( resolved . is Annotated With ( package Private Annotation Name ) Ġ&& Ġare In Different Packages ( context , Ġnode , Ġresolved )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . report ( Package Private Issue , Ġnode , Ġcontext . getLocation ( node ), Ġ" Usage Ġof Ġprivate Ġapi ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġare In Different Files ( node : ĠU Element , Ġresolved : ĠPsi Element ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdeclaration File Ġ= Ġresolved . containing File . virtual File . path ĊĠĠĠĠĠĠĠ Ġval Ġreference File Ġ= Ġnode . get Containing U File ()?. get Io File ()?. absolute Path ĊĠĠĠĠĠĠĠ Ġreturn Ġreference File Ġ!= Ġnull Ġ&& Ġdeclaration File Ġ!= Ġreference File ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġare In Different Packages ( context : ĠJava Context , Ġnode : ĠU Element , Ġresolved : ĠK t Light Declaration < *, Ġ* >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdeclaration Package Ġ= Ġcontext . evaluator . get Package ( resolved ) ĊĠĠĠĠĠĠĠ Ġval Ġreference Package Ġ= Ġcontext . evaluator . get Package ( node ) ĊĠĠĠĠĠĠĠ Ġreturn Ġdeclaration Package ?. qualified Name Ġ!= Ġreference Package ?. qualified Name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠPackage Private Issue Ġ= ĠIssue . create ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Package Private Id ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Kotlin Ġpackage Ġvisibility ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" This Ġcheck Ġhighlight s Ġusage Ġof Ġmembers Ġmarked Ġprivate Ġin Ġpackage Ġthey Ġare Ġdeclared Ġin ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCategory . CORRECT NESS , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSeverity . ERROR , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠImplementation ( Private Members Usage Detector :: class . java , ĠScope . JAVA _ FILE _ SCOPE ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval ĠFile Private Issue Ġ= ĠIssue . create ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" File Private Id ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Kotlin Ġfile Ġvisibility ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" This Ġcheck Ġhighlight s Ġusage Ġof Ġmembers Ġmarked Ġprivate Ġfor Ġfiles Ġthey Ġare Ġdeclared Ġin ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCategory . CORRECT NESS , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSeverity . ERROR , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠImplementation ( Private Members Usage Detector :: class . java , ĠScope . JAVA _ FILE _ SCOPE ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } ĊĊ