// ĠCopyright Ġ 2 0 0 0 - 2 0 2 1 ĠJetBrains Ġs . r . o . Ġand Ġcontributors . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ċ package Ġorg . jetbrains . kotlin . idea . debugger . coroutine . view Ċ Ċ import Ġcom . intellij . debugger . engine . Suspend Context Impl Ċ import Ġcom . intellij . ide . Common Actions Manager Ċ import Ġcom . intellij . openapi . Disposable Ċ import Ġcom . intellij . openapi . action System . Action Manager Ċ import Ġcom . intellij . openapi . action System . Action Places Ċ import Ġcom . intellij . openapi . action System . Default Action Group Ċ import Ġcom . intellij . openapi . action System . impl . Action Toolbar Impl Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . ui . ComboBox Ċ import Ġcom . intellij . ui . Caption Panel Ċ import Ġcom . intellij . ui . Combo box Speed Search Ċ import Ġcom . intellij . ui . border . Custom Line Border Ċ import Ġcom . intellij . ui . components . panels . Wrapper Ċ import Ġcom . intellij . util . Single Alarm Ċ import Ġcom . intellij . x debugger . X Debug Session Ċ import Ġcom . intellij . x debugger . frame .* Ċ import Ġcom . intellij . x debugger . impl . actions . X Debugger Actions Ċ import Ġcom . intellij . x debugger . impl . ui . Debugger UI Util Ċ import Ġcom . intellij . x debugger . impl . ui . tree . X Debugger Tree Panel Ċ import Ġcom . intellij . x debugger . impl . ui . tree . X Debugger Tree Rest orer Ċ import Ġcom . intellij . x debugger . impl . ui . tree . X Debugger Tree State Ċ import Ġcom . intellij . x debugger . impl . ui . tree . nodes . X Value Container Node Ċ import Ġcom . sun . j di . request . Event Request Ċ import Ġorg . jetbrains . kotlin . idea . debugger . coroutine . Coroutine Debugger Content Info Ċ import Ġorg . jetbrains . kotlin . idea . debugger . coroutine . Coroutine Debugger Content Info . Companion . X COR OUT INE _ POP UP _ ACTION _ GROUP Ċ import Ġorg . jetbrains . kotlin . idea . debugger . coroutine . Kotlin Debugger Cor outines Bundle Ċ import Ġorg . jetbrains . kotlin . idea . debugger . coroutine . Version ed Implementation Provider Ċ import Ġorg . jetbrains . kotlin . idea . debugger . coroutine . data . Coroutine Info Data Ċ import Ġorg . jetbrains . kotlin . idea . debugger . coroutine . data . Coroutine Stack Frame Item Ċ import Ġorg . jetbrains . kotlin . idea . debugger . coroutine . data . Creation Coroutine Stack Frame Item Ċ import Ġorg . jetbrains . kotlin . idea . debugger . coroutine . proxy . Coroutine Debug Prob es Proxy Ċ import Ġorg . jetbrains . kotlin . idea . debugger . coroutine . proxy . Manager Thread Executor Ċ import Ġorg . jetbrains . kotlin . idea . debugger . coroutine . util .* Ċ import Ġjava . awt . Border Layout Ċ import Ġjavax . swing . JPanel ĊĊ Ċ class ĠX Coroutine View ( val Ġproject : ĠProject , Ġval Ġsession : ĠX Debug Session ) Ġ: ĊĠĠĠ ĠDis posable , ĠX Debug Session Listener Provider , ĠCreate Content Params Provider Ġ{ ĊĠĠĠ Ġval Ġlog Ġby Ġlogger ĊĠĠĠ Ġprivate Ġval Ġversion ed Implementation Provider Ġ= ĠVersion ed Implementation Provider () ĊĊĠĠĠ Ġprivate Ġval Ġmain Panel Ġ= ĠJPanel ( Border Layout ()) ĊĠĠĠ Ġval Ġsome Combo box Ġ= ĠCombo Box < String >() ĊĠĠĠ Ġval Ġpanel Ġ= ĠX Debugger Tree Panel ( project , Ġsession . debug Process . editor s Provider , Ġthis , Ġnull , ĠX COR OUT INE _ POP UP _ ACTION _ GROUP , Ġnull ) ĊĠĠĠ Ġval Ġalarm Ġ= ĠSingle Alarm ({ Ġreset Root () Ġ}, ĠVIEW _ CLEAR _ DELAY , Ġthis ) ĊĠĠĠ Ġval Ġrenderer Ġ= ĠSimple Colo red Text Icon Presentation Renderer () ĊĠĠĠ Ġval Ġmanager Thread Executor Ġ= ĠManager Thread Executor ( session ) ĊĠĠĠ Ġprivate Ġvar Ġtree State : ĠX Debugger Tree State ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġrest orer : ĠX Debugger Tree Rest orer ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġselected Node Listener : ĠX Debugger Tree Selected Node Listener ? Ġ= Ġnull ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠVIEW _ CLEAR _ DELAY Ġ= Ġ 1 0 0 Ġ// ms ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġsome Combo box . renderer Ġ= Ġversion ed Implementation Provider . combo box List Cell Renderer () ĊĠĠĠĠĠĠĠ Ġsome Combo box . addItem ( null ) ĊĠĠĠĠĠĠĠ Ġval Ġmy Toolbar Ġ= Ġcreate Toolbar () ĊĠĠĠĠĠĠĠ Ġval Ġmy Threads Panel Ġ= ĠWrapper () ĊĠĠĠĠĠĠĠ Ġmy Threads Panel . border Ġ= ĠCustom Line Border ( Caption Panel . CNT _ ACTIVE _ BORDER _ COLOR , Ġ 0 , Ġ 0 , Ġ 1 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġmy Threads Panel . add ( my Toolbar ?. component , ĠBorderLayout . EAST ) ĊĠĠĠĠĠĠĠ Ġmy Threads Panel . add ( some Combo box , ĠBorderLayout . CENTER ) ĊĠĠĠĠĠĠĠ Ġmain Panel . add ( panel . main Panel , ĠBorderLayout . CENTER ) ĊĠĠĠĠĠĠĠ Ġselected Node Listener Ġ= ĠX Debugger Tree Selected Node Listener ( session , Ġpanel . tree ) ĊĠĠĠĠĠĠĠ Ġselected Node Listener ?. install On () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Toolbar (): ĠAction Toolbar Impl ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġframes Group Ġ= ĠDefault Action Group () ĊĠĠĠĠĠĠĠ Ġval Ġactions Manager Ġ= ĠCommon Actions Manager . getInstance () ĊĠĠĠĠĠĠĠ Ġframes Group ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addAll ( Action Manager . getInstance (). getAction ( X Debugger Actions . FR AMES _ TOP _ TOOL BAR _ GROUP )) ĊĠĠĠĠĠĠĠ Ġval Ġtoolbar Ġ= ĠAction Manager . getInstance (). create Action Toolbar ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAction Places . DEBUG GER _ TOOL BAR , Ġframes Group , Ġtrue ĊĠĠĠĠĠĠĠ Ġ) Ġas ĠAction Toolbar Impl ĊĠĠĠĠĠĠĠ Ġtoolbar . set Reserve Place Auto Popup Icon ( false ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtoolbar ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave State () Ġ{ ĊĠĠĠĠĠĠĠ ĠDebugger UI Util . invoke Later Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( panel . tree . root Ġ! is ĠEmpty Node ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtree State Ġ= ĠX Debugger Tree State . save State ( panel . tree ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset Root () Ġ{ ĊĠĠĠĠĠĠĠ ĠDebugger UI Util . invoke Later Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpanel . tree . set Root ( Empty Node (), Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrenew Root ( suspend Context : ĠS uspend Context Impl ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpanel . tree . set Root ( X Cor outines Root Node ( suspend Context ), Ġfalse ) ĊĠĠĠĠĠĠĠ Ġif Ġ( tree State Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrest orer ?. dispose () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrest orer Ġ= Ġtree State ?. restore State ( panel . tree ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdispose () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( rest orer Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrest orer ?. dispose () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrest orer Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdebug Session Listener ( session : ĠX Debug Session ) Ġ= ĊĠĠĠĠĠĠĠ ĠCor outine View Debug Session Listener ( session , Ġthis ) ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Content Params (): ĠCreate Content Params Ġ= ĊĠĠĠĠĠĠĠ ĠCreate Content Params ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCor outine Debugger Content Info . X COR OUT INE _ THREADS _ CONTENT , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain Panel , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Debugger Cor outines Bundle . message (" coroutine . view . title "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpanel . tree ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ Suppress (" Red undant Inner Class Modifier ") ĊĠĠĠ Ġinner Ġclass ĠEmpty Node Ġ: ĠX Value Container Node < X Value Container >( panel . tree , Ġnull , Ġtrue , Ġobject Ġ: ĠX Value Container () Ġ{}) ĊĊĠĠĠ Ġinner Ġclass ĠX Cor outines Root Node ( suspend Context : ĠS uspend Context Impl ) Ġ: ĊĠĠĠĠĠĠĠ ĠX Value Container Node < Coroutine Top Group Container >( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpanel . tree , Ġnull , Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCor outine Top Group Container ( suspend Context ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġinner Ġclass ĠCor outine Top Group Container ( val Ġsuspend Context : ĠS uspend Context Impl ) Ġ: ĠX Value Container () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcompute Children ( node : ĠX Composite Node ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchildren Ġ= ĠX Value Children List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchildren . add ( Coroutine Group Container ( suspend Context )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . add Children ( children , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠCor outine Group Container ( val Ġsuspend Context : ĠS uspend Context Impl ) Ġ: ĠRenderer Container ( renderer . render Group ( Kotlin Debugger Cor outines Bundle . message (" coroutine . view . node . root "))) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcompute Children ( node : ĠX Composite Node ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( suspend Context . suspend Policy Ġ== ĠEvent Request . SUS PEND _ ALL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmanager Thread Executor . on ( suspend Context ). invoke Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdebug Prob es Proxy Ġ= ĠCor outine Debug Prob es Proxy ( suspend Context ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġempty Dispatcher Name Ġ= ĠKotlin Debugger Cor outines Bundle . message (" coroutine . view . dispatcher . empty ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcoroutine Cache Ġ= Ġdebug Prob es Proxy . dump Cor outines () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( coroutine Cache . is Ok ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchildren Ġ= ĠX Value Children List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroups Ġ= Ġcoroutine Cache . cache . groupBy Ġ{ Ġit . key . dispatcher Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( dispatcher Ġin Ġgroups . keys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren . add ( Coroutine Container ( suspend Context , Ġdispatcher Ġ?: Ġempty Dispatcher Name , Ġgroups [ dispatcher ])) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( children . size () Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . add Children ( children , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . add Children ( X Value Children List . singleton ( Info Node (" coroutine . view . fetch ing . not _ found ")), Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Node Ġ= ĠError Node (" coroutine . view . fetch ing . error ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . add Children ( X Value Children List . singleton ( error Node ), Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . add Children ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠX Value Children List . singleton ( Error Node (" to . enable . information . breakpoint . suspend . policy . should . be . set . to . all . threads ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠCor outine Container ( ĊĠĠĠĠĠĠĠ Ġval Ġsuspend Context : ĠS uspend Context Impl , ĊĠĠĠĠĠĠĠ Ġval ĠgroupName : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġcor outines : ĠList < Coroutine Info Data >? ĊĠĠĠ Ġ) Ġ: ĠRenderer Container ( renderer . render Group ( groupName )) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcompute Children ( node : ĠX Composite Node ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchildren Ġ= ĠX Value Children List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( coroutines Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( coroutine Info Ġin Ġcor outines ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren . add ( Frames Container ( coroutine Info , Ġsuspend Context )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( children . size () Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . add Children ( children , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . add Children ( X Value Children List . singleton ( Info Node (" coroutine . view . fetch ing . not _ found ")), Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠInfo Node ( val Ġerror : ĠString ) Ġ: ĠRenderer Container ( renderer . render Info Node ( error )) ĊĊĠĠĠ Ġinner Ġclass ĠError Node ( val Ġerror : ĠString ) Ġ: ĠRenderer Container ( renderer . render Error Node ( error )) ĊĊĠĠĠ Ġinner Ġclass ĠFrame s Container ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġinfo Data : ĠCor outine Info Data , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsuspend Context : ĠS uspend Context Impl ĊĠĠĠ Ġ) Ġ: ĠRenderer Container ( renderer . render ( info Data )) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcompute Children ( node : ĠX Composite Node ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmanager Thread Executor . on ( suspend Context ). invoke Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchildren Ġ= ĠX Value Children List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdouble Frame List Ġ= ĠCor outine Frame Builder . build ( info Data , Ġsuspend Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdouble Frame List ?. frames ?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren . add ( Coroutine Frame Value ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdouble Frame List ?. creation Frames ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren . add ( Creation Frames Container ( info Data , Ġit )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . add Children ( children , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠCreation Frames Container ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġinfo Data : ĠCor outine Info Data , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcreation Frames : ĠList < Creation Coroutine Stack Frame Item > ĊĠĠĠ Ġ) Ġ: ĠRenderer Container ( renderer . render Creation Node ( info Data )) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcompute Children ( node : ĠX Composite Node ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchildren Ġ= ĠX Value Children List () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreation Frames . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren . add ( Coroutine Frame Value ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . add Children ( children , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠCor outine Frame Value ( val Ġframe Item : ĠCor outine Stack Frame Item ) Ġ: ĠX Named Value ( frame Item . unique Id ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcompute Presentation ( node : ĠX Value Node , Ġplace : ĠX Value Place ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapply Renderer ( node , Ġrenderer . render ( frame Item . location )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġapply Renderer ( node : ĠX Value Node , Ġpresentation : ĠSimple Colo red Text Icon ) Ġ= ĊĠĠĠĠĠĠĠ Ġnode . set Presentation ( presentation . icon , Ġpresentation . value Presentation (), Ġpresentation . has Children ) ĊĊĠĠĠ Ġopen Ġinner Ġclass ĠRenderer Container ( val Ġpresentation : ĠSimple Colo red Text Icon ) Ġ: ĠX Named Value ( presentation . simple String ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcompute Presentation ( node : ĠX Value Node , Ġplace : ĠX Value Place ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapply Renderer ( node , Ġpresentation ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ