/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 7 Ġ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 . editor Ċ Ċ import Ġcom . intellij . application . options . Code Style Ċ import Ġcom . intellij . code Insight . Code Insight Settings Ċ import Ġcom . intellij . code Insight . editor Actions . enter . Enter Handler Delegate . Result Ċ import Ġcom . intellij . code Insight . editor Actions . enter . Enter Handler Delegate Adapter Ċ import Ġcom . intellij . inject ed . editor . Editor Window Ċ import Ġcom . intellij . openapi . action System . DataContext Ċ import Ġcom . intellij . openapi . editor . Document Ċ import Ġcom . intellij . openapi . editor . Editor Ċ import Ġcom . intellij . openapi . editor . action System . Editor Action Handler Ċ import Ġcom . intellij . openapi . editor . ex . Editor Ex Ċ import Ġcom . intellij . openapi . util . Ref Ċ import Ġcom . intellij . openapi . util . Text Range Ċ import Ġcom . intellij . openapi . util . text . StringUtil Ċ import Ġcom . intellij . psi . Psi Document Manager Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi File Ċ import Ġcom . intellij . psi . impl . source . tree . Leaf Psi Element Ċ import Ġorg . jetbrains . kotlin . idea . core . util . to Psi File Ċ import Ġorg . jetbrains . kotlin . idea . refactor ing . host Editor Ċ import Ġorg . jetbrains . kotlin . idea . refactor ing . project Ċ import Ġorg . jetbrains . kotlin . idea . util . application . run Write Action Ċ import Ġorg . jetbrains . kotlin . lexer . Kt Tokens Ċ import Ġorg . jetbrains . kotlin . psi .* Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . get Call Name Expression Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . is Single Quoted Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . parents Ċ import Ġorg . jetbrains . kotlin . utils . addTo Std lib . first Is Instance OrNull Ċ Ċ class ĠKotlin Mult iline String Enter Handler Ġ: ĠEnter Handler Delegate Adapter () Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġwas In Mult iline String : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġwhite Space After Caret : ĠString Ġ= Ġ"" ĊĠĠĠ Ġprivate Ġvar ĠisIn Brace Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġpreprocess Enter ( ĊĠĠĠĠĠĠĠ Ġfile : ĠPsi File , Ġeditor : ĠEditor , Ġcaret Offset : ĠRef < Int >, Ġcaret Advance : ĠRef < Int >, Ġdata Context : ĠData Context , ĊĠĠĠĠĠĠĠ Ġoriginal Handler : ĠEditor Action Handler ? ĊĠĠĠ Ġ): ĠResult Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġcaret Offset . get (). toInt () ĊĠĠĠĠĠĠĠ Ġif Ġ( editor Ġ! is ĠEditor Window ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpreprocess Enter ( file , Ġeditor , Ġoffset , Ġoriginal Handler , Ġdata Context ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġhost Position Ġ= Ġget Host Position ( data Context ) Ġ?: Ġreturn ĠResult . Continue ĊĠĠĠĠĠĠĠ Ġreturn Ġpreprocess Enter ( host Position , Ġoriginal Handler , Ġdata Context ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpreprocess Enter ( host Position : ĠHost Position , Ġoriginal Handler : ĠEditor Action Handler ?, Ġdata Context : ĠData Context ): ĠResult Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( file , Ġeditor , Ġoffset ) Ġ= Ġhost Position ĊĠĠĠĠĠĠĠ Ġreturn Ġpreprocess Enter ( file , Ġeditor , Ġoffset , Ġoriginal Handler , Ġdata Context ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpreprocess Enter ( ĊĠĠĠĠĠĠĠ Ġfile : ĠPsi File , ĊĠĠĠĠĠĠĠ Ġeditor : ĠEditor , ĊĠĠĠĠĠĠĠ Ġoffset : ĠInt , ĊĠĠĠĠĠĠĠ Ġoriginal Handler : ĠEditor Action Handler ?, ĊĠĠĠĠĠĠĠ Ġdata Context : ĠData Context ĊĠĠĠ Ġ): ĠResult Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( file Ġ! is ĠK t File ) Ġreturn ĠResult . Continue ĊĊĠĠĠĠĠĠĠ Ġval Ġdocument Ġ= Ġeditor . document ĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġdocument . text ĊĊĠĠĠĠĠĠĠ Ġif Ġ( offset Ġ== Ġ 0 Ġ|| Ġoffset Ġ>= Ġtext . length ) Ġreturn ĠResult . Continue ĊĊĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġfile . findElement At ( offset ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! in Mult iline String ( element , Ġoffset )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult . Continue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwas In Mult iline String Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhite Space After Caret Ġ= Ġtext . substring ( offset ). take While Ġ{ Ġch Ġ-> Ġch Ġ== Ġ' Ġ' Ġ|| Ġch Ġ== Ġ'\ t ' Ġ} ĊĠĠĠĠĠĠĠ Ġdocument . delete String ( offset , Ġoffset Ġ+ Ġwhite Space After Caret . length ) ĊĊĠĠĠĠĠĠĠ Ġval Ġch 1 Ġ= Ġtext [ offset Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠ Ġval Ġch 2 Ġ= Ġtext [ offset ] ĊĠĠĠĠĠĠĠ ĠisIn Brace Ġ= Ġ( ch 1 Ġ== Ġ'(' Ġ&& Ġch 2 Ġ== Ġ') ') Ġ|| Ġ( ch 1 Ġ== Ġ'{ ' Ġ&& Ġch 2 Ġ== Ġ' }' || Ġ( ch 1 Ġ== Ġ' >' Ġ&& Ġch 2 Ġ== Ġ'< ')) ĊĠĠĠĠĠĠĠ Ġif Ġ(! isIn Brace Ġ|| Ġ! Code Insight Settings . getInstance (). SM ART _ IND ENT _ ON _ ENTER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult . Continue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoriginal Handler ?. execute ( editor , Ġeditor . caret Model . current Caret , Ġdata Context ) ĊĠĠĠĠĠĠĠ Ġreturn ĠResult . Default Force Indent ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpost Process Enter ( file : ĠPsi File , Ġeditor : ĠEditor , Ġdata Context : ĠData Context ): ĠResult Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( editor Ġ! is ĠEditor Window ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpost Process Enter ( file , Ġeditor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġhost Position Ġ= Ġget Host Position ( data Context ) Ġ?: Ġreturn ĠResult . Continue ĊĠĠĠĠĠĠĠ Ġreturn Ġpost Process Enter ( host Position . file , Ġhost Position . editor ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpost Process Enter ( file : ĠPsi File , Ġeditor : ĠEditor ): ĠResult Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( file Ġ! is ĠK t File ) Ġreturn ĠResult . Continue ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! was In Mult iline String ) Ġreturn ĠResult . Continue ĊĠĠĠĠĠĠĠ Ġwas In Mult iline String Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġproject Ġ= Ġfile . project ĊĠĠĠĠĠĠĠ Ġval Ġdocument Ġ= Ġeditor . document ĊĠĠĠĠĠĠĠ ĠPsi Document Manager . getInstance ( project ). commit Document ( document ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcaret Model Ġ= Ġeditor . caret Model ĊĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġcaret Model . offset ĊĊĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġfile . findElement At ( offset ) Ġ?: Ġreturn ĠResult . Continue ĊĠĠĠĠĠĠĠ Ġval Ġliteral Ġ= Ġfind String ( element , Ġoffset ) Ġ?: Ġreturn ĠResult . Continue ĊĊĠĠĠĠĠĠĠ Ġval Ġhas Trim Indent Call In Chain Ġ= Ġhas Trim Indent Call In Chain ( literal ) ĊĠĠĠĠĠĠĠ Ġval Ġmargin Char Ġ= Ġif Ġ( has Trim Indent Call In Chain ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Margin Char From Trim Margin Calls In Chain ( literal ) Ġ?: Ġget Margin Char From Literal ( literal ) ĊĊĠĠĠĠĠĠĠ Ġrun Write Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsettings Ġ= ĠMult iline Settings ( file ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcaret Marker Ġ= Ġdocument . create Range Marker ( offset , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcaret Marker . is G reedy To Right Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġcaret Offset (): ĠInt Ġ= Ġcaret Marker . end Offset ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev LineNumber Ġ= Ġdocument . get LineNumber ( offset ) Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( prev LineNumber Ġ>= Ġ 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Line Ġ= Ġget Line By Number ( prev LineNumber , Ġdocument ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Line Ġ= Ġget Line By Number ( prev LineNumber Ġ+ Ġ 1 , Ġdocument ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Line Ġ= Ġif Ġ( document . line Count Ġ> Ġprev LineNumber Ġ+ Ġ 2 ) Ġget Line By Number ( prev LineNumber Ġ+ Ġ 2 , Ġdocument ) Ġelse Ġ"" ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwas Single Line Ġ= Ġliteral . text . indexOf ("\ n ") Ġ== Ġliteral . text . lastIndexOf ("\ n ") Ġ// ĠOnly Ġone Ġ'\ n ' Ġin Ġthe Ġstring Ġafter Ġinsertion ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlines Ġ= Ġliteral . text . split ("\ n ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġliteral Offset Ġ= Ġliteral . text Range . start Offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( was Single Line Ġ|| Ġ( lines . size Ġ== Ġ 3 Ġ&& ĠisIn Brace )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshould Use Trim Indent Ġ= Ġhas Trim Indent Call In Chain Ġ|| Ġ( margin Char Ġ== Ġnull Ġ&& Ġlines . first (). trim () Ġ== ĠM ULT IL INE _ QUOTE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Margin Char : ĠChar ? Ġ= Ġif Ġ( should Use Trim Indent ) Ġnull Ġelse Ġ( margin Char Ġ?: ĠDEFAULT _ TRIM _ M ARGIN _ CHAR ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Trim Call ( document , Ġliteral , Ġif Ġ( should Use Trim Indent ) Ġnull Ġelse Ġnew Margin Char ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Indent Ġ= Ġsettings . indent Length ( prev Line ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindent Size Ġ= Ġprev Indent Ġ+ Ġsettings . margin Indent ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforce Indent ( caret Offset (), Ġindent Size , Ġnew Margin Char , Ġdocument , Ġsettings ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠisIn Line End Ġ= Ġliteral . text . substring ( offset Ġ- Ġliteral Offset ) Ġ== ĠM ULT IL INE _ QUOTE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isIn Line End ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMove Ġclose Ġquote Ġto Ġnext Ġline ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcaret Marker . is G reedy To Right Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert NewLine ( caret Offset (), Ġprev Indent , Ġdocument , Ġsettings ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcaret Marker . is G reedy To Right Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isIn Brace ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMove Ġclosing Ġbracket Ġunder Ġsame Ġindent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforce Indent ( caret Offset () Ġ+ Ġ 1 , Ġindent Size , Ġnew Margin Char , Ġdocument , Ġsettings ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Prev Line First Ġ= Ġdocument . get LineNumber ( literal Offset ) Ġ== Ġprev LineNumber ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindent In Previous Line Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Prev Line First Ġ-> Ġlines . first (). substring ( MULT IL INE _ QUOTE . length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġprev Line ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. prefix Length Ġ{ Ġit Ġ== Ġ' Ġ' Ġ|| Ġit Ġ== Ġ'\ t ' Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprefix Stri pped Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Prev Line First Ġ-> Ġlines . first (). substring ( indent In Previous Line Ġ+ ĠM ULT IL INE _ QUOTE . length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġprev Line . substring ( indent In Previous Line ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnon Blank Not First Lines Ġ= Ġlines . sub List ( 1 , Ġlines . size ). filter Not Ġ{ Ġit . isBlank () Ġ|| Ġit . trim Start () Ġ== ĠM ULT IL INE _ QUOTE Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmargin Char To Insert Ġ= Ġif Ġ( margin Char Ġ!= Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! prefix Stri pped . startsWith ( margin Char ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnon Blank Not First Lines . isNotEmpty () Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnon Blank Not First Lines . none Ġ{ Ġit . trim Start (). startsWith ( margin Char ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġhave Ġmargin Ġchar Ġbut Ġdecide Ġnot Ġto Ġinsert Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmargin Char ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( margin Char To Insert Ġ== Ġnull Ġ|| Ġ! current Line . trim Start (). startsWith ( margin Char To Insert )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindent Length Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisIn Brace Ġ-> Ġsettings . indent Length ( nextLine ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! is Prev Line First Ġ-> Ġsettings . indent Length ( prev Line ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsettings . indent Length ( prev Line ) Ġ+ Ġsettings . margin Indent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforce Indent ( caret Offset (), Ġindent Length , Ġmargin Char To Insert , Ġdocument , Ġsettings ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġws After Margin Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmargin Char To Insert Ġ!= Ġnull Ġ&& Ġprefix Stri pped . startsWith ( margin Char To Insert ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefix Stri pped . substring ( 1 ). take While Ġ{ Ġit Ġ== Ġ' Ġ' Ġ|| Ġit Ġ== Ġ'\ t ' Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInsert Ġsame Ġindent Ġafter Ġmargin Ġchar Ġthat Ġprevious Ġline Ġhas ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocument . insert String ( caret Offset (), Ġws After Margin ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isIn Brace ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Line Offset Ġ= Ġdocument . getLine Start Offset ( prev LineNumber Ġ+ Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforce Indent ( nextLine Offset , Ġ 0 , Ġnull , Ġdocument , Ġsettings ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocument . insert String ( nextLine Offset , Ġ( margin Char To Insert ?. toString () Ġ?: Ġ"") Ġ+ Ġws After Margin ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforce Indent ( nextLine Offset , Ġindent Length , Ġnull , Ġdocument , Ġsettings ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdocument . insert String ( caret Offset (), Ġwhite Space After Caret ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcaret Model . moveTo Offset ( caret Offset ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcaret Marker . dispose () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠResult . Stop ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ TRIM _ M ARGIN _ CHAR Ġ= Ġ' |' ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTR IM _ IND ENT _ CALL Ġ= Ġ" trim Indent " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTR IM _ M ARGIN _ CALL Ġ= Ġ" trim Margin " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠM ULT IL INE _ QUOTE Ġ= Ġ"\" \"\ "" ĊĊĠĠĠĠĠĠĠ Ġclass ĠMult iline Settings ( file : ĠPsi File ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġkotlin Indent Options Ġ= ĠCode Style . get Indent Options ( file ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġuse Tabs Ġ= Ġkotlin Indent Options . USE _ TAB _ CHARACTER ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġtab Size Ġ= Ġkotlin Indent Options . TAB _ SIZE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġregular Indent Ġ= Ġkotlin Indent Options . IND ENT _ SIZE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmargin Indent Ġ= Ġregular Indent ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġget Smart Spaces ( count : ĠInt ): ĠString Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse Tabs Ġ-> ĠString Util . repeat ("\ t ", Ġcount Ġ/ Ġtab Size ) Ġ+ ĠString Util . repeat (" Ġ", Ġcount Ġ% Ġtab Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠString Util . repeat (" Ġ", Ġcount ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġindent Length ( line : ĠString ): ĠInt Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse Tabs Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtabs Count Ġ= Ġline . prefix Length Ġ{ Ġit Ġ== Ġ'\ t ' Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtabs Count Ġ* Ġtab Size Ġ+ Ġline . substring ( tabs Count ). prefix Length Ġ{ Ġit Ġ== Ġ' Ġ' Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġline . prefix Length Ġ{ Ġit Ġ== Ġ' Ġ' Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġfind String ( element : ĠPsi Element ?, Ġoffset : ĠInt ): ĠK t String Template Expression ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element Ġ! is ĠLeaf Psi Element ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( element . elementType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠK t Tokens . REG ULAR _ STRING _ PART Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOk ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠK t Tokens . CLO SING _ QUOTE , ĠK t Tokens . SHORT _ TEMPLATE _ ENTRY _ START , ĠK t Tokens . LONG _ TEMPLATE _ ENTRY _ START Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element . start Offset Ġ!= Ġoffset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġelement . parents . first Is Instance OrNull () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġin Mult iline String ( element : ĠPsi Element ?, Ġoffset : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ!( find String ( element , Ġoffset )?. is Single Quoted () Ġ?: Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Margin Char From Literal ( str : ĠK t String Template Expression , Ġmargin Char : ĠChar Ġ= ĠDEFAULT _ TRIM _ M ARGIN _ CHAR ): ĠChar ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlines Ġ= Ġstr . text . lines () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lines . size Ġ<= Ġ 2 ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmiddle Non Blank Ġ= Ġlines . sub List ( 1 , Ġlines . size Ġ- Ġ 1 ). filter Ġ{ Ġ! it . isBlank () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( middle Non Blank . isNotEmpty () Ġ&& Ġmiddle Non Blank . all Ġ{ Ġit . trim Start (). startsWith ( margin Char ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmargin Char ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Literal Calls ( str : ĠK t String Template Expression ): ĠSequence < Kt Call Expression > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġprevious : ĠPsi Element Ġ= Ġstr ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstr . parents ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take While Ġ{ Ġparent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent Ġis ĠK t Qualified Expression Ġ&& Ġparent . receiver Expression Ġ== Ġprevious ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Ġ= Ġparent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġqualified Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( qualified Ġas ĠK t Qualified Expression ). selector Expression Ġas ? ĠK t Call Expression ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Margin Char From Trim Margin Calls In Chain ( str : ĠK t String Template Expression ): ĠChar ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġliteral Call Ġ= Ġget Literal Calls ( str ). first OrNull Ġ{ Ġcall Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . get Call Name Expression ()?. text Ġ== ĠTR IM _ M ARGIN _ CALL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Argument Ġ= Ġliteral Call . value Arguments . get OrNull ( 0 ) Ġ?: Ġreturn ĠDEFAULT _ TRIM _ M ARGIN _ CHAR ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargument Expression Ġ= Ġfirst Argument . get Argument Expression () Ġas ? ĠK t String Template Expression Ġ?: Ġreturn ĠDEFAULT _ TRIM _ M ARGIN _ CHAR ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= Ġargument Expression . entries . single OrNull () Ġas ? ĠK t Literal String Template Entry Ġ?: Ġreturn ĠDEFAULT _ TRIM _ M ARGIN _ CHAR ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġentry . text ?. single OrNull () Ġ?: ĠDEFAULT _ TRIM _ M ARGIN _ CHAR ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġhas Trim Indent Call In Chain ( str : ĠK t String Template Expression ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Literal Calls ( str ). any Ġ{ Ġcall Ġ-> Ġcall . get Call Name Expression ()?. text Ġ== ĠTR IM _ IND ENT _ CALL Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Line By Number ( number : ĠInt , Ġdocument : ĠDocument ): ĠString Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdocument . getText ( Text Range ( document . getLine Start Offset ( number ), Ġdocument . getLine End Offset ( number ))) ĊĊĠĠĠĠĠĠĠ Ġfun Ġinsert NewLine ( nl Offset : ĠInt , Ġindent : ĠInt , Ġdocument : ĠDocument , Ġsettings : ĠMult iline Settings ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdocument . insert String ( nl Offset , Ġ"\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġforce Indent ( nl Offset Ġ+ Ġ 1 , Ġindent , Ġnull , Ġdocument , Ġsettings ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġforce Indent ( offset : ĠInt , Ġindent : ĠInt , Ġmargin Char : ĠChar ?, Ġdocument : ĠDocument , Ġsettings : ĠMult iline Settings ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠlineNumber Ġ= Ġdocument . get LineNumber ( offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Start Ġ= Ġdocument . getLine Start Offset ( line Number ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġget Line By Number ( line Number , Ġdocument ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġws Prefix Ġ= Ġline . take While Ġ{ Ġc Ġ-> Ġc Ġ== Ġ' Ġ' Ġ|| Ġc Ġ== Ġ'\ t ' Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdocument . replace String ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline Start , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline Start Ġ+ Ġws Prefix . length , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsettings . get Smart Spaces ( indent ) Ġ+ Ġ( margin Char ?. toString () Ġ?: Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠString . prefix Length ( f : Ġ( Char ) Ġ-> ĠBoolean ) Ġ= Ġtake While ( f ). count () ĊĊĠĠĠĠĠĠĠ Ġfun Ġinsert Trim Call ( document : ĠDocument , Ġliteral : ĠK t String Template Expression , Ġmargin Char : ĠChar ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Trim Indent Call In Chain ( literal ) Ġ|| Ġget Margin Char From Trim Margin Calls In Chain ( literal ) Ġ!= Ġnull ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( literal . parents . any Ġ{ Ġit Ġis ĠK t Annotation Entry Ġ|| Ġ( it Ġas ? ĠK t Property )?. has Modifier ( Kt Tokens . CONST _ KEYWORD ) Ġ== Ġtrue Ġ}) Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( margin Char Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocument . insert String ( literal . text Range . end Offset , Ġ".$ TRIM _ IND ENT _ CALL () ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocument . insert String ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġliteral . text Range . end Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( margin Char Ġ== ĠDEFAULT _ TRIM _ M ARGIN _ CHAR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ".$ TRIM _ M ARGIN _ CALL ()" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ".$ TRIM _ M ARGIN _ CALL (\" $ margin Char \") " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġdata Ġclass ĠHost Position ( val Ġfile : ĠPsi File , Ġval Ġeditor : ĠEditor , Ġval Ġoffset : ĠInt ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Host Position ( data Context : ĠData Context ): ĠHost Position ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġeditor Ġ= Ġdata Context . host Editor Ġas ? ĠEditor Ex Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproject Ġ= Ġdata Context . project ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvirtual File Ġ= Ġeditor . virtual File Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpsi File Ġ= Ġvirtual File . to Psi File ( project ) Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠHost Position ( psi File , Ġeditor , Ġeditor . caret Model . offset ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }