/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 0 ĠJetBrains Ġs . r . o . Ġand ĠKotlin ĠProgramming ĠLanguage Ġcontributors . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe Ġlicense / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . idea . formatter Ċ Ċ import Ġcom . intellij . openapi . util . registry . Registry Ċ import Ġcom . intellij . psi . Psi Comment Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi Error Element Ċ import Ġcom . intellij . psi . Psi WhiteSpace Ċ import Ġcom . intellij . psi . code Style . Code Style Settings Ċ import Ġcom . intellij . psi . tree . Token Set Ċ import Ġcom . intellij . psi . util . Psi Util . getElement Type Ċ import Ġorg . jetbrains . kotlin . config . Language Feature Ċ import Ġorg . jetbrains . kotlin . idea . project . language Version Settings Ċ import Ġorg . jetbrains . kotlin . idea . util .* Ċ import Ġorg . jetbrains . kotlin . lexer . Kt Tokens Ċ import Ġorg . jetbrains . kotlin . psi .* Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . get Prev Sibling Ign oring Whitespace And Comments Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . next Leaf Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . prev Leaf Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . siblings Ċ import Ġorg . jetbrains . kotlin . utils . addTo Std lib . cast Ċ Ċ object ĠTr ailing Comma Helper Ġ{ ĊĠĠĠ Ġfun Ġfind Invalid Com mas ( comma Owner : ĠK t Element ): ĠList < Psi Element > Ġ= Ġcomma Owner . firstChild ĊĠĠĠĠĠĠĠ Ġ? . siblings ( with It self Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ? . filter Ġ{ Ġit . is Comma Ġ} ĊĠĠĠĠĠĠĠ Ġ? . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . prev Leaf ( true )?. is Line Break () Ġ== Ġtrue Ġ|| Ġit . leaf Ign oring Whitespace ( false ) Ġ!= Ġit . leaf Ign oring Whitespace And Comments ( false ) ĊĠĠĠĠĠĠĠ Ġ} ?. toList (). or Empty () ĊĊĠĠĠ Ġfun Ġneed Comma ( ĊĠĠĠĠĠĠĠ Ġcomma Owner : ĠK t Element , ĊĠĠĠĠĠĠĠ Ġsettings : ĠCode Style Settings ?, ĊĠĠĠĠĠĠĠ Ġcheck Existing Trailing Comma : ĠBoolean Ġ= Ġtrue , ĊĠĠĠ Ġ): ĠBoolean Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġcomma Owner Ġis ĠK t When Entry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomma Owner . need Trailing Comma ( settings , Ġcheck Existing Trailing Comma ) ĊĊĠĠĠĠĠĠĠ Ġcomma Owner . parent Ġis ĠK t Function Literal Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomma Owner . parent . cast < Kt Function Literal >(). need Trailing Comma ( settings , Ġcheck Existing Trailing Comma ) ĊĊĠĠĠĠĠĠĠ Ġcomma Owner Ġis ĠK t Dest ruct uring Declaration Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomma Owner . need Trailing Comma ( settings , Ġcheck Existing Trailing Comma ) ĊĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ( check Existing Trailing Comma Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrailing Comma Or Last Element ( comma Owner )?. is Comma Ġ== Ġtrue Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsettings ?. kotlin Custom Settings ?. add Trailing Comma Is Allowed For ( comma Owner ) Ġ!= Ġfalse ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomma Owner . is Mult iline () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtrailing Comma Or Last Element ( comma Owner : ĠK t Element ): ĠPsi Element ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlast Child Ġ= Ġcomma Owner . last Sign ificant Child Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġwith Self Ġ= Ġwhen Ġ( getElement Type ( last Child )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠK t Tokens . COMMA Ġ-> Ġreturn Ġlast Child ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin ĠRIGHT _ BAR RI ERS Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġlast Child . get Prev Sibling Ign oring Whitespace And Comments ( with Self )?. take If Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget ElementType ( it ) Ġ! in ĠLEFT _ BAR RI ERS ĊĠĠĠĠĠĠĠ Ġ} ?. take If IsNot Error () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtrailing Comma Allowed In Module ( source : ĠPsi Element ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ ĠRegistry .` is ` (" kotlin . formatter . allow Trailing Comma In Any Project ", Ġfalse ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource . module ?. language Version Settings ?. supports Feature ( Language Feature . Trailing Com mas ) Ġ== Ġtrue ĊĊĠĠĠ Ġfun Ġelement Before First Element ( comma Owner : ĠK t Element ): ĠPsi Element ? Ġ= Ġwhen Ġ( comma Owner ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠK t Parameter List Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġcomma Owner . parent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent Ġis ĠK t Function Literal ) Ġparent . l Brace Ġelse Ġcomma Owner . left Parent hesis ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠK t When Entry Ġ-> Ġcomma Owner . parent . cast < Kt When Expression >(). open Brace ĊĠĠĠĠĠĠĠ Ġis ĠK t Dest ruct uring Declaration Ġ-> Ġcomma Owner . l Par ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġcomma Owner . firstChild ?. take If IsNot Error () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġelement After Last Element ( comma Owner : ĠK t Element ): ĠPsi Element ? Ġ= Ġwhen Ġ( comma Owner ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠK t Parameter List Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġcomma Owner . parent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent Ġis ĠK t Function Literal ) Ġparent . arrow Ġelse Ġcomma Owner . right Parent hesis ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠK t When Entry Ġ-> Ġcomma Owner . arrow ĊĠĠĠĠĠĠĠ Ġis ĠK t Dest ruct uring Declaration Ġ-> Ġcomma Owner . r Par ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġcomma Owner . last Child ?. take If IsNot Error () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠPsi Element . take If IsNot Error (): ĠPsi Element ? Ġ= Ġtake If Ġ{ Ġit Ġ! is ĠPsi Error Element Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠRIGHT _ BAR RI ERS Ġ= ĠToken Set . create ( Kt Tokens . R BRACK ET , ĠK t Tokens . R PAR , ĠK t Tokens . R BRACE , ĠK t Tokens . GT , ĠK t Tokens . ARROW ) ĊĠĠĠ Ġprivate Ġval ĠLEFT _ BAR RI ERS Ġ= ĠToken Set . create ( Kt Tokens . L BRACK ET , ĠK t Tokens . L PAR , ĠK t Tokens . L BRACE , ĠK t Tokens . LT ) ĊĠĠĠ Ġprivate Ġval ĠPsi Element . last Sign ificant Child : ĠPsi Element ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t When Entry Ġ-> Ġarrow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Dest ruct uring Declaration Ġ-> Ġr Par ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġlast Child ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠPsi Element . leaf Ign oring Whitespace ( forward : ĠBoolean Ġ= Ġtrue , Ġskip Empty Elements : ĠBoolean Ġ= Ġtrue ) Ġ= ĊĠĠĠ Ġleaf ( forward ) Ġ{ Ġ(! skip Empty Elements Ġ|| Ġit . text Length Ġ!= Ġ 0 ) Ġ&& Ġit Ġ! is ĠPsi WhiteSpace Ġ} Ċ Ċ fun ĠPsi Element . leaf Ign oring Whitespace And Comments ( forward : ĠBoolean Ġ= Ġtrue , Ġskip Empty Elements : ĠBoolean Ġ= Ġtrue ) Ġ= ĊĠĠĠ Ġleaf ( forward ) Ġ{ Ġ(! skip Empty Elements Ġ|| Ġit . text Length Ġ!= Ġ 0 ) Ġ&& Ġit Ġ! is ĠPsi WhiteSpace Ġ&& Ġit Ġ! is ĠPsi Comment Ġ} Ċ Ċ fun ĠPsi Element . leaf ( forward : ĠBoolean Ġ= Ġtrue , Ġfilter : Ġ( Psi Element ) Ġ-> ĠBoolean ): ĠPsi Element ? Ġ= ĊĠĠĠ Ġif Ġ( forward ) Ġnext Leaf ( filter ) ĊĠĠĠ Ġelse Ġprev Leaf ( filter ) Ċ Ċ val ĠPsi Element . is Comma : ĠBoolean Ġget () Ġ= Ġget ElementType ( this ) Ġ== ĠK t Tokens . COMMA