package Ġidea . sn akes kin . ide . fold ing Ċ Ċ 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 . util . Text Range Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi WhiteSpace Ċ import Ġcom . intellij . psi . util . Psi Tree Util Ċ import Ġidea . sn akes kin . lang . psi .* Ċ Ċ class ĠS s Fold ing Builder Ġ: ĠFold ing Builder Ex () Ġ{ Ċ ĉ override Ġfun Ġget Placeholder Text ( node : ĠAST Node ) Ġ= Ġ"{ Ġ... Ġ}" ĊĊ ĉ override Ġfun Ġbuild Fold Regions ( root : ĠPsi Element , Ġdocument : ĠDocument , Ġquick : ĠBoolean ): ĠArray < Fold ing Descriptor > Ġ{ Ċĉ ĉ val Ġdescriptors Ġ= Ġmutable ListOf < Fold ing Descriptor >() ĊĊĉ ĉ fun Ġfind Block Body ( element : ĠPsi Element ): ĠInt Ġ{ Ċĉĉ ĉ when Ġ( element ) Ġ{ Ċĉĉĉ ĉ is ĠS s Block Body , Ġis ĠS s Switch Block Body , Ġis ĠS s Loop Block Body , Ġis ĠS s Call Block Body Ġ-> Ġ{ Ċĉĉĉĉ ĉ val Ġrange Start Ġ= ĠPsi Tree Util . skip Wh ites p aces Backward ( element )?. text Range ?. start Offset Ċĉĉĉĉĉ ĉ ?: Ġelement . text Range . start Offset ĊĊĉĉĉĉ ĉ var Ġrange End Ġ= Ġrange Start Ċĉĉĉĉ ĉ for Ġ( child Ġin Ġelement . children ) Ġ{ Ċĉĉĉĉĉ ĉ val Ġend Ġ= Ġfind Block Body ( child ) Ċĉĉĉĉĉ ĉ range End Ġ= Ġif Ġ( end Ġ> Ġrange End ) Ġend Ġelse Ġrange End Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ val Ġtext Range Ġ= ĠText Range ( range Start , Ġrange End ) Ċĉĉĉĉ ĉ descriptors . add ( Fold ing Descriptor ( element , Ġtext Range )) Ċĉĉĉĉ ĉ return Ġrange End Ċĉĉĉ ĉ } ĊĊĉĉĉ ĉ else Ġ-> Ġ{ Ċĉĉĉĉ ĉ if Ġ( element . children . isEmpty ()) Ġ{ Ċĉĉĉĉĉ ĉ return Ġelement . text Range . end Offset Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ var Ġlast Ġ= Ġelement . last Child Ċĉĉĉĉ ĉ if Ġ( last Ġis ĠPsi WhiteSpace ) Ġ{ Ċĉĉĉĉĉ ĉ last Ġ= ĠPsi Tree Util . skip Wh ites p aces Backward ( last ) Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ if Ġ( last Ġ== Ġnull ) Ġ{ Ċĉĉĉĉĉ ĉ // Ġelement Ġhas Ġonly Ġone Ġchild Ġ- Ġwhite Ġspace . ĠDon 't Ġtake Ġit Ġin Ġaccount Ċĉĉĉĉĉ ĉ return Ġelement . text Range . start Offset Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ if Ġ( last Ġis ĠS s Statement End ) Ġ{ Ċĉĉĉĉĉ ĉ return Ġlast . text Range . start Offset Ċĉĉĉĉ ĉ } ĊĊĉĉĉĉ ĉ var Ġoffset End Ġ= Ġelement . text Range . start Offset Ċĉĉĉĉ ĉ for Ġ( child Ġin Ġelement . children ) Ġ{ Ċĉĉĉĉĉ ĉ val Ġend Ġ= Ġfind Block Body ( child ) Ċĉĉĉĉĉ ĉ offset End Ġ= Ġif Ġ( end Ġ> Ġoffset End ) Ġend Ġelse Ġoffset End Ċĉĉĉĉ ĉ } ĊĊĉĉĉĉ ĉ return Ġoffset End Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ find Block Body ( root ) Ċĉ ĉ return Ġdescriptors . to Typed Array () Ċ ĉ } ĊĊ ĉ override Ġfun Ġis Collapsed ByDefault ( node : ĠAST Node ) Ġ= Ġfalse Ċ } Ċ