/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 7 . Ġtang zx ( love . tang zx @ qq . com ) Ċ Ġ* Ċ Ġ* Ġ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 . tang . intellij . lua . editor Ċ Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi Reference Ċ import Ġcom . intellij . psi . code Style . Name Util Ċ import Ġcom . intellij . psi . code Style . Suggest ed Name Info Ċ import Ġcom . intellij . psi . search . sear ches . References Search Ċ import Ġcom . intellij . refactor ing . rename . Name Suggestion Provider Ċ import Ġcom . tang . intellij . lua . psi .* Ċ import Ġcom . tang . intellij . lua . search . Search Context Ċ import Ġcom . tang . intellij . lua . ty .* Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* Ċ Ġ* ĠCreated Ġby ĠT ang ZX Ġon Ġ 2 0 1 6 / 1 2 / 2 0 . Ċ Ġ*/ Ċ class ĠLua Name Suggestion Provider Ġ: ĠName Suggestion Provider Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġfix Name ( ori Name : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġori Name . replace (".", Ġ"") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcollect Names ( context : ĠSearch Context , Ġtype : ĠI Ty , Ġcollector : Ġ( name : ĠString , Ġsuffix : ĠString , Ġprefer Long er : ĠBoolean ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠI Ty Class Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! type . is Anonymous Ġ&& Ġtype Ġ! is ĠTy Doc Table ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollector ( fix Name ( type . className ), Ġ"", Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTy . process Super Classes ( context , Ġtype ) Ġ{ Ġsuper Type Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠsuperClass Ġ= Ġ( if Ġ( super Type Ġis ĠI Ty Generic ) Ġsuper Type . base Ġelse Ġsuper Type ) Ġas ? ĠI Ty Class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( super Class Ġ!= Ġnull Ġ&& Ġ! super Class . is Anonymous ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollector ( fix Name ( super Class . className ), Ġ"", Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠI Ty Array Ġ-> Ġcollect Names ( context , Ġtype . base ) Ġ{ Ġname , Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollector ( name , Ġ" List ", Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠI Ty Generic Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparam Ty Ġ= Ġtype . get Arg Ty ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollect Names ( context , Ġparam Ty ) Ġ{ Ġname , Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollector ( name , Ġ" Map ", Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// éĢ Ĩ åĲĳ ĊĠĠĠ Ġprivate Ġfun Ġget Names ( ref : ĠPsi Reference , Ġset : ĠMutable Set < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġele Ġ= Ġref . element ĊĠĠĠĠĠĠĠ Ġval Ġp 1 Ġ= Ġele . parent ĊĠĠĠĠĠĠĠ Ġif Ġ( ele Ġis ĠLua Expression <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( p 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLua List Args Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// call ( var ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparam Index Ġ= Ġp 1 . getIndex For ( ele ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 2 Ġ= Ġp 1 . parent Ġas ? ĠLua Call Expr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( p 2 Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠSearch Context . get ( ele . project ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġty Ġ= Ġp 2 . guess Parent Type ( context ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ty Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTy Union . each ( ty ) Ġ{ Ġi Ty Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Ty . process Signatures ( context ) Ġ{ Ġsig Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsig . params ?. get OrNull ( param Index )?. let Ġ{ Ġparam Info Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset . add ( param Info . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ process Signatures Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLua Expr List Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// xxx Ġ= Ġvar ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 2 Ġ= Ġp 1 . parent Ġas ? ĠLua Assign Stat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue List Ġ= Ġp 2 ?. value Expr List ?. expression List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value List Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġvalue List . indexOf ( ele ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvar Expr Ġ= Ġp 2 . get Expression At ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( var Expr Ġis ĠLua Index Expr ) Ġvar Expr . name ?. let Ġ{ Ġset . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Suggest ed Names ( psi : ĠPsi Element , Ġname Suggestion Context : ĠPsi Element ?, Ġset : ĠMutable Set < String >): ĠSuggest ed Name Info ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsearch Ġ= ĠReferences Search . search ( psi , Ġpsi . use Scope ) ĊĠĠĠĠĠĠĠ Ġsearch . forEach Ġ{ Ġget Names ( it , Ġset ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( psi Ġis ĠLua Psi Type Guess able ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠSearch Context . get ( psi . getProject ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġpsi . guess Type ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnames Ġ= ĠHashSet < String >() ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTy Union . each ( type ) Ġ{ Ġty Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollect Names ( context , Ġty ) Ġ{ Ġname , Ġsuffix , Ġprefer Long er Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( names . add ( name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstrings Ġ= ĠName Util . get Suggestions ByName ( name , Ġ"", Ġsuffix , Ġfalse , Ġprefer Long er , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset . addAll ( strings ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} Ċ } Ċ