/* Ċ Ġ* ĠCopyright Ġ 1 9 9 9 - 2 0 1 7 ĠAlibaba ĠGroup . Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . alibaba . p 3 c . idea . inspection Ċ Ċ import Ġcom . alibaba . p 3 c . idea . config . P 3 c Config Ċ import Ġcom . alibaba . p 3 c . idea . inspection . standalone . Ali Access Static Via Instance Inspection Ċ import Ġcom . alibaba . p 3 c . idea . inspection . standalone . Ali De precation Inspection Ċ import Ġcom . alibaba . p 3 c . idea . inspection . standalone . Ali Missing Override Annotation Inspection Ċ import Ġcom . alibaba . p 3 c . idea . inspection . standalone . Map Or Set Key Should Override HashCode Equals Inspection Ċ import Ġcom . alibaba . p 3 c . pmd . I 1 8 n Resources Ċ import Ġcom . alibaba . smart fox . idea . common . util . getService Ċ import Ġcom . be ust . j command er . internal . Lists Ċ import Ġcom . be ust . j command er . internal . Maps Ċ import Ġcom . intellij . code Inspection . Inspection Tool Provider Ċ import Ġcom . intellij . code Inspection . Local Inspection Tool Ċ import Ġcom . intellij . openapi . diagnostic . Logger Ċ import Ġcom . intellij . openapi . roots . Project Root Manager Ċ import Ġcom . intellij . psi . Psi Compiled File Ċ import Ġcom . intellij . psi . Psi File Ċ import Ġcom . intellij . psi . Psi Import List Ċ import Ġcom . intellij . psi . Psi Java File Ċ import Ġjav assist . Cannot Compile Exception Ċ import Ġjav assist . Class Class Path Ċ import Ġjav assist . Class Pool Ċ import Ġjav assist . Ct Field Ċ import Ġjav assist . NotFoundException Ċ import Ġnet . sourceforge . pmd . Rule Ċ import Ġnet . sourceforge . pmd . Rule Set Factory Ċ import Ġnet . sourceforge . pmd . Rule Set NotFoundException Ċ import Ġjavax . annotation . Generated Ċ Ċ /** Ċ Ġ* Ġ@ author Ġca ik ang Ċ Ġ* Ġ@ date Ġ 2 0 1 6 / 1 2 / 1 6 Ċ Ġ*/ Ċ class ĠAli Local Inspection Tool Provider Ġ: ĠIns pection Tool Provider Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġget Inspection Classes (): ĠArray < Class <* >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCLASS _ LIST . to Typed Array () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠShould Inspect Checker Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġcheck Ġinspect Ġwhether Ġor Ġnot ĊĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġfile Ġfile Ġto Ġinspect ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġor Ġfalse ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġshould Inspect ( file : ĠPsi File ): ĠBoolean ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠRule Info ( var Ġrule : ĠRule , Ġvar Ġshould Inspect Checker : ĠShould Inspect Checker ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrule Info Map : ĠMutable Map < String , ĠRule Info > Ġ= ĠMaps . new HashMap < String , ĠRule Info >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLOGGER Ġ= ĠLogger . getInstance ( Ali Local Inspection Tool Provider :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġrule Names : ĠMutable List < String > Ġ= ĠLists . newArrayList < String >() !! ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠCLASS _ LIST Ġ= ĠLists . newArrayList < Class <* >>() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġnative Inspection Tool Class Ġ= Ġarray ListOf < Class < out ĠLocal Inspection Tool >>( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// todo Ġ: åħĪ åİ» éĻ¤ idea çī¹ æľīçļĦ è§ĦåĪĻ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAli Missing Override Annotation Inspection :: class . java , Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAli Access Static Via Instance Inspection :: class . java , Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAli De precation Inspection :: class . java , Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMap Or Set Key Should Override HashCode Equals Inspection :: class . java , ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAli Long L iterals Ending With Lower case L Inspection :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtodo Ġ: Ali Equals Avoid Null Inspection Ġ åŃĺåľ¨ çĽĳ æµĭ ä¸į åĩº æĿ¥çļĦ éĹ®é¢ĺ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAli Equals Avoid Null Inspection :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAli Array Naming Should Have Bracket Inspection :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAli Wrapper Type Equality Inspection :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 2 . 1 . 0 Ġ å¢ŀåĬł Ġneed Br aces Ġ è§ĦåĪĻ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAli Control Flow Statement Without Br aces Inspection :: class . java ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġjava Should Inspect Checker Ġ= Ġobject Ġ: ĠShould Inspect Checker Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġshould Inspect ( file : ĠPsi File ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbasic Inspect Ġ= Ġfile Ġis ĠPsi Java File Ġ&& Ġfile Ġ! is ĠPsi Compiled File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! basic Inspect ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! valid Scope ( file )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimport List Ġ= Ġfile . children . first OrNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġis ĠPsi Import List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġas ? ĠPsi Import List Ġ?: Ġreturn Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ! import List . all Import Statements . any Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . text . contains ( Generated :: class . java . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġvalid Scope ( file : ĠPsi File ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvirtual File Ġ= Ġfile . virtual File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= ĠProject Root Manager . getInstance ( file . project ). file Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġindex . isIn Source ( virtual File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ! index . isIn Test Source Content ( virtual File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ! index . isIn Library Classes ( virtual File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ! index . isIn Library Source ( virtual File ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠI 1 8 n Resources . change Language ( P 3 c Config :: class . java . getService (). locale ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠThread . currentThread (). context ClassLoader Ġ= ĠAli Local Inspection Tool Provider :: class . java . class Loader ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit P md Inspection () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Native Inspection () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġinit Native Inspection () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpool Ġ= ĠClass Pool . getDefault () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpool . insert Class Path ( Class Class Path ( Delegate Local Inspection Tool :: class . java )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnative Inspection Tool Class . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpool . insert Class Path ( Class Class Path ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcc Ġ= Ġpool . get ( Delegate Local Inspection Tool :: class . java . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcc . name Ġ= Ġ" Delegate ${ it . simple Name }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġct Field Ġ= Ġcc . getField (" for J av assist ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcc . remove Field ( ct Field ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġit Class Ġ= Ġpool . get ( it . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtool Class Ġ= Ġpool . get ( Local Inspection Tool :: class . java . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Field Ġ= ĠC t Field ( tool Class , Ġ" for J av assist ", Ġcc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcc . addField ( new Field , ĠC t Field . Initializer . by New ( it Class )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCLASS _ LIST . add ( cc . to Class ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġinit P md Inspection () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( ri Ġin Ġnew Rule Infos ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . rule Names . add ( ri . rule . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrule Info Map . put ( ri . rule . name , Ġri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpool Ġ= ĠClass Pool . getDefault () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpool . insert Class Path ( Class Class Path ( Delegate P md Inspection :: class . java )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( rule Info Ġin Ġrule Info Map . values ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcc Ġ= Ġpool . get ( Delegate P md Inspection :: class . java . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcc . name Ġ= Ġrule Info . rule . name Ġ+ Ġ" Inspection " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġct Field Ġ= Ġcc . getField (" rule Name ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcc . remove Field ( ct Field ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġ"\"" Ġ+ Ġrule Info . rule . name Ġ+ Ġ"\"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Field Ġ= ĠC t Field . make (" private ĠString Ġrule Name Ġ= Ġ$ value ;", Ġcc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcc . addField ( new Field , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCLASS _ LIST . add ( cc . to Class ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNotFound Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠCannot Compile Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġnew Rule Infos (): ĠList < Rule Info > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠLists . newArrayList < Rule Info >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . addAll ( process For Rule Set (" java / ali - pmd ", Ġjava Should Inspect Checker )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . addAll ( process For Rule Set (" vm / ali - other ", Ġobject Ġ: ĠShould Inspect Checker Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġshould Inspect ( file : ĠPsi File ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvirtual File Ġ= Ġfile . virtual File Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġvirtual File . canonical Path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpath Ġ!= Ġnull Ġ&& Ġpath . endsWith (". vm ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ})) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġprocess For Rule Set ( rule SetName : ĠString , Ġshould Inspect Checker : ĠShould Inspect Checker ): ĠList < Rule Info > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfactory Ġ= ĠRule Set Factory () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠLists . newArrayList < Rule Info >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrule Set Ġ= Ġfactory . create Rule Set ( rule SetName . replace ("/", Ġ"- ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrule Set . rules . map To ( result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRule Info ( it , Ġshould Inspect Checker ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠRule Set NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . error ( String . format (" rule Ġset Ġ% s Ġnot Ġfound Ġfor ", Ġrule SetName )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ