package Ġcom . plugin . fre ge . psi . util Ċ Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi Member Ċ import Ġcom . plugin . fre ge . psi . Fre ge Qualifier Ċ Ċ /** Ċ Ġ* ĠStores Ġinformation Ġabout Ġthe Ġqualified Ġname Ġof Ġa Ġusage Ġor ĠP SI Ġmember . Ċ Ġ* ĠIn ĠFre ge Ġthere Ġare Ġonly Ġqualified Ġname Ġwith Ġat Ġmost Ġtwo Ġqual ifiers . Ċ Ġ* Ċ Ġ* ĠContract : Ġ`[ first Qualifier ] Ġ!= Ġnull Ġ-> Ġ[ second Qualifier ] Ġ!= Ġnull `. Ċ Ġ*/ Ċ data Ġclass ĠFre ge Name ( ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFirst Ġqualifier Ġif Ġthe Ġqualified Ġname Ġhas Ġtwo Ġqual ifiers , Ġotherwise Ġ` null `. ĊĠĠĠĠ Ġ* ĠExamples : ĊĠĠĠĠ Ġ* Ġ* Ġ` B . c Ġ-> Ġnull ` ĊĠĠĠĠ Ġ* Ġ* Ġ` A . B . c Ġ-> ĠA ` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġfirst Qualifier : ĠString ?, ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSecond Ġqualifier Ġif Ġqualified Ġname Ġhas Ġat Ġleast Ġone Ġqualifier , Ġotherwise Ġ` null `. ĠExamples : ĊĠĠĠĠ Ġ* Ġ* Ġ` A . B . c Ġ-> ĠB ` ĊĠĠĠĠ Ġ* Ġ* Ġ` B . c Ġ-> ĠB ` ĊĠĠĠĠ Ġ* Ġ* Ġ' c Ġ-> Ġnull ' ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġsecond Qualifier : ĠString ?, ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠShort Ġname . ĊĠĠĠĠ Ġ* ĠExamples : ĊĠĠĠĠ Ġ* Ġ* Ġ` A . B . c Ġ-> Ġc ` ĊĠĠĠĠ Ġ* Ġ* Ġ` A . B Ġ-> ĠB ` ĊĠĠĠĠ Ġ* Ġ* Ġ` c Ġ-> Ġc ` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġshort Name : ĠString Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġconstructor ( qual ifiers List : ĠList < String >, Ġname : ĠString ) Ġ: Ġthis ( ĊĠĠĠĠĠĠĠ Ġqual ifiers List . get OrNull ( 1 ), ĊĠĠĠĠĠĠĠ Ġqual ifiers List . get OrNull ( 0 ), ĊĠĠĠĠĠĠĠ Ġname , ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPull s Ġinfo Ġfrom Ġa Ġusage Ġof Ġsome Ġelement : Ġit Ġcollect s Ġ[ Fre ge Qualifier ] s Ġand Ġconstructs Ġ[ Fre ge Name ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconstructor ( usage : ĠPsi Element ) Ġ: Ġthis ( collect Qual ifiers ( usage ), Ġusage . text ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcollect Qual ifiers ( element : ĠPsi Element ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġgenerate Sequence ( element . prev Sibling Ġas ? ĠFre ge Qualifier ) Ġ{ Ġit . prev Sibling Ġas ? ĠFre ge Qualifier Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . text . substring Before Last ('.') Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġrequire ( it . size Ġ<= Ġ 2 ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠPull s Ġinfo Ġfrom Ġthe Ġcontaining Ġclasses Ġof Ġ[ member ]. ĊĠĠĠĠĠĠĠĠ Ġ* Ġ* Ġ[ first Qualifier ] Ġis Ġthe Ġname Ġof Ġcontaining Ġclass Ġof Ġcontaining Ġclass Ġof Ġ[ member ]. ĊĠĠĠĠĠĠĠĠ Ġ* Ġ* Ġ[ second Qualifier ] Ġis Ġthe Ġname Ġof Ġcontaining Ġclass Ġof Ġ[ member ]. ĊĠĠĠĠĠĠĠĠ Ġ* Ġ* Ġ[ short Name ] Ġis Ġthe Ġname Ġof Ġ[ member ]. ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġof Psi Member ( member : ĠPsi Member ): ĠFre ge Name ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmember . name ?. let Ġ{ Ġmember Name Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclazz Ġ= Ġmember . containing Class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclazz Of Clazz Ġ= Ġclazz ?. containing Class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFre ge Name ( clazz Of Clazz ?. name , Ġclazz ?. name , Ġmember Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠMerged Ġ[ first Qualifier ] Ġand Ġ[ second Qualifier ] Ġwith Ġ'.' Ġor Ġ` null ` Ġif Ġthey 're Ġboth Ġ` null `. ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval ĠFre ge Name . qual ifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget (): ĠString ? Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Qualifier Ġ!= Ġnull Ġ-> Ġ"$ first Qualifier .$ second Qualifier " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsecond Qualifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠMerged Ġ[ first Qualifier ], Ġ[ second Qualifier ] Ġand Ġ[ short Name ] Ġwith Ġ'.', Ġ` null `- parts Ġare Ġomitted . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval ĠFre ge Name . fullName Ġget (): ĠString Ġ= Ġqualifier ?. let Ġ{ Ġ"$ it .$ short Name " Ġ} Ġ?: Ġshort Name ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠChecks Ġif Ġqualified Ġname Ġhas Ġat Ġleast Ġone Ġqualifier . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval ĠFre ge Name . is Qualified Ġget (): ĠBoolean Ġ= Ġsecond Qualifier Ġ!= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠChecks Ġif Ġqualified Ġname Ġhas Ġno Ġqual ifiers . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval ĠFre ge Name . isNot Qualified Ġget (): ĠBoolean Ġ= Ġ! is Qualified ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠNon - nullable Ġversion Ġof Ġ[ qual ifier ]. ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval ĠFre ge Name . qual ifier OrEmpty Ġget (): ĠString Ġ= Ġqualifier Ġ?: Ġ"" ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠNon - nullable Ġversion Ġof Ġ[ first Qualifier ]. ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval ĠFre ge Name . first Qualifier OrEmpty Ġget (): ĠString Ġ= Ġfirst Qualifier Ġ?: Ġ"" ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠNon - nullable Ġversion Ġof Ġ[ second Qualifier ]. ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval ĠFre ge Name . second Qualifier OrEmpty Ġget (): ĠString Ġ= Ġsecond Qualifier Ġ?: Ġ"" ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠMerge s Ġtwo Ġnames Ġinto Ġone . ĊĠĠĠĠĠĠĠĠ Ġ* ĠExamples : ĊĠĠĠĠĠĠĠĠ Ġ* Ġ* Ġ` First . Second Ġ+ ĠSecond . method Ġ-> ĠFirst . Second . method ` ĊĠĠĠĠĠĠĠĠ Ġ* Ġ* Ġ` First Ġ+ ĠSecond . method Ġ-> ĠFirst . Second . method ` ĊĠĠĠĠĠĠĠĠ Ġ* Ġ* Ġ` A . B . c Ġ+ ĠA . B . c Ġ-> ĠA . B . c ` ĊĠĠĠĠĠĠĠĠ Ġ* Ġ* Ġ` A . B Ġ+ ĠA . B . c Ġ-> ĠA . B . c ` ĊĠĠĠĠĠĠĠĠ Ġ* Ġ* Ġ` A . B . c Ġ+ ĠA . B Ġ-> Ġnull ` ĊĠĠĠĠĠĠĠĠ Ġ* Ġ* Ġ` A . B Ġ+ ĠD . c Ġ-> Ġnull ` ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun ĠFre ge Name . merge ( other : ĠFre ge Name ): ĠFre ge Name ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ!!! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIt Ġcould Ġbe Ġimplemented Ġin Ġmore Ġconcise Ġway , Ġbut Ġit Ġwas Ġimplemented Ġlike Ġthis Ġfor Ġoptimization ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ!!! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Ġ== Ġother ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( first Qualifier Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( other . first Qualifier Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( other . second Qualifier Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( short Name Ġ== Ġother . short Name ) Ġthis Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( second Qualifier Ġ== Ġother . second Qualifier Ġ&& Ġshort Name Ġ== Ġother . short Name ) Ġthis Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( other . first Qualifier Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( second Qualifier Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( second Qualifier Ġ== Ġother . first Qualifier Ġ&& Ġshort Name Ġ== Ġother . second Qualifier ) Ġother Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( short Name Ġ== Ġother . first Qualifier ) Ġother Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( second Qualifier Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( other . second Qualifier Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( short Name Ġ== Ġother . second Qualifier ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFre ge Name ( null , Ġother . second Qualifier , Ġother . short Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFre ge Name ( short Name , Ġother . second Qualifier , Ġother . short Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( short Name Ġ== Ġother . short Name ) Ġthis Ġelse ĠFre ge Name ( null , Ġshort Name , Ġother . short Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( short Name Ġ== Ġother . second Qualifier Ġ|| Ġother . second Qualifier Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFre ge Name ( second Qualifier , Ġshort Name , Ġother . short Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ