package Ġnet . a quad c . mike . plugin . kotlin Ċ Ċ import Ġcom . intellij . application . options . Code Style Ċ import Ġcom . intellij . lang . AST Node Ċ import Ġcom . intellij . lang . fold ing . Fold ing Builder Ex Ċ import Ġcom . intellij . lang . fold ing . Fold ing Descriptor Ċ import Ġcom . intellij . openapi . editor . Document Ċ import Ġcom . intellij . openapi . editor . Fold ing Group Ċ import Ġcom . intellij . psi . Psi Comment Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi WhiteSpace Ċ import Ġcom . intellij . refactor ing . suggest ed . end Offset Ċ import Ġcom . intellij . refactor ing . suggest ed . start Offset Ċ import Ġcom . intellij . util . Smart List Ċ import Ġg nu . tro ve . T Int ArrayList Ċ import Ġnet . a quad c . mike . plugin . not Ċ import Ġorg . jetbrains . kotlin . idea . Kotlin FileType Ċ import Ġorg . jetbrains . kotlin . idea . struct ur alse arch . visitor . Kotlin Recursive Element Walk ing Visitor Ċ import Ġorg . jetbrains . kotlin . lexer . Kt Tokens Ċ import Ġorg . jetbrains . kotlin . nj 2 k . post Processing . resolve Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . siblings Ċ import Ġorg . jetbrains . kotlin . psi . Kt File Ċ import Ġorg . jetbrains . kotlin . psi . Kt Property Ċ import Ġorg . jetbrains . kotlin . psi . Kt Property Accessor Ċ import Ġorg . jetbrains . kotlin . psi . Kt Reference Expression Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . visibility Modifier Ċ import Ġkotlin . math . min Ċ Ċ class ĠBack ing Property Fold ing Ġ: ĠFold ing Builder Ex () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġbuild Fold Regions ( root : ĠPsi Element , Ġdocument : ĠDocument , Ġquick : ĠBoolean ): ĠArray < Fold ing Descriptor > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( quick Ġ|| Ġroot Ġ! is ĠK t File ) Ġreturn ĠFold ing Descriptor . EMPTY ĊĊĠĠĠĠĠĠĠ Ġval Ġregions Ġ= ĠSmart List < Fold ing Descriptor >() ĊĠĠĠĠĠĠĠ Ġroot . accept ( object Ġ: ĠKotlin Recursive Element Walk ing Visitor () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Property ( property : ĠK t Property ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprop Name Ġ= Ġproperty . take If Ġ{ Ġ! it . is Local Ġ&& Ġit . is Public Ġ&& Ġit . initializer Ġ== Ġnull Ġ} ?. name Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbacking Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( property . getter ?. body Expression Ġas ? ĠK t Reference Expression )?. resolve () Ġas ? ĠK t Property ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . take If Ġ{ Ġit . has Modifier ( Kt Tokens . PRIVATE _ KEYWORD ) Ġ&& Ġit . parent Ġ== Ġproperty . parent Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbacking Name Ġ= Ġbacking . name ?. take If Ġ{ Ġit . contains ( prop Name , Ġignore Case Ġ= Ġtrue ) Ġ} Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpublic Type Ġ= Ġproperty . type Reference Ġ?: Ġproperty . getter ?. returnType Reference Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpreceding Ġ= Ġproperty . siblings ( false , Ġfalse ). filter ( IS _ CODE ). first OrNull (). take If Ġ{ Ġit Ġ== Ġbacking Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfollowing Ġ= Ġproperty . siblings ( true , Ġfalse ). filter ( IS _ CODE ). first OrNull (). take If Ġ{ Ġit Ġ== Ġbacking Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pre ced ing Ġ== Ġnull Ġ&& Ġfollowing Ġ== Ġnull ) Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolon Private Type Ġ= Ġ( back ing . type Reference Ġ?: Ġbacking . getter ?. returnType Reference ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . text ?. let Ġ{ Ġ": Ġ$ it " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprop Setter Visibility Ġ= Ġproperty . setter ?. visibility Modifier ()?. text ?. plus (' Ġ') Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregions . add Fold ings ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreceding Ġ?: Ġproperty , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfollowing Ġ?: Ġproperty , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( property . val Or Var Keyword . text ). append (' Ġ'). append ( prop Name ). append ( colon Private Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbacking . initializer ?. let Ġ{ Ġappend (" Ġ= Ġ"). append ( it . text ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" get : Ġ" Ġ+ Ġpublic Type . text , Ġ// Ġgetter Ġbody Ġis Ġknown Ġto Ġbe Ġa Ġreference Ġto Ġbacking Ġproperty ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty . take If Ġ{ Ġit . is Var Ġ} ?. let Ġ{ Ġ"${ prop Setter Visibility } set ${ property . setter Param ( true )} ${ property . setter . body () }" Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" private Ġ$ back ing Name . get ${ back ing . getter . body (). let Ġ{ Ġif Ġ( it . isBlank ()) Ġ"" Ġelse Ġ" () $ it " Ġ}} ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbacking . take If Ġ{ Ġit . is Var Ġ} ?. let Ġ{ Ġ" private Ġ$ back ing Name . set ${ back ing . setter Param ( false )} ${ back ing . setter . body () }" Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun ĠK t Property . setter Param ( with Type : ĠBoolean ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsetter ?. parameter ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġit . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġ( it . type Reference Ġ?: Ġtype Reference )?. text ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ== Ġnull Ġ&& Ġtype Ġ== Ġnull Ġ-> Ġ" ()" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ== Ġnull Ġ|| Ġ! with Type Ġ-> Ġ" ($ name )" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ" (${ name Ġ?: Ġ"" }: Ġ$ type )" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun ĠK t Property Accessor ?. body () Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis ?. body Block Expression ?. let Ġ{ Ġ" Ġ${ it . text }" Ġ} Ġ?: Ġthis ?. body Expression ?. let Ġ{ Ġ" Ġ= Ġ${ it . text }" Ġ} Ġ?: Ġ"" ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval ĠK t Property . is Public : ĠBoolean ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġvisibility Modifier () Ġ== Ġnull Ġ|| Ġhas Modifier ( Kt Tokens . PUBLIC _ KEYWORD ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval ĠIS _ SPACE : Ġ( Psi Element ) Ġ-> ĠBoolean Ġ= Ġ{ Ġit Ġis ĠPsi WhiteSpace Ġ|| Ġit Ġis ĠPsi Comment Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval ĠIS _ CODE : Ġ( Psi Element ) Ġ-> ĠBoolean Ġ= Ġ! IS _ SPACE ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun ĠSmart List < Fold ing Descriptor >. add Fold ings ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Element : ĠPsi Element , Ġend Element : ĠPsi Element , Ġvar arg Ġfold ings : ĠString ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Starts Ġ= ĠT Int ArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline Starts . add ( start Element . start Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( start Element . siblings ( forward Ġ= Ġtrue , Ġwith It self Ġ= Ġtrue ). take While Ġ{ Ġit Ġ!= Ġend Element Ġ} Ġ+ Ġend Element ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . text Contains ('\ n ')) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġit . text ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi of Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( text . indexOf ('\ n ', ĠstartIndex Ġ= Ġi of ). also Ġ{ Ġi of Ġ= Ġit Ġ} Ġ>= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline Starts . add ( it . start Offset Ġ+ Ġ++ io f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Fold ings Ġ= Ġfold ings . filter NotNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindent Ġ= Ġ" Ġ". repeat ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( start Element . prev Sibling ?. text ?. let Ġ{ Ġit . length Ġ- Ġit . lastIndexOf ('\ n ') Ġ- Ġ 1 Ġ} Ġ?: Ġ 0 ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCode Style . get Settings ( start Element . containing File ). get Indent Size ( Kotlin FileType . INSTANCE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroup Ġ= ĠFold ing Group . new Group (" back ing Property ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Ġ= Ġmin ( actual Fold ings . size , Ġline Starts . size ()) Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( last Ġ+ Ġ 1 ) Ġ{ Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhas Next Ġ= Ġi Ġ!= Ġlast ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġif Ġ( hasNext ) Ġactual Fold ings [ i ] Ġelse Ġactual Fold ings . drop ( i ). join ToString ("; Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline End Ġ= Ġif Ġ( hasNext ) Ġline Starts [ i Ġ+ Ġ 1 ] Ġ- Ġ 1 Ġelse Ġend Element . end Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( Fold ing Descriptor ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline Starts [ i ], Ġline End , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup , Ġif Ġ( i Ġ== Ġ 0 ) Ġtext Ġelse Ġindent Ġ+ Ġtext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( regions . isEmpty ()) ĠFold ing Descriptor . EMPTY Ġelse Ġregions . to Typed Array () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Placeholder Text ( node : ĠAST Node ): ĠString ? Ġ= Ġnull ĊĠĠĠ Ġoverride Ġfun Ġis Collapsed ByDefault ( node : ĠAST Node ): ĠBoolean Ġ= Ġtrue Ċ } Ċ