/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 6 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* Ġ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 Ġorg . jetbrains . kotlin . idea . code In liner Ċ Ċ import Ġcom . intellij . openapi . util . Key Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġorg . jetbrains . kotlin . idea . core . copied Ċ import Ġorg . jetbrains . kotlin . name . Fq Name Ċ import Ġorg . jetbrains . kotlin . psi . Kt Element Ċ import Ġorg . jetbrains . kotlin . psi . Kt Expression Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . collect Desc endants OfType Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . forEach Desc endant OfType Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . is Ancestor Ċ Ċ private Ġval ĠPOST _ INSERT ION _ ACTION : ĠKey <( Kt Element ) Ġ-> ĠUnit > Ġ= ĠKey (" POST _ INSERT ION _ ACTION ") Ċ Ċ internal Ġclass ĠMutable Code To Inline ( ĊĠĠĠ Ġvar Ġmain Expression : ĠK t Expression ?, ĊĠĠĠ Ġval Ġstatements Before : ĠMutable List < Kt Expression >, ĊĠĠĠ Ġval Ġfq Names To Import : ĠMutable Collection < Fq Name >, ĊĠĠĠ Ġval Ġalways Keep Main Expression : ĠBoolean Ċ ) Ġ{ ĊĠĠĠ Ġfun Ġ< T Element Ġ: ĠK t Element > Ġadd Post Insertion Action ( element : ĠT Element , Ġaction : Ġ( T Element ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġassert ( element Ġin Ġthis ) ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġelement . put Copy able UserData ( POST _ INSERT ION _ ACTION , Ġaction Ġas Ġ( Kt Element ) Ġ-> ĠUnit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġperform Post Insertion Actions ( elements : ĠCollection < Psi Element >) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( element Ġin Ġelements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . forEach Desc endant OfType < Kt Element > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġit . get Copy able UserData ( POST _ INSERT ION _ ACTION ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( action Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . put Copy able UserData ( POST _ INSERT ION _ ACTION , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction . invoke ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreplace Expression ( old Expression : ĠK t Expression , Ġnew Expression : ĠK t Expression ): ĠK t Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġassert ( old Expression Ġin Ġthis ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( old Expression Ġ== Ġmain Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain Expression Ġ= Ġnew Expression ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnew Expression ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġstatements Before . indexOf ( old Expression ) ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatements Before [ index ] Ġ= Ġnew Expression ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnew Expression ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġold Expression . replace ( new Expression ) Ġas ĠK t Expression ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġexpressions : ĠCollection < Kt Expression > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġstatements Before Ġ+ ĠlistOf NotNull ( main Expression ) ĊĊĠĠĠ Ġoperator Ġfun Ġcontains ( element : ĠPsi Element ): ĠBoolean Ġ= Ġexpressions . any Ġ{ Ġit . is Ancestor ( element ) Ġ} Ċ } Ċ Ċ internal Ġfun ĠCode To Inline . to Mutable (): ĠMutable Code To Inline Ġ{ ĊĠĠĠ Ġreturn ĠMutable Code To Inline ( ĊĠĠĠĠĠĠĠ Ġmain Expression ?. copied (), ĊĠĠĠĠĠĠĠ Ġstatements Before . as Sequence (). map Ġ{ Ġit . copied () Ġ}. to Mutable List (), ĊĠĠĠĠĠĠĠ Ġfq Names To Import . to Mutable Set (), ĊĠĠĠĠĠĠĠ Ġalways Keep Main Expression ĊĠĠĠ Ġ) Ċ } Ċ Ċ internal Ġfun ĠMutable Code To Inline . to Non Mutable (): ĠCode To Inline Ġ{ ĊĠĠĠ Ġreturn ĠCode To Inline ( main Expression , Ġstatements Before , Ġfq Names To Import , Ġalways Keep Main Expression ) Ċ } Ċ Ċ internal Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠPsi Element > ĠMutable Code To Inline . collect Desc endants OfType ( no inline Ġpredicate : Ġ( T ) Ġ-> ĠBoolean Ġ= Ġ{ Ġtrue Ġ}): ĠList < T > Ġ{ ĊĠĠĠ Ġreturn Ġexpressions . flatMap Ġ{ Ġit . collect Desc endants OfType ({ Ġtrue Ġ}, Ġpredicate ) Ġ} Ċ } Ċ Ċ internal Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠPsi Element > ĠMutable Code To Inline . forEach Desc endant OfType ( no inline Ġaction : Ġ( T ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġexpressions . forEach Ġ{ Ġit . forEach Desc endant OfType ( action ) Ġ} Ċ } ĊĊ