package Ġcom . l kl . android . lint . checks . detector . source Ċ Ċ import Ġcom . android . tools . lint . detector . api .* Ċ import Ġcom . google . gson . JsonObject Ċ import Ġcom . intellij . psi . Psi Method Ċ import Ġcom . l kl . android . lint . checks . bean . Constructor Item Ċ import Ġcom . l kl . android . lint . checks . bean . Constructor Usage Ċ import Ġcom . l kl . android . lint . checks . detector . base . Base Source Code Detector Ċ import Ġcom . l kl . android . lint . checks . utils . Detector Utils Ċ import Ġcom . l kl . android . lint . checks . utils . Gson Utils Ċ import Ġorg . jetbrains . u ast . U Call Expression Ċ import Ġorg . jetbrains . u ast . get QualifiedName Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* Ġæ£Ģ æŁ¥ ç¦ģ çĶ¨çļĦ æŀĦéĢł åĩ½æķ° çļĦ ä½¿çĶ¨ Ċ Ġ* Ċ Ġ* Ġ@ author Ġl kl Ċ Ġ* Ġ@ since Ġ 2 0 2 2 / 0 2 / 2 7 Ċ Ġ*/ Ċ @ Suppress (" Un stable Api Usage ") Ċ class ĠDisable Constructor Detector Ġ: ĠBase Source Code Detector () Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠREPORT _ MESSAGE Ġ= Ġ" Do Ġnot Ġdirectly Ġnew Ġthis Ġclass ." ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠIssue Ġdescribing Ġthe Ġproblem Ġand Ġpointing Ġto Ġthe Ġdetector ĊĠĠĠĠĠĠĠĠ Ġ* Ġimplementation . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Field ĊĠĠĠĠĠĠĠ Ġval ĠISS UE : ĠIssue Ġ= ĠIssue . create ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġ" Disable Constructor Usage ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbrief Description Ġ= ĠREPORT _ MESSAGE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexplanation Ġ= ĠREPORT _ MESSAGE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcategory Ġ= ĠCategory . SECURITY , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpriority Ġ= Ġ 6 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġseverity Ġ= ĠSeverity . ERROR , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimplementation Ġ= ĠImplementation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDisable Constructor Detector :: class . java , ĠScope . JAVA _ FILE _ SCOPE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġconstructor Usage : ĠConstructor Usage ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġconstructor Types : ĠList < String >? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġissue Map : ĠMutable Map < String , ĠIssue > Ġ= ĠHashMap () ĊĊĠĠĠ Ġoverride Ġfun Ġget Usage Config (): ĠJsonObject ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Usage Config (" disable _ constructor _ usage ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbefore Check Root Project ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . before Check Root Project ( context ) ĊĊĠĠĠĠĠĠĠ Ġconstructor Usage Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGson Utils . parse Json 2 Obj ( custom Config ?. toString (), ĠConstructor Usage :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġconstructor Types Ġ= Ġget Detect Constructor Names () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Applicable Constructor Types (): ĠList < String >? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġconstructor Types ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Detect Constructor Names (): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmethods Ġ= ĠArrayList < String >() ĊĠĠĠĠĠĠĠ Ġconstructor Usage ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconstructors ?. forEach Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . constructor Name ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethods . add ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmethods ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Constructor ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠJava Context , Ġnode : ĠU Call Expression , Ġconstructor : ĠPsi Method ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( constructor Usage Ġ== Ġnull ) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= ĠgetItem ( context , Ġnode ) Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġreport Message Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem . report Message Ġ?: Ġ( constructor Usage ?. report Message Ġ?: ĠREPORT _ MESSAGE ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġissue Ġ= Ġissue Map [ item . constructor Name ] ĊĠĠĠĠĠĠĠ Ġif Ġ( issue Ġ=== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġissue Ġ= ĠDetector Utils . getNew Issue ( ISSUE , Ġreport Message , Ġitem . lint Severity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġissue Map [ item . constructor Name !! ] Ġ= Ġissue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcontext . report ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġissue , Ġnode , Ġcontext . getLocation ( node ), Ġreport Message ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetItem ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠJava Context , Ġnode : ĠU Call Expression ĊĠĠĠ Ġ): ĠConstructor Item ? Ġ{ ĊĠĠĠĠĠĠĠ Ġconstructor Usage ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġitem : ĠConstructor Item ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconstructors ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Ġ= Ġfilter Item ( this , Ġcontext , Ġnode ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġitem ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfilter Item ( ĊĠĠĠĠĠĠĠ Ġapi Items : ĠList < Constructor Item >, Ġcontext : ĠJava Context , Ġnode : ĠU Call Expression ĊĠĠĠ Ġ): ĠConstructor Item ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġapi Items . first OrNull Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Detector Utils . is Build Variant ( context , Ġitem . build Variant )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ first OrNull Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem . constructor Name ?. let Ġ{ Ġname Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ== Ġnode . class Reference . get QualifiedName () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ