package Ġic u . win dea . pl s Ċ Ċ import Ġcom . intellij . code Insight . completion .* Ċ import Ġcom . intellij . code Insight . documentation .* Ċ import Ġcom . intellij . code Insight . lookup .* Ċ import Ġcom . intellij . lang .* Ċ import Ġcom . intellij . lang . documentation .* Ċ import Ġcom . intellij . openapi . action System .* Ċ import Ġcom . intellij . openapi . editor .* Ċ import Ġcom . intellij . openapi . progress .* Ċ import Ġcom . intellij . openapi . project .* Ċ import Ġcom . intellij . openapi . util .* Ċ import Ġcom . intellij . openapi . util . text .* Ċ import Ġcom . intellij . openapi . vfs .* Ċ import Ġcom . intellij . psi .* Ċ import Ġcom . intellij . psi . search .* Ċ import Ġcom . intellij . psi . stubs .* Ċ import Ġcom . intellij . psi . util .* Ċ import Ġcom . intellij . refactor ing . actions . Base Ref actor ing Action .* Ċ import Ġcom . intellij . util .* Ċ Ċ // region ĠMisc ĠExtensions Ċ val Ġicon Size Ġget () Ġ= ĠDocumentation Component . get Quick Doc FontSize (). size Ċ Ċ /** å¾ĹåĪ° å½ĵåīį AST èĬĤçĤ¹ çļĦ éĻ¤äºĨ ç©º çĻ½ èĬĤçĤ¹ ä¹ĭ å¤ĸ çļĦæīĢæľī åŃĲ èĬĤçĤ¹ ãĢĤ */ Ċ fun ĠAST Node . nodes (): ĠList < AST Node > Ġ{ Ċ ĉ val Ġresult Ġ= Ġmutable ListOf < AST Node >() Ċ ĉ var Ġchild Ġ= Ġthis . firstChild Node Ċ ĉ while ( child Ġ!= Ġnull ) Ġ{ Ċĉ ĉ if ( child . elementType Ġ!== ĠTokenType . WHITE _ SPACE ) Ġresult Ġ+= Ġchild Ċĉ ĉ child Ġ= Ġchild . tree Next Ċ ĉ } Ċ ĉ return Ġresult Ċ } Ċ Ċ // /** æŁ¥æī¾ å½ĵåīį é¡¹çĽ® ä¸Ń æĮĩå®ļ è¯Ńè¨Ģ æĸĩä»¶ ç±»åŀĭ åĴĮ ä½ľçĶ¨ åŁŁ çļĦ Virtual File ãĢĤ */ Ċ // fun Ġfind Virtual Files ( project : ĠProject , Ġtype : ĠLanguage FileType ): ĠCollection < Virtual File > Ġ{ Ċ // ĉ return ĠFile Type Index . get Files ( type , ĠGlobal Search Scope . project Scope ( project )) Ċ //} Ċ Ċ // /** æŁ¥æī¾ å½ĵåīį é¡¹çĽ® ä¸Ń æĮĩå®ļ è¯Ńè¨Ģ æĸĩä»¶ ç±»åŀĭ åĴĮ ä½ľçĶ¨ åŁŁ çļĦ Psi File ãĢĤ */ Ċ // inline Ġfun Ġ< re ified ĠT Ġ: ĠPsi File > Ġfind Files ( project : ĠProject , Ġtype : ĠLanguage FileType ): ĠList < T > Ġ{ Ċ // ĉ return ĠFile Type Index . get Files ( type , ĠGlobal Search Scope . project Scope ( project )). map NotNull Ġ{ Ċ // ĉ ĉ Psi Manager . getInstance ( project ). find File ( it ) Ċ // ĉ }. filter Is Instance < T >() Ċ //} Ċ Ċ // /** éĢĴ å½Ĵ å¾ĹåĪ° å½ĵåīį Virtual File çļĦæīĢæľī ä½ľä¸º åŃĲ èĬĤçĤ¹ çļĦ Virtual File ãĢĤ */ Ċ // fun ĠVirtual File . getAll Child Files ( destination : ĠMutable List < Virtual File > Ġ= Ġmutable ListOf ()): ĠList < Virtual File > Ġ{ Ċ // ĉ for ( child Ġin Ġthis . children ) Ġ{ Ċ // ĉ ĉ if ( child . isDirectory ) Ġchild . getAll Child Files ( destination ) Ġelse Ġdestination . add ( child ) Ċ // ĉ } Ċ // ĉ return Ġdestination Ċ //} Ċ Ċ /** å°Ĩ Virtual File è½¬ åĮĸ ä¸º æĮĩå®ļ ç±»åŀĭçļĦ Psi File ãĢĤ */ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠPsi File > ĠVirtual File . to Psi File ( project : ĠProject ): ĠT ? Ġ{ Ċ ĉ return ĠPsi Manager . getInstance ( project ). find File ( this ) Ġas ? ĠT Ċ } Ċ Ċ // /** æŁ¥æī¾ æľĢ è¿ľ çļĦ çĽ¸åĲĮ ç±»åŀĭçļĦ åħ Ħ å¼ Ł èĬĤçĤ¹ ãĢĤ åı¯ æĮĩå®ļ æĺ¯åĲ¦ åĲĳ åĲİ æŁ¥æī¾ ï¼Į ä»¥åıĬ æĺ¯åĲ¦ åľ¨ ç©º è¡Į å¤Ħ ä¸Ń æĸŃ ãĢĤ */ Ċ // fun Ġfind F ur the st Sibling Of Same Type ( element : ĠPsi Element , Ġfind After : ĠBoolean , Ġstop On Blank Line : ĠBoolean Ġ= Ġtrue ): ĠPsi Element ? Ġ{ Ċ // ĉ var Ġnode Ġ= Ġelement . node Ċ // ĉ val Ġexpected Type Ġ= Ġnode . elementType Ċ // ĉ var Ġlast Seen Ġ= Ġnode Ċ // ĉ while ( node Ġ!= Ġnull ) Ġ{ Ċ // ĉ ĉ val Ġelement Type Ġ= Ġnode . elementType Ċ // ĉ ĉ when Ġ{ Ċ // ĉĉ ĉ elementType Ġ== Ġexpected Type Ġ-> Ġlast Seen Ġ= Ġnode Ċ // ĉĉ ĉ elementType Ġ== ĠTokenType . WHITE _ SPACE Ġ-> Ġ{ Ċ // ĉĉĉ ĉ if ( stop On Blank Line Ġ&& Ġnode . text . contains Blank Line ()) Ġbreak Ċ // ĉĉ ĉ } Ċ // ĉĉ ĉ else Ġ-> Ġbreak Ċ // ĉ ĉ } Ċ // ĉ ĉ node Ġ= Ġif ( find After ) Ġnode . tree Next Ġelse Ġnode . tree Prev Ċ // ĉ } Ċ // ĉ return Ġlast Seen . psi Ċ //} Ċ Ċ fun ĠLookup Element . with Priority ( priority : ĠDouble ): ĠLookup Element Ġ{ Ċ ĉ return ĠPri or it ized Lookup Element . with Priority ( this , Ġpriority ) Ċ } Ċ Ċ /** å¯¼èĪª åĪ° æĮĩå®ļ åħĥç´ł çļĦ ä½įç½® */ Ċ fun Ġnavigate To Element ( editor : ĠEditor , Ġelement : ĠPsi Element ?) Ġ{ Ċ ĉ val Ġoffset Ġ= Ġelement ?. text Offset Ġ?: Ġreturn Ċ ĉ editor . caret Model . moveTo Offset ( offset ) Ċ ĉ editor . scroll ing Model . scrollTo Caret ( Scroll Type . MAKE _ VISIBLE ) Ċ } Ċ Ċ /** å¯¼èĪª åĪ° æĮĩå®ļ åħĥç´ł çļĦ ä½įç½® å¹¶ä¸Ķ åħī æłĩ éĢīæĭ© è¯¥ åħĥç´ł */ Ċ fun Ġselect Element ( editor : ĠEditor , Ġelement : ĠPsi Element ?) Ġ{ Ċ ĉ val Ġrange Ġ= Ġelement ?. text Range Ġ?: Ġreturn Ċ ĉ editor . selection Model . setSelection ( range . start Offset , Ġrange . end Offset ) Ċ } Ċ Ċ // com . intellij . refactor ing . actions . Base Ref actor ing Action . find Ref actor ing Target In Editor Ċ fun ĠData Context . findElement (): ĠPsi Element ? Ġ{ Ċ ĉ var Ġelement Ġ= Ġthis . getData ( Common Data Keys . P SI _ ELEMENT ) Ċ ĉ if ( element Ġ== Ġnull ) Ġ{ Ċĉ ĉ val Ġeditor Ġ= Ġthis . getData ( Common Data Keys . EDITOR ) Ċĉ ĉ val Ġfile Ġ= Ġthis . getData ( Common Data Keys . P SI _ FILE ) Ċĉ ĉ if ( editor Ġ!= Ġnull Ġ&& Ġfile Ġ!= Ġnull ) Ġ{ Ċĉĉ ĉ element Ġ= Ġget ElementAt Caret ( editor , Ġfile ) Ċĉ ĉ } Ċĉ ĉ val Ġlanguages Ġ= Ġthis . getData ( Lang Data Keys . CONTEXT _ L ANGU AGES ) Ċĉ ĉ if ( element Ġ== Ġnull Ġ|| Ġelement Ġis ĠSynt hetic Element Ġ|| Ġlanguages Ġ== Ġnull ) Ġ{ Ċĉĉ ĉ return Ġnull Ċĉ ĉ } Ċ ĉ } Ċ ĉ return Ġelement Ċ } Ċ Ċ /** Ċ Ġ* ĠåĪ¤æĸŃ æĮĩå®ļçļĦ èĬĤçĤ¹ æĺ¯åĲ¦ åľ¨ æĸĩæ¡£ ä¸Ń è·¨ å¤ļ è¡Į ãĢĤ Ċ Ġ*/ Ċ fun Ġis Span Multiple Lines ( node : ĠAST Node , Ġdocument : ĠDocument ): ĠBoolean Ġ{ Ċ ĉ val Ġrange Ġ= Ġnode . text Range Ċ ĉ val Ġlimit Ġ= Ġif ( range . end Offset Ġ< Ġdocument . text Length ) Ġdocument . get LineNumber ( range . end Offset ) Ġelse Ġdocument . line Count Ġ- Ġ 1 Ċ ĉ return Ġdocument . get LineNumber ( range . start Offset ) Ġ< Ġlimit Ċ } Ċ Ċ // fun Ġintern ( table : ĠChar Table , Ġnode : ĠLight er AST Token Node ): ĠString Ġ{ Ċ // ĉ return Ġtable . intern ( node . text ). toString () Ċ //} Ċ // endregion Ċ Ċ // region ĠDocumentation ĠExtensions Ċ inline Ġfun ĠStringBuilder . definition ( block : ĠStringBuilder . () Ġ-> ĠUnit ) Ġ{ Ċ ĉ append ( Documentation Markup . DEFINITION _ START ) Ċ ĉ block ( this ) Ċ ĉ append ( Documentation Markup . DEFINITION _ END ) Ċ } Ċ Ċ inline Ġfun ĠStringBuilder . content ( block : ĠStringBuilder . () Ġ-> ĠUnit ) Ġ{ Ċ ĉ append ( Documentation Markup . CONTENT _ START ) Ċ ĉ block ( this ) Ċ ĉ append ( Documentation Markup . CONTENT _ END ) Ċ } Ċ Ċ inline Ġfun ĠStringBuilder . sections ( block : ĠStringBuilder . () Ġ-> ĠUnit ) Ġ{ Ċ ĉ append ( Documentation Markup . SECTION S _ START ) Ċ ĉ block ( this ) Ċ ĉ append ( Documentation Markup . SECTION S _ END ) Ċ } Ċ Ċ @ Suppress (" NOTH ING _ TO _ INLINE ") Ċ inline Ġfun ĠStringBuilder . section ( title : ĠCharSequence , Ġvalue : ĠCharSequence ) Ġ{ Ċ ĉ append ( Documentation Markup . SECTION _ HEADER _ START ) Ċ ĉ append ( title ). append (" Ġ") Ċ ĉ append ( Documentation Markup . SECTION _ SEPARATOR ). append ("< p >") Ċ ĉ append ( value ) Ċ ĉ append ( Documentation Markup . SECTION _ END ) Ċ } Ċ Ċ inline Ġfun ĠStringBuilder . gray ed ( block : ĠStringBuilder . () Ġ-> ĠUnit ) Ġ{ Ċ ĉ append ( Documentation Markup . GRAY ED _ START ) Ċ ĉ block ( this ) Ċ ĉ append ( Documentation Markup . GRAY ED _ END ) Ċ } Ċ Ċ fun ĠString . escape Xml () Ġ= Ġif ( this . isEmpty ()) Ġ"" Ġelse ĠString Util . escape Xml Entities ( this ) Ċ Ċ fun ĠString . escape Xml Or Anonymous () Ġ= Ġif ( this . isEmpty ()) Ġanonymous Esc aped String Ġelse ĠString Util . escape Xml Entities ( this ) Ċ // endregion Ċ Ċ // region ĠPsi Element ĠExtensions Ċ inline Ġfun ĠPsi Element . forEach Child ( block : Ġ( Psi Element ) Ġ-> ĠUnit ) Ġ{ Ċ ĉ // ä¸įä¼ļ å¿½ çķ¥ æŁĲ äºĽ çī¹å®ļ ç±»åŀĭçļĦ åŃĲ åħĥç´ł Ċ ĉ var Ġchild Ġ= Ġthis . firstChild Ċ ĉ while ( child Ġ!= Ġnull ) Ġ{ Ċĉ ĉ block ( child ) Ċĉ ĉ child Ġ= Ġchild . next Sibling Ċ ĉ } Ċ } Ċ Ċ inline Ġfun ĠPsi Element . find Child ( predicate : Ġ( Psi Element ) Ġ-> ĠBoolean ): ĠPsi Element ? Ġ{ Ċ ĉ // ä¸įä¼ļ å¿½ çķ¥ æŁĲ äºĽ çī¹å®ļ ç±»åŀĭçļĦ åŃĲ åħĥç´ł Ċ ĉ var Ġchild Ġ= Ġthis . firstChild Ċ ĉ while ( child Ġ!= Ġnull ) Ġ{ Ċĉ ĉ if ( predicate ( child )) Ġreturn Ġchild Ċĉ ĉ child Ġ= Ġchild . next Sibling Ċ ĉ } Ċ ĉ return Ġnull Ċ } Ċ Ċ inline Ġfun Ġ< T Ġ: ĠPsi Element , ĠR > ĠPsi Element . map Child OfType ( type : ĠClass < out ĠT >, Ġtransform : Ġ( T ) Ġ-> ĠR ): ĠList < R > Ġ{ Ċ ĉ // ä¸ºäºĨ ä¼ĺåĮĸ æĢ§èĥ½ ï¼Į ä½¿çĶ¨ Smart List ï¼Į å¹¶ä¸Ķ ä¸į ä¿ĿåŃĺ ä¸ŃéĹ´ ç»ĵæŀľ Ċ ĉ // åıĤèĢĥ ï¼ļ com . intellij . psi . util . Psi Tree Util . getChildren OfType As List ĊĉĊ ĉ var Ġresult : ĠMutable List < R >? Ġ= Ġnull Ċ ĉ var Ġchild : ĠPsi Element ? Ġ= Ġthis . firstChild Ċ ĉ while ( child Ġ!= Ġnull ) Ġ{ Ċĉ ĉ if ( type . is Instance ( child )) Ġ{ Ċĉĉ ĉ if ( result Ġ== Ġnull ) Ġresult Ġ= ĠSmart List () Ċĉĉ ĉ val Ġr Ġ= Ġtransform ( type . cast ( child )) Ċĉĉ ĉ result . add ( r ) Ċĉ ĉ } Ċĉ ĉ child Ġ= Ġchild . next Sibling Ċ ĉ } Ċ ĉ return Ġresult Ġ?: Ġempty List () Ċ } Ċ Ċ inline Ġfun Ġ< T Ġ: ĠPsi Element , ĠR > ĠPsi Element . map Child OfType NotNull ( type : ĠClass < out ĠT >, Ġtransform : Ġ( T ) Ġ-> ĠR ?): ĠList < R > Ġ{ Ċ ĉ // ä¸ºäºĨ ä¼ĺåĮĸ æĢ§èĥ½ ï¼Į ä½¿çĶ¨ Smart List ï¼Į å¹¶ä¸Ķ ä¸į ä¿ĿåŃĺ ä¸ŃéĹ´ ç»ĵæŀľ Ċ ĉ // åıĤèĢĥ ï¼ļ com . intellij . psi . util . Psi Tree Util . getChildren OfType As List ĊĉĊ ĉ var Ġresult : ĠMutable List < R >? Ġ= Ġnull Ċ ĉ var Ġchild : ĠPsi Element ? Ġ= Ġthis . firstChild Ċ ĉ while ( child Ġ!= Ġnull ) Ġ{ Ċĉ ĉ if ( type . is Instance ( child )) Ġ{ Ċĉĉ ĉ if ( result Ġ== Ġnull ) Ġresult Ġ= ĠSmart List () Ċĉĉ ĉ val Ġr Ġ= Ġtransform ( type . cast ( child )) Ċĉĉ ĉ if ( r Ġ!= Ġnull ) Ġresult . add ( r ) Ċĉ ĉ } Ċĉ ĉ child Ġ= Ġchild . next Sibling Ċ ĉ } Ċ ĉ return Ġresult Ġ?: Ġempty List () Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠPsi Element > ĠPsi Element . indexOf Child ( element : ĠT ): ĠInt Ġ{ Ċ ĉ var Ġchild Ġ= Ġfirst Child Ċ ĉ var Ġindex Ġ= Ġ 0 Ċ ĉ while ( child Ġ!= Ġnull ) Ġ{ Ċĉ ĉ when ( child ) Ġ{ Ċĉĉ ĉ element Ġ-> Ġreturn Ġindex Ċĉĉ ĉ is ĠT Ġ-> Ġindex ++ Ċĉĉ ĉ else Ġ-> Ġchild Ġ= Ġchild . next Sibling Ċĉ ĉ } Ċ ĉ } Ċ ĉ return Ġ- 1 Ċ } Ċ Ċ val ĠPsi Element . virtual File : ĠVirtual File ? Ċ ĉ get () Ġ{ Ċĉ ĉ return ĠPsi Util Core . get Virtual File ( this ) Ċ ĉ } Ċ Ċ val ĠPsi Element . first Leaf Or Self : ĠPsi Element Ċ ĉ get () Ġ{ Ċĉ ĉ val Ġfirst Child Ġ= Ġfirst Child Ċĉ ĉ return Ġfirst Child ?. first Leaf Or Self Ġ?: Ġthis Ċ ĉ } Ċ Ċ val ĠPsi Element . icon Ċ ĉ get () Ġ= Ġget Icon ( Icon able . ICON _ FLAG _ VIS IBILITY ) Ċ Ċ val ĠPsi Element . keyword Ċ ĉ get () Ġ= Ġtext . remove Sur rounding (" \"", Ġ"\"" ). let Ġ{ Ġs Ġ-> Ċĉ ĉ run Catch ing Ġ{ Ġs . drop Last ( dummy Identifier Length ) Ġ}. getOrElse Ġ{ Ġs Ġ} Ċ ĉ } Ċ Ċ object ĠEmpty Pointer Ġ: ĠSmart Psi Element Pointer < Psi Element > Ġ{ Ċ ĉ override Ġfun Ġget Element () Ġ= Ġnull ĊĉĊ ĉ override Ġfun Ġget Containing File () Ġ= Ġnull ĊĉĊ ĉ override Ġfun Ġget Project () Ġ= ĠgetDefault Project () ĊĉĊ ĉ override Ġfun Ġget Virtual File () Ġ= Ġnull ĊĉĊ ĉ override Ġfun Ġget Range () Ġ= Ġnull ĊĉĊ ĉ override Ġfun Ġget Psi Range () Ġ= Ġnull Ċ } Ċ Ċ fun Ġ< T Ġ: ĠPsi Element > Ġempty Pointer (): ĠSmart Psi Element Pointer < T > Ġ= ĠEmpty Pointer . cast () Ċ Ċ fun Ġ< E Ġ: ĠPsi Element > ĠE . create Pointer (): ĠSmart Psi Element Pointer < E > Ġ{ Ċ ĉ return ĠSmart Pointer Manager . getInstance ( project ). create Smart Psi Element Pointer ( this ) Ċ } Ċ Ċ fun Ġ< E Ġ: ĠPsi Element > ĠE . create Pointer ( file : ĠPsi File ): ĠSmart Psi Element Pointer < E > Ġ{ Ċ ĉ return ĠSmart Pointer Manager . getInstance ( project ). create Smart Psi Element Pointer ( this , Ġfile ) Ċ } Ċ // endregion Ċ Ċ // region ĠIndex ĠExtensions Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠPsi Element > ĠString Stub Index Extension < T >. exists Element ( Ċ ĉ key : ĠString , Ċ ĉ project : ĠProject , Ċ ĉ scope : ĠGlobal Search Scope Ċ ): ĠBoolean Ġ{ Ċ ĉ var Ġresult Ġ= Ġfalse Ċ ĉ Stub Index . getInstance (). process Elements ( this . key , Ġkey , Ġproject , Ġscope , ĠT :: class . java ) Ġ{ Ċĉ ĉ result Ġ= Ġtrue Ċĉ ĉ return @ process Elements Ġfalse Ċ ĉ } Ċ ĉ return Ġresult Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠPsi Element > ĠString Stub Index Extension < T >. exists Element ( Ċ ĉ key : ĠString , Ċ ĉ project : ĠProject , Ċ ĉ scope : ĠGlobal Search Scope , Ċ ĉ cross inline Ġpredicate : Ġ( T ) Ġ-> ĠBoolean Ċ ): ĠBoolean Ġ{ Ċ ĉ var Ġresult Ġ= Ġfalse Ċ ĉ Stub Index . getInstance (). process Elements ( this . key , Ġkey , Ġproject , Ġscope , ĠT :: class . java ) Ġ{ Ġelement Ġ-> Ċĉ ĉ if ( predicate ( element )) Ġ{ Ċĉĉ ĉ result Ġ= Ġtrue Ċĉĉ ĉ return @ process Elements Ġfalse Ċĉ ĉ } Ċĉ ĉ true Ċ ĉ } Ċ ĉ return Ġresult Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠPsi Element > ĠString Stub Index Extension < T >. findFirst Element ( Ċ ĉ key : ĠString , Ċ ĉ project : ĠProject , Ċ ĉ scope : ĠGlobal Search Scope Ċ ): ĠT ? Ġ{ Ċ ĉ var Ġresult : ĠT ? Ġ= Ġnull Ċ ĉ Stub Index . getInstance (). process Elements ( this . key , Ġkey , Ġproject , Ġscope , ĠT :: class . java ) Ġ{ Ġelement Ġ-> Ċĉ ĉ result Ġ= Ġelement Ċĉ ĉ false Ċ ĉ } Ċ ĉ return Ġresult Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠPsi Element > ĠString Stub Index Extension < T >. findFirst Element ( Ċ ĉ key : ĠString , Ċ ĉ project : ĠProject , Ċ ĉ scope : ĠGlobal Search Scope , Ċ ĉ has Default : ĠBoolean Ġ= Ġfalse , Ċ ĉ cross inline Ġpredicate : Ġ( T ) Ġ-> ĠBoolean Ċ ): ĠT ? Ġ{ Ċ ĉ var Ġresult : ĠT ? Ġ= Ġnull Ċ ĉ var Ġdefault Result : ĠT ? Ġ= Ġnull Ċ ĉ Stub Index . getInstance (). process Elements ( this . key , Ġkey , Ġproject , Ġscope , ĠT :: class . java ) Ġ{ Ġelement Ġ-> Ċĉ ĉ if ( has Default ) Ġdefault Result Ġ= Ġelement Ċĉ ĉ if ( predicate ( element )) Ġ{ Ċĉĉ ĉ result Ġ= Ġelement Ċĉĉ ĉ return @ process Elements Ġfalse Ċĉ ĉ } Ċĉ ĉ true Ċ ĉ } Ċ ĉ return Ġresult Ġ?: Ġdefault Result Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠPsi Element > ĠString Stub Index Extension < T >. find Last Element ( Ċ ĉ key : ĠString , Ċ ĉ project : ĠProject , Ċ ĉ scope : ĠGlobal Search Scope Ċ ): ĠT ? Ġ{ Ċ ĉ var Ġresult : ĠT ? Ġ= Ġnull Ċ ĉ Stub Index . getInstance (). process Elements ( this . key , Ġkey , Ġproject , Ġscope , ĠT :: class . java ) Ġ{ Ġelement Ġ-> Ċĉ ĉ result Ġ= Ġelement Ċĉ ĉ true Ċ ĉ } Ċ ĉ return Ġresult Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠPsi Element > ĠString Stub Index Extension < T >. find Last Element ( Ċ ĉ key : ĠString , Ċ ĉ project : ĠProject , Ċ ĉ scope : ĠGlobal Search Scope , Ċ ĉ has Default : ĠBoolean Ġ= Ġfalse , Ċ ĉ cross inline Ġpredicate : Ġ( T ) Ġ-> ĠBoolean Ċ ): ĠT ? Ġ{ Ċ ĉ var Ġresult : ĠT ? Ġ= Ġnull Ċ ĉ var Ġdefault Result : ĠT ? Ġ= Ġnull Ċ ĉ Stub Index . getInstance (). process Elements ( this . key , Ġkey , Ġproject , Ġscope , ĠT :: class . java ) Ġ{ Ġelement Ġ-> Ċĉ ĉ if ( has Default ) Ġdefault Result Ġ= Ġelement Ċĉ ĉ if ( predicate ( element )) Ġ{ Ċĉĉ ĉ result Ġ= Ġelement Ċĉ ĉ } Ċĉ ĉ true Ċ ĉ } Ċ ĉ return Ġresult Ġ?: Ġdefault Result Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠPsi Element > ĠString Stub Index Extension < T >. findAll Elements ( Ċ ĉ key : ĠString , Ċ ĉ project : ĠProject , Ċ ĉ scope : ĠGlobal Search Scope , Ċ ĉ cancel able : ĠBoolean Ġ= Ġtrue , Ċ ĉ maxSize : ĠInt Ġ= Ġ 0 , Ċ ĉ cross inline Ġpredicate : Ġ( T ) Ġ-> ĠBoolean Ġ= Ġ{ Ġtrue Ġ} Ċ ): ĠList < T > Ġ{ Ċ ĉ val Ġresult : ĠSmart List < T > Ġ= ĠSmart List () Ċ ĉ var Ġsize Ġ= Ġ 0 Ċ ĉ Stub Index . getInstance (). process Elements ( this . key , Ġkey , Ġproject , Ġscope , ĠT :: class . java ) Ġ{ Ġelement Ġ-> Ċĉ ĉ if ( cancel able ) ĠProgress Manager . check Canceled () Ċĉ ĉ if ( predicate ( element )) Ġ{ Ċĉĉ ĉ result Ġ+= Ġelement Ċĉĉ ĉ if ( maxSize Ġ> Ġ 0 ) Ġ{ Ċĉĉĉ ĉ size ++ Ċĉĉĉ ĉ if ( size Ġ== ĠmaxSize ) Ġreturn @ process Elements Ġfalse Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ true Ċ ĉ } Ċ ĉ return Ġresult Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠPsi Element > ĠString Stub Index Extension < T >. process All Elements ( Ċ ĉ key : ĠString , Ċ ĉ project : ĠProject , Ċ ĉ scope : ĠGlobal Search Scope , Ċ ĉ cancel able : ĠBoolean Ġ= Ġtrue , Ċ ĉ cross inline Ġaction : Ġ( T , ĠMutable List < T >) Ġ-> ĠBoolean Ċ ): ĠList < T > Ġ{ Ċ ĉ val Ġresult : ĠSmart List < T > Ġ= ĠSmart List () Ċ ĉ Stub Index . getInstance (). process Elements ( this . key , Ġkey , Ġproject , Ġscope , ĠT :: class . java ) Ġ{ Ġelement Ġ-> Ċĉ ĉ if ( cancel able ) ĠProgress Manager . check Canceled () Ċĉ ĉ action ( element , Ġresult ) Ċ ĉ } Ċ ĉ return Ġresult Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠPsi Element > ĠString Stub Index Extension < T >. findAll Elements By Keys ( Ċ ĉ project : ĠProject , Ċ ĉ scope : ĠGlobal Search Scope , Ċ ĉ cancel able : ĠBoolean Ġ= Ġtrue , Ċ ĉ maxSize : ĠInt Ġ= Ġ 0 , Ċ ĉ cross inline Ġkey Predicate : Ġ( String ) Ġ-> ĠBoolean Ġ= Ġ{ Ġtrue Ġ}, Ċ ĉ cross inline Ġpredicate : Ġ( T ) Ġ-> ĠBoolean Ġ= Ġ{ Ġtrue Ġ} Ċ ): ĠList < T > Ġ{ Ċ ĉ val Ġresult : ĠSmart List < T > Ġ= ĠSmart List () Ċ ĉ var Ġsize Ġ= Ġ 0 Ċ ĉ Stub Index . getInstance (). process All Keys ( this . key , Ġproject ) Ġ{ Ġkey Ġ-> Ċĉ ĉ if ( cancel able ) ĠProgress Manager . check Canceled () Ċĉ ĉ if ( key Predicate ( key )) Ġ{ Ċĉĉ ĉ Stub Index . getInstance (). process Elements ( this . key , Ġkey , Ġproject , Ġscope , ĠT :: class . java ) Ġ{ Ġelement Ġ-> Ċĉĉĉ ĉ if ( cancel able ) ĠProgress Manager . check Canceled () Ċĉĉĉ ĉ if ( predicate ( element )) Ġ{ Ċĉĉĉĉ ĉ result Ġ+= Ġelement Ċĉĉĉ ĉ } Ċĉĉĉ ĉ if ( maxSize Ġ> Ġ 0 ) Ġ{ Ċĉĉĉĉ ĉ size ++ Ċĉĉĉĉ ĉ if ( size Ġ== ĠmaxSize ) Ġreturn @ process Elements Ġfalse Ċĉĉĉ ĉ } Ċĉĉĉ ĉ true Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ if ( maxSize Ġ> Ġ 0 ) Ġ{ Ċĉĉ ĉ if ( size Ġ== ĠmaxSize ) Ġreturn @ process All Keys Ġfalse Ċĉ ĉ } Ċĉ ĉ true Ċ ĉ } Ċ ĉ return Ġresult Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠPsi Element > ĠString Stub Index Extension < T >. process All Elements By Keys ( Ċ ĉ project : ĠProject , Ċ ĉ scope : ĠGlobal Search Scope , Ċ ĉ cancel able : ĠBoolean Ġ= Ġtrue , Ċ ĉ cross inline Ġkey Predicate : Ġ( String ) Ġ-> ĠBoolean Ġ= Ġ{ Ġtrue Ġ}, Ċ ĉ cross inline Ġaction : Ġ( T , ĠMutable List < T >) Ġ-> ĠBoolean Ċ ): ĠList < T > Ġ{ Ċ ĉ val Ġresult : ĠSmart List < T > Ġ= ĠSmart List () Ċ ĉ Stub Index . getInstance (). process All Keys ( this . key , Ġproject ) Ġ{ Ġkey Ġ-> Ċĉ ĉ if ( cancel able ) ĠProgress Manager . check Canceled () Ċĉ ĉ if ( key Predicate ( key )) Ġ{ Ċĉĉ ĉ Stub Index . getInstance (). process Elements ( this . key , Ġkey , Ġproject , Ġscope , ĠT :: class . java ) Ġ{ Ġelement Ġ-> Ċĉĉĉ ĉ if ( cancel able ) ĠProgress Manager . check Canceled () Ċĉĉĉ ĉ action ( element , Ġresult ) Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ true Ċ ĉ } Ċ ĉ return Ġresult Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠPsi Element > ĠString Stub Index Extension < T >. findFirst Element By Keys ( Ċ ĉ project : ĠProject , Ċ ĉ scope : ĠGlobal Search Scope , Ċ ĉ cancel able : ĠBoolean Ġ= Ġtrue , Ċ ĉ has Default : ĠBoolean Ġ= Ġfalse , Ċ ĉ maxSize : ĠInt Ġ= Ġ 0 , Ċ ĉ cross inline Ġkey Predicate : Ġ( String ) Ġ-> ĠBoolean Ġ= Ġ{ Ġtrue Ġ}, Ċ ĉ cross inline Ġpredicate : Ġ( T ) Ġ-> ĠBoolean Ġ= Ġ{ Ġtrue Ġ} Ċ ): ĠList < T > Ġ{ Ċ ĉ val Ġresult : ĠSmart List < T > Ġ= ĠSmart List () Ċ ĉ var Ġsize Ġ= Ġ 0 Ċ ĉ Stub Index . getInstance (). process All Keys ( this . key , Ġproject ) Ġ{ Ġkey Ġ-> Ċĉ ĉ if ( cancel able ) ĠProgress Manager . check Canceled () Ċĉ ĉ if ( key Predicate ( key )) Ġ{ Ċĉĉ ĉ var Ġvalue : ĠT ? Ġ= Ġnull Ċĉĉ ĉ var ĠdefaultValue : ĠT ? Ġ= Ġnull Ċĉĉ ĉ Stub Index . getInstance (). process Elements ( this . key , Ġkey , Ġproject , Ġscope , ĠT :: class . java ) Ġ{ Ġelement Ġ-> Ċĉĉĉ ĉ if ( has Default ) ĠdefaultValue Ġ= Ġelement Ċĉĉĉ ĉ if ( predicate ( element )) Ġ{ Ċĉĉĉĉ ĉ value Ġ= Ġelement Ċĉĉĉĉ ĉ return @ process Elements Ġfalse Ċĉĉĉ ĉ } Ċĉĉĉ ĉ true Ċĉĉ ĉ } Ċĉĉ ĉ val Ġfinal Value Ġ= Ġvalue Ġ?: ĠdefaultValue Ċĉĉ ĉ if ( final Value Ġ!= Ġnull ) Ġ{ Ċĉĉĉ ĉ result . add ( final Value ) Ċĉĉĉ ĉ if ( maxSize Ġ> Ġ 0 ) Ġ{ Ċĉĉĉĉ ĉ size ++ Ċĉĉĉĉ ĉ if ( size Ġ== ĠmaxSize ) Ġreturn @ process All Keys Ġfalse Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ true Ċ ĉ } Ċ ĉ return Ġresult Ċ } Ċ // endregion