/* Ċ Ġ* ĠMinecraft ĠDev Ġfor ĠIntelliJ Ċ Ġ* Ċ Ġ* Ġhttps :// minecraft dev . org Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 7 Ġm inecraft - dev Ċ Ġ* Ċ Ġ* ĠMIT ĠLicense Ċ Ġ*/ Ċ Ċ package Ġcom . de mon wav . mc dev . platform . mixin . fold ing Ċ Ċ import Ġcom . de mon wav . mc dev . platform . mixin . Mixin Module Type Ċ import Ġcom . de mon wav . mc dev . platform . mixin . reference . target . Target Reference Ċ import Ġcom . de mon wav . mc dev . platform . mixin . util . Mixin Constants . Annotations . AT Ċ import Ġcom . intellij . lang . AST Node Ċ import Ġcom . intellij . lang . fold ing . Custom Fold ing Builder Ċ import Ġcom . intellij . lang . fold ing . Fold ing Descriptor Ċ import Ġcom . intellij . navigation . Navigation Item Ċ import Ġcom . intellij . openapi . editor . Document Ċ import Ġcom . intellij . openapi . util . Text Range Ċ import Ġcom . intellij . psi . Common ClassNames Ċ import Ġcom . intellij . psi . Java Recursive Element Walk ing Visitor Ċ import Ġcom . intellij . psi . Psi Annotation Ċ import Ġcom . intellij . psi . Psi Annotation Member Value Ċ import Ġcom . intellij . psi . Psi ClassType Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi Java File Ċ import Ġcom . intellij . psi . Psi Method Ċ import Ġcom . intellij . psi . Psi Subst it utor Ċ import Ġcom . intellij . psi . Psi Type Cast Expression Ċ import Ġcom . intellij . psi . Psi Variable Ċ import Ġcom . intellij . psi . impl . source . tree . Child Role Ċ import Ġcom . intellij . psi . impl . source . tree . Composite Element Ċ import Ġcom . intellij . psi . util . Psi Format Util Ċ import Ġcom . intellij . psi . util . Psi Format Util Base Ċ import Ġcom . intellij . psi . util . Psi Format Util Base . SHOW _ CONTAIN ING _ CLASS Ċ Ċ class ĠM ixin Fold ing Builder Ġ: ĠCustom Fold ing Builder () Ġ{ ĊĊĠĠĠ Ġ// ĠI 'm Ġnot Ġd umb ĊĠĠĠ Ġoverride Ġfun Ġis D umb Aware () Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġis Region Collapsed ByDefault ( node : ĠAST Node ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsettings Ġ= ĠM ixin Fold ing Settings . instance . state ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( node . psi ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPsi Type Cast Expression Ġ-> Ġsettings . fold Object Cast s ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPsi Annotation Member Value Ġ-> Ġsettings . fold Target Descriptors ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġformat Element ( element : ĠPsi Element ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPsi Method Ġ-> ĠPsi Format Util . format Method ( element , ĠPsi Subst it utor . EMPTY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPsi Format Util Base . SHOW _ NAME Ġor ĠPsi Format Util Base . SHOW _ PARAMETERS Ġor ĠSHOW _ CONTAIN ING _ CLASS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPsi Format Util Base . SHOW _ TYPE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPsi Variable Ġ-> ĠPsi Format Util . format Variable ( element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPsi Format Util Base . SHOW _ NAME Ġor ĠSHOW _ CONTAIN ING _ CLASS , ĠPsi Subst it utor . EMPTY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNavigation Item Ġ-> Ġelement . presentation ?. present able Text ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Language Placeholder Text ( node : ĠAST Node , Ġrange : ĠText Range ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġnode . psi ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPsi Type Cast Expression Ġ-> Ġ" (${ element . cast Type ?. text Ġ?: Ġreturn Ġnode . text })" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPsi Annotation Member Value Ġ-> ĠTarget Reference . resolve Target ( element )?. let Ġ{ Ġformat Element ( it ) Ġ} Ġ?: Ġnode . text ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnode . text ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbuild Language Fold Regions ( descriptors : ĠMutable List < Fold ing Descriptor >, Ġroot : ĠPsi Element , Ġdocument : ĠDocument , Ġquick : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( root Ġ! is ĠPsi Java File Ġ|| Ġ! Mixin Module Type . isIn Module ( root )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġroot . accept ( Visitor ( descriptors )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠVisitor ( private Ġval Ġdescriptors : ĠMutable List < Fold ing Descriptor >) Ġ: ĠJava Recursive Element Walk ing Visitor () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġsettings Ġ= ĠM ixin Fold ing Settings . instance . state ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Annotation ( annotation : ĠPsi Annotation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Annotation ( annotation ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! settings . fold Target Descriptors ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġqualified Name Ġ= Ġannotation . qualified Name Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( qualified Name Ġ!= ĠAT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġannotation . find Declared AttributeValue (" target ") Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptors . add ( Fold ing Descriptor ( target , Ġtarget . text Range )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Type Cast Expression ( expression : ĠPsi Type Cast Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Type Cast Expression ( expression ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! settings . fold Object Cast s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinner Cast Ġ= Ġexpression . operand Ġas ? ĠPsi Type Cast Expression Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( inner Cast . type Ġas ? ĠPsi ClassType )?. resolve ()?. qualified Name Ġ== ĠCommon ClassNames . JAVA _ LANG _ OBJECT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFold Ġthe Ġtwo Ġcast s ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Ġ= Ġ( expression Ġas ? ĠComposite Element )?. find Child By Role ( Child Role . LP AREN TH ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Ġ= Ġ( inner Cast Ġas ? ĠComposite Element )?. find Child By Role ( Child Role . RP AREN TH ) Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptors . add ( Fold ing Descriptor ( expression , ĠText Range ( start . start Offset , Ġend . start Offset Ġ+ Ġend . text Length ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ Ċ } Ċ