package Ġcom . thi ak il . intellij . names Ċ Ċ 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 . openapi . util . Key Ċ import Ġcom . intellij . psi .* Ċ import Ġcom . intellij . psi . util . Psi Tree Util ĊĊ Ċ /** Ċ Ġ* ĠCreated Ġby ĠTh i ak il Ġon Ġ 1 1 / 0 1 / 2 0 2 0 . Ċ Ġ*/ Ċ class ĠM cp Fold ing Builder : ĠFold ing Builder Ex () Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Key Ġ= ĠKey < Member Type >(" custom _ m cp _ name _ type ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġget Placeholder Text ( node : ĠAST Node ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( node . psi . getUser Data ( type Key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMember Type . METHOD Ġ-> ĠCustom Names List . instance . getMethod ( node . psi . text ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMember Type . FIELD Ġ-> ĠCustom Names List . instance . getField ( node . psi . text ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMember Type . PARAM Ġ-> ĠCustom Names List . instance . getParam ( node . psi . text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ?. m cp Name Ġ?: Ġnode . psi . text ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbuild Fold Regions ( root : ĠPsi Element , Ġdocument : ĠDocument , Ġquick : ĠBoolean ): ĠArray < Fold ing Descriptor > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmutable ListOf < Fold ing Descriptor >(). also Ġ{ Ġregions Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroup Ġ= ĠFold ing Group . new Group (" custom Ġm cp Ġnames ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcustom Names List Ġ= ĠCustom Names List . instance ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Regions ForType ( root , Ġregions , Ġgroup , Ġ" func ", ĠMember Type . METHOD , ĠPsi Method :: class . java , Ġcustom Names List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// add Regions ForType ( root , Ġregions , Ġgroup , Ġ" field ", ĠMember Type . FIELD , ĠPsi Field :: class . java , Ġcustom Names List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// add Regions ForType ( root , Ġregions , Ġgroup , Ġ" p ", ĠMember Type . PARAM , ĠPsi Parameter :: class . java , Ġcustom Names List ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPsi Tree Util . find Children OfType ( root , ĠPsi Identifier :: class . java ). forEach Ġ{ Ġidentifier Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( identifier . text ?. substring Before ("_ ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" method " Ġ-> ĠMember Type . METHOD ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" field " Ġ-> ĠMember Type . FIELD ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" p " Ġ-> ĠMember Type . PARAM ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. let Ġ{ Ġmember Type Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregions . add ( Fold ing Descriptor ( identifier . node , Ġidentifier . text Range , Ġgroup , Ġset Of ( custom Names List ), Ġtrue , Ġnull , Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidentifier . put UserData ( type Key , Ġmember Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPsi Tree Util . find Children OfType ( root , ĠPsi MethodCall Expression :: class . java ). forEach Ġ{ Ġcall Expression Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Expression . method Expression . reference Name Element ?. let Ġ{ Ġname El Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( name El . text . startsWith (" func _ ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregions . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFold ing Descriptor ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname El . node , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname El . text Range , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Of ( custom Names List ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname El . put UserData ( type Key , ĠMember Type . METHOD ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPsi Tree Util . find Children OfType ( root , ĠPsi Method Reference Expression :: class . java ). forEach Ġ{ Ġreference Expression Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreference Expression . reference Name Element ?. let Ġ{ Ġname El Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( name El . text . startsWith (" func _ ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregions . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFold ing Descriptor ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname El . node , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname El . text Range , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Of ( custom Names List ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname El . put UserData ( type Key , ĠMember Type . METHOD ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. to Typed Array () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Regions ForType ( ĊĠĠĠĠĠĠĠ Ġroot : ĠPsi Element , ĊĠĠĠĠĠĠĠ Ġregions : ĠMutable List < Fold ing Descriptor >, ĊĠĠĠĠĠĠĠ Ġgroup : ĠFold ing Group , ĊĠĠĠĠĠĠĠ Ġprefix : ĠString , ĊĠĠĠĠĠĠĠ Ġmember Type : ĠMember Type , ĊĠĠĠĠĠĠĠ Ġelement Class : ĠClass < out ĠPsi Name Identifier Owner >, ĊĠĠĠĠĠĠĠ Ġcustom Names List : ĠCustom Names List ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠPsi Tree Util . find Children OfType ( root , Ġelement Class ). forEach Ġ{ Ġmethod Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( method . name ?. startsWith ("${ prefix }_ ") Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod . name Identifier ?. let Ġ{ Ġidentifier Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregions . add ( Fold ing Descriptor ( identifier . node , Ġidentifier . text Range , Ġgroup , Ġset Of ( custom Names List ), Ġtrue , Ġnull , Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidentifier . put UserData ( type Key , Ġmember Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Collapsed ByDefault ( node : ĠAST Node ): ĠBoolean Ġ= Ġtrue Ċ Ċ } Ċ