/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 9 ĠJetBrains Ġs . r . o . Ġand ĠKotlin ĠProgramming ĠLanguage Ġcontributors . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe Ġlicense / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . compiler . visual izer Ċ Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġorg . jetbrains . kotlin . Kt Node Types Ċ import Ġorg . jetbrains . kotlin . fir . F ir Element Ċ import Ġorg . jetbrains . kotlin . fir . F ir Label Ċ import Ġorg . jetbrains . kotlin . fir . F ir Named Reference Ċ import Ġorg . jetbrains . kotlin . fir . F ir Resolved Callable Reference Ċ import Ġorg . jetbrains . kotlin . fir . declarations .* Ċ import Ġorg . jetbrains . kotlin . fir . declarations . impl . F ir Abstract Member Declaration Ċ import Ġorg . jetbrains . kotlin . fir . expressions .* Ċ import Ġorg . jetbrains . kotlin . fir . references . F ir Error Named Reference Ċ import Ġorg . jetbrains . kotlin . fir . resolve . F ir Symbol Provider Ċ import Ġorg . jetbrains . kotlin . fir . resolve . direct Expansion Type Ċ import Ġorg . jetbrains . kotlin . fir . resolve . transformers . fir Unsafe Ċ import Ġorg . jetbrains . kotlin . fir . symbols . Abstract F ir Based Symbol Ċ import Ġorg . jetbrains . kotlin . fir . symbols . impl .* Ċ import Ġorg . jetbrains . kotlin . fir . types .* Ċ import Ġorg . jetbrains . kotlin . fir . types . impl . F ir Resolved Type Ref Impl Ċ import Ġorg . jetbrains . kotlin . fir . visitor s . F ir Visitor Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Const Kind Ċ import Ġorg . jetbrains . kotlin . name . Class Id Ċ import Ġorg . jetbrains . kotlin . name . Name Ċ import Ġorg . jetbrains . kotlin . psi .* Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . getChildren OfType Ċ Ċ private Ġtype alias ĠStack Ġ= ĠMutable List < Pair < String , ĠMutable List < String >>> Ċ Ċ class ĠF ir Visualizer ( private Ġval Ġfir File : ĠF ir File ) Ġ: ĠBase Renderer () Ġ{ ĊĠĠĠ Ġprivate Ġfun ĠF ir Element . render (): ĠString Ġ= Ġbuild String Ġ{ Ġthis @ render . accept ( F ir Renderer (), Ġthis ) Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd Annotation ( annotation Text : ĠString , Ġelement : ĠPsi Element ?, Ġdelete Duplicate : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . add Annotation ( annotation Text , Ġelement , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrender (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġmutable Map Of < Psi Element , ĠMutable List < F ir Element >> (). apply Ġ{ ĠPsi 2 F ir Mapper ( this ). visit File ( fir File ) Ġ} ĊĠĠĠĠĠĠĠ Ġmap . keys . first OrNull Ġ{ Ġit Ġis ĠK t File Ġ} ?. accept ( Psi Visitor ( map )) ĊĠĠĠĠĠĠĠ Ġreturn ĠAnnot ator . annotate ( fir File . psi !!. text , Ġget Annotations ()). join ToString ("\ n ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠPsi Visitor ( private Ġval Ġmap : ĠMap < Psi Element , ĠMutable List < F ir Element >>) Ġ: ĠK t Visitor Void () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// private Ġvar Ġinner Lambda Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġstack Ġ= Ġmutable ListOf ("" Ġto Ġmutable ListOf < String >()) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠStack . push ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlevel Name : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Values : ĠMutable List < String > Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġ) Ġ= Ġthis . add ( level Name Ġto Ġdefault Values ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠStack . pop () Ġ= Ġthis . remove At ( this . size Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠStack . add Name ( name : ĠString ) Ġ= Ġthis . last (). second . add ( name ) ĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠStack . add Name ( name : ĠName ) Ġ= Ġthis . add Name ( name . asString ()) ĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠStack . getPath ByName ( name : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( reversed Index , Ġnames ) Ġin Ġthis . as Re versed (). map Ġ{ Ġit . second Ġ}. with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( names . contains ( name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . filter Indexed Ġ{ Ġindex , Ġ_ Ġ-> Ġindex Ġ< Ġthis . size Ġ- Ġreversed Index Ġ&& Ġindex Ġ> Ġ 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString ( separator Ġ= Ġ".", Ġpostfix Ġ= Ġ". ") Ġ{ Ġit . first Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( name Ġ== Ġ" it ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . sub List ( 1 , Ġthis . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString ( separator Ġ= Ġ".", Ġpostfix Ġ= Ġ". ") Ġ{ Ġit . first Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"[ NOT ĠFO UND ]. " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġinline Ġfun Ġ< re ified ĠT > ĠK t Element . first OfType (): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfir List Ġ= Ġmap [ this ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfir List ?. filter Is Instance < T >() ?. first OrNull () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġrendered Ġelement Ġor Ġnull Ġif Ġthere Ġis Ġno Ġsuch Ġtype ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠF ir Element > ĠK t Element . first OfType With Render ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpsi : ĠPsi Element ? Ġ= Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Renderer Element : ĠT . () Ġ-> ĠF ir Element Ġ= Ġ{ Ġthis Ġ} ĊĠĠĠĠĠĠĠ Ġ): ĠF ir Element ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfirst OfType < T >() ?. also Ġ{ Ġadd Annotation ( it . get Renderer Element (). render (), Ġpsi ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġrendered Ġelement Ġor Ġnull Ġif Ġthere Ġis Ġno Ġsuch Ġtype ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠF ir Element > ĠK t Element . first OfType With Local Replace ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpsi : ĠPsi Element ? Ġ= Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetName : ĠT . () Ġ-> ĠString ĊĠĠĠĠĠĠĠ Ġ): ĠF ir Element ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfirst OfType < T >() ?. also Ġ{ Ġadd Annotation ( it . render (). replace ("< local >/ ", Ġstack . getPath ByName ( it . getName ())), Ġpsi ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġfirst Ġrendered Ġelement Ġor Ġnull Ġif Ġthere Ġis Ġno Ġsuch Ġtype ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠF ir Element > ĠK t Element . all OfType With Local Replace ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpsi : ĠPsi Element ? Ġ= Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetName : ĠT . () Ġ-> ĠString ĊĠĠĠĠĠĠĠ Ġ): ĠF ir Element ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfir List Ġ= Ġmap [ this ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfir Elements Ġ= Ġfir List ?. filter Is Instance < T >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fir Elements Ġ== Ġnull Ġ|| Ġfir Elements . isEmpty ()) Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfir Elements . forEach Ġ{ Ġadd Annotation ( it . render (). replace ("< local >/ ", Ġstack . getPath ByName ( it . getName ())), Ġpsi ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfir Elements . first () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Element ( element : ĠPsi Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . accept Children ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Kt Element ( element : ĠK t Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Class Initializer , Ġis ĠK t Secondary Constructor , Ġis ĠK t Primary Constructor , Ġis ĠK t Super Type Call Entry Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Parameters Ġ= Ġelement . getChildren OfType < Kt Parameter List >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Parameters . flatMap Ġ{ Ġit . parameters Ġ}. forEach Ġ{ Ġstack . add Name ( it . name As Safe Name ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// add Ġto Ġinit Ġvalues Ġfrom Ġlast Ġblock ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// because Ġwhen Ġwe Ġare Ġout Ġof Ġprimary Ġconstructor Ġinformation Ġabout Ġproperties Ġwill Ġbe Ġremoved ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// is Ġused Ġin ĠClass Initializer Ġblock Ġand Ġin ĠSuper Type Call Entry ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack . push ("< init >", Ġstack . last (). second ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . accept Children ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack . pop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Class Or Object Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack . push (( element . name Ġ?: Ġ"< no Ġname Ġprovided > ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . accept Children ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack . pop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġelement . accept Children ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Package Directive ( directive : ĠK t Package Directive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// don 't Ġresolve Ġpackage Ġnames ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Super Expression ( expression : ĠK t Super Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// don 't Ġresolve Ġsuper Ġexpression ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit This Expression ( expression : ĠK t This Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// don 't Ġresolve Ġthis Ġexpression ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Named Function ( function : ĠK t Named Function ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack . push (( function . name Ġ?: Ġ"< no Ġname Ġprovided > ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( function . equals Token Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . body Expression !!. first OfType With Render < F ir Expression >( function . equals Token ) Ġ{ Ġthis . type Ref Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġfunction . first OfType With Render < F ir Typed Declaration >( function . equals Token ) Ġ{ Ġthis . returnType Ref Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Named Function ( function ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack . pop () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġrender Variable Type ( variable : ĠK t Variable Declaration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack . add Name ( variable . name As Safe Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvariable . first OfType With Render < F ir Variable < *> >( variable . name Identifier ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvariable . accept Children ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Property ( property : ĠK t Property ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrender Variable Type ( property ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Dest ruct uring Declaration Entry ( multi Declaration Entry : ĠK t Dest ruct uring Declaration Entry ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrender Variable Type ( multi Declaration Entry ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Annotation Entry ( annotation Entry : ĠK t Annotation Entry ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġannotation Entry . first OfType With Render < F ir Annotation Call >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Annotation Entry ( annotation Entry ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Constructor Cal lee Expression ( constructor Cal lee Expression : ĠK t Constructor Cal lee Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor Cal lee Expression . first OfType With Render < F ir Deleg ated Constructor Call >() ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Parameter ( parameter : ĠK t Parameter ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack . add Name ( parameter . name As Safe Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( parameter . is Loop Parameter Ġ&& Ġparameter . destruct uring Declaration Ġ== Ġnull ) Ġ|| Ġparameter . owner Function Ġis ĠK t Property Accessor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameter . first OfType With Render < F ir Variable < *> >( parameter . name Identifier ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Parameter ( parameter ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Type Reference ( type Reference : ĠK t Type Reference ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Reference . first OfType With Render < F ir Type Ref >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Type Reference ( type Reference ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Constant Expression ( expression : ĠK t Constant Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . first OfType With Render < F ir Const Expression <* >>() ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Reference Expression ( expression : ĠK t Reference Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression Ġis ĠK t Operation Reference Expression ) Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . first OfType With Local Replace < F ir Resolved Callable Reference > Ġ{ Ġthis . name . asString () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġexpression . first OfType With Render < F ir Resolved Qualifier >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġexpression . first OfType With Render < F ir Element >() Ġ// fallback Ġfor Ġerrors ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Reference Expression ( expression ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Unary Expression ( expression : ĠK t Unary Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression . operation Reference . get Referenced Name () Ġ== Ġ" !! ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . base Expression ?. accept ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . first OfType With Local Replace < F ir Function Call >( expression . operation Reference ) Ġ{ Ġthis . callee Reference . name . asString () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Unary Expression ( expression ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Binary Expression ( expression : ĠK t Binary Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression . operation Reference . get Referenced Name () Ġ== Ġ" ?: ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . left ?. accept ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . right ?. accept ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . operation Reference . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . all OfType With Local Replace < F ir Function Call >( it ) Ġ{ Ġthis . callee Reference . name . asString () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġexpression . first OfType With Local Replace < F ir Variable Assignment >( it ) Ġ{ Ġthis . l Value . toString () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġexpression . first OfType With Render < F ir Operator Call >( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Binary Expression ( expression ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit If Expression ( expression : ĠK t If Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . first OfType With Render < F ir When Expression > Ġ{ Ġthis . type Ref Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit If Expression ( expression ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit When Expression ( expression : ĠK t When Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . first OfType With Render < F ir When Expression > Ġ{ Ġthis . type Ref Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit When Expression ( expression ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Call Expression ( expression : ĠK t Call Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . first OfType With Local Replace < F ir Function Call > Ġ{ Ġthis . callee Reference . name . asString () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . children . filter Ġ{ Ġit . node . elementType Ġ!= ĠK t Node Types . REFERENCE _ EXPRESSION Ġ}. forEach Ġ{ Ġit . accept ( this ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Lambda Expression ( lambda Expression : ĠK t Lambda Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfir Label Ġ= Ġlambda Expression . first OfType < F ir Label >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack . push ("< anonymous >") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// fir Label ?. let Ġ{ Ġadd Annotation ("${ it . name }@ $ inner Lambda Count ", Ġlambda Expression ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// inner Lambda Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Lambda Expression ( lambda Expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// inner Lambda Count -- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack . pop () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Array Access Expression ( expression : ĠK t Array Access Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// this Ġmethod Ġexplicitly Ġaccept Ġchildren Ġand Ġprevent Ġdefault Ġfallback Ġto Ġother Ġfir Ġelement ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . accept Children ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Property Accessor ( accessor : ĠK t Property Accessor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( accessor . is Setter ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack . push ("< set -${ accessor . property . name As Safe Name }> ", Ġmutable ListOf ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Property Accessor ( accessor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack . pop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Property Accessor ( accessor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit When Entry ( jet When Entry : ĠK t When Entry ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjet When Entry . first OfType With Render < F ir When Branch >( jet When Entry . expression ) Ġ{ Ġthis . result . type Ref Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit When Entry ( jet When Entry ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠF ir Renderer Ġ: ĠF ir Visitor < Unit , ĠStringBuilder >() Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsession Ġ= Ġfir File . session ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġfile Package Ġ= Ġfir File . package Fq Name . toString (). replace (".", Ġ"/") ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsymbol Provider Ġ= Ġfir File . session . getService ( F ir Symbol Provider :: class ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġremove Current File Package ( fq Name : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( fq Name . startsWith ( file Package ) Ġ&& Ġ! fq Name . substring ( file Package . length Ġ+ Ġ 1 ). contains ("/ ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfq Name . replace First ("$ file Package /", Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfq Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠClass Id . get Without Current Package () Ġ= Ġremove Current File Package ( this . asString ()) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġ< T Ġ: ĠF ir Element > Ġrender List In Triangles ( list : ĠList < T >, Ġdata : ĠStringBuilder , Ġwith Space : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . join To ( data , Ġseparator Ġ= Ġ", Ġ", Ġprefix Ġ= Ġ"< ", Ġpostfix Ġ= Ġ"> ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild String Ġ{ Ġit . accept ( this @ F ir Renderer , Ġthis ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( with Space ) Ġdata . append (" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġvisit Arguments ( arguments : ĠList < F ir Expression >, Ġdata : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . join To ( data , Ġ", Ġ", Ġ" (", Ġ") ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠF ir Resolved Qualifier ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlookup Tag Ġ= Ġ( it . type Ref Ġas ĠF ir Resolved Type Ref Impl ). cone Type Safe < Con e ClassType >() ?. lookup Tag ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġlookup Tag ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( symbol Provider . get Symbol By Lookup Tag ( it )?. fir Ġas ? ĠF ir Class )?. super Type Refs ?. first ()?. render () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġ!= Ġnull ) Ġreturn @ join To Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . type Ref . render () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Element ( element : ĠF ir Element , Ġdata : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . accept Children ( this , Ġdata ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Constructor ( constructor : ĠF ir Constructor , Ġdata : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append ( render Symbol ( constructor . symbol )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Value Parameters ( constructor . value Parameters , Ġdata ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Type Parameter ( type Parameter : ĠF ir Type Parameter , Ġdata : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append ( type Parameter . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbounds Ġ= Ġtype Parameter . bounds . filter Not Ġ{ Ġit . render () Ġ== Ġ" kotlin / Any ?" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bounds . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append (" Ġ: Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbounds . join To ( data , Ġseparator Ġ= Ġ", Ġ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild String Ġ{ Ġit . accept ( this @ F ir Renderer , Ġthis ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Property ( property : ĠF ir Property , Ġdata : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append ( property . returnType Ref . render ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġvisit Value Parameters ( value Parameters : ĠList < F ir Value Parameter >, Ġdata : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Parameters . join To ( data , Ġseparator Ġ= Ġ", Ġ", Ġprefix Ġ= Ġ" (", Ġpostfix Ġ= Ġ") ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild String Ġ{ Ġit . accept ( this @ F ir Renderer , Ġthis ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Value Parameter ( value Parameter : ĠF ir Value Parameter , Ġdata : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Parameter . is Var arg ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append (" var arg Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Parameter . returnType Ref . cone Type Safe < Con e ClassType >() ?. array ElementType ( session )?. let Ġ{ Ġdata . append ( it . render ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġvalue Parameter . returnType Ref . accept ( this , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Parameter . defaultValue ?. let Ġ{ Ġdata . append (" Ġ= Ġ... ") Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< F Ġ: ĠF ir Variable < F >> Ġvisit Variable ( variable : ĠF ir Variable < F >, Ġdata : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append ( variable . returnType Ref . render ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Named Reference ( named Reference : ĠF ir Named Reference , Ġdata : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( named Reference Ġis ĠF ir Error Named Reference ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append ("[ ERROR Ġ: Ġ${ named Reference . error Reason }] ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Element ( named Reference , Ġdata ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Resolved Callable Reference ( resolved Callable Reference : ĠF ir Resolved Callable Reference , Ġdata : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsymbol Ġ= Ġresolved Callable Reference . resolved Symbol ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append ( render Symbol ( symbol )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Annotation Call ( annotation Call : ĠF ir Annotation Call , Ġdata : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append ( annotation Call . annotation Type Ref . render ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Deleg ated Constructor Call ( deleg ated Constructor Call : ĠF ir Deleg ated Constructor Call , Ġdata : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcon e ClassType Ġ= Ġdeleg ated Constructor Call . construct ed Type Ref . cone Type Safe < Con e Class Like Type >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cone ClassType Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append (" constructor "). append (" Ġ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append ( cone ClassType . lookup Tag . class Id . get Without Current Package ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Parameters Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( symbol Provider . get Symbol By Lookup Tag ( cone ClassType . lookup Tag )?. fir Ġas ? ĠF ir Regular Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . type Parameters Ġ?: Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrender List In Triangles ( type Parameters , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Arguments ( deleg ated Constructor Call . arguments , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append ("[ ERROR Ġ: Ġ${ deleg ated Constructor Call . construct ed Type Ref . render ()} ]") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Operator Call ( operator Call : ĠF ir Operator Call , Ġdata : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append (" operator Ġcall Ġ${ operator Call . operation }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Type Operator Call ( type Operator Call : ĠF ir Type Operator Call , Ġdata : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// skip Ġrendering Ġfor Ġas / as ? / is / ! is ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Function Call ( function Call : ĠF ir Function Call , Ġdata : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġcal lee Ġ= Ġfunction Call . callee Reference ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠF ir Resolved Callable Reference Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( callee . resolved Symbol Ġis ĠF ir Constructor Symbol ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append ( render Symbol ( callee . resolved Symbol )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Arguments ( function Call . arguments , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append (" fun Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfir Function Ġ= Ġcal lee . resolved Symbol . fir Ġas ? ĠF ir Abstract Member Declaration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfir Function ?. let Ġ{ Ġrender List In Triangles ( it . type Parameters , Ġdata , Ġtrue ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append ( render Symbol ( callee . resolved Symbol )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrender List In Triangles ( function Call . type Arguments , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Value Parameters ( callee . resolved Symbol . fir Unsafe < F ir Function <* >> (). value Parameters , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append (": Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Call . type Ref . accept ( this , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠF ir Error Named Reference Ġ-> Ġdata . append ("[ ERROR Ġ: Ġ${ callee . error Reason }] ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< T > Ġvisit Const Expression ( const Expression : ĠF ir Const Expression < T >, Ġdata : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( const Expression . kind Ġ!= ĠIr Const Kind . String ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append ( const Expression . kind ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Resolved Qualifier ( resolved Qualifier : ĠF ir Resolved Qualifier , Ġdata : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolved Qualifier . class Id ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfir Ġ= Ġsymbol Provider . getClass Like Symbol By Fq Name ( it )?. fir ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fir Ġis ĠF ir Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append ( fir . class Kind . name . toLowerCase ()). append (" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append ( fir . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fir . super Type Refs . any Ġ{ Ġit . render () Ġ!= Ġ" kotlin / Any " Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append (": Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfir . super Type Refs . join To ( data , Ġseparator Ġ= Ġ", Ġ") Ġ{ Ġtype Ref Ġ-> Ġtype Ref . render () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Variable Assignment ( variable Assignment : ĠF ir Variable Assignment , Ġdata : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append (" qualified Ġaccess : Ġ\" ${ variable Assignment . operation }\" ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Star Projection ( star Projection : ĠF ir Star Projection , Ġdata : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append ("* ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Type Projection With Variance ( type Projection With Variance : ĠF ir Type Projection With Variance , Ġdata : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariance Ġ= Ġtype Projection With Variance . variance . label ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( variance . isNotEmpty ()) Ġdata . append ("$ variance Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Projection With Variance . type Ref . accept ( this , Ġdata ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Deleg ated Type Ref ( deleg ated Type Ref : ĠF ir Deleg ated Type Ref , Ġdata : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeleg ated Type Ref . type Ref . accept ( this , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append (" Ġby Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeleg ated Type Ref . delegate ?. accept ( this , Ġdata ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Resolved Type Ref ( resolved Type Ref : ĠF ir Resolved Type Ref , Ġdata : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcon e Type Ġ= Ġresolved Type Ref . type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append ( remove Current File Package ( cone Type . render ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cone Type Ġis ĠC one Abbre vi ated Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal Ġ= Ġcon e Type . direct Expansion Type ( session ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoriginal ?. let Ġ{ Ġdata . append (" Ġ/* Ġ= Ġ${ it . render ()} Ġ*/ ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit ErrorType Ref ( error Type Ref : ĠF ir ErrorType Ref , Ġdata : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append ("[ ERROR Ġ: Ġ${ error Type Ref . reason }] ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Resolved FunctionType Ref ( resolved FunctionType Ref : ĠF ir Resolved FunctionType Ref , Ġdata : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolved FunctionType Ref . receiver Type Ref ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . accept ( this , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append (".") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Value Parameters ( resolved FunctionType Ref . value Parameters , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append (" Ġ-> Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolved FunctionType Ref . returnType Ref . accept ( this , Ġdata ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Type Ref With Null ability ( type Ref With Null ability : ĠF ir Type Ref With Null ability , Ġdata : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ref With Null ability . is Marked Nullable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append (" ?") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġrender Symbol ( symbol : ĠAbstract F ir Based Symbol < *> ?): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġid Ġ= Ġwhen Ġ( symbol ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠF ir Callable Symbol < *> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcallable Id Ġ= Ġsymbol . callable Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid With Package Ġ= Ġcallable Id . toString (). replace (" ." Ġ+ Ġcallable Id . callable Name . asString (), Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Current File Package ( id With Package ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠF ir Class Like Symbol < *> Ġ-> Ġsymbol . class Id . get Without Current Package () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( id . startsWith ("/ ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġid . substring ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( symbol ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠF ir Named Function Symbol Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcallable Name Ġ= Ġsymbol . callable Id . callable Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreceiver Type Ġ= Ġsymbol . fir . receiver Type Ref ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( receiver Type Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( symbol . callable Id . className Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append (" ($ id ). $ callable Name ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append ("${ receiver Type . render ()}. $ callable Name ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠF ir Property Symbol Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append ( if Ġ( symbol . fir . is Var ) Ġ" var " Ġelse Ġ" val "). append (" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrender List In Triangles ( symbol . fir . type Parameters , Ġdata , Ġwith Space Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreceiver Ġ= Ġsymbol . fir . receiver Type Ref ?. render () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( receiver Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append ( receiver ). append (".") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( id Ġ!= Ġsymbol . callable Id . callable Name . asString ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append (" ($ id ) "). append (".") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append ( symbol . callable Id . callable Name ). append (": Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol . fir . returnType Ref . accept ( this , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠF ir Variable Symbol < *> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( symbol . fir Ġ! is ĠF ir Value Parameter ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( symbol . fir . is Var ) Ġdata . append (" var Ġ") Ġelse Ġif Ġ( symbol . fir . is Val ) Ġdata . append (" val Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append ( id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append (": Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol . fir . returnType Ref . accept ( this , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠF ir Constructor Symbol Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append (" constructor Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpackageName Ġ= Ġsymbol . callable Id . className ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . append ( packageName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrender List In Triangles ( symbol . fir . type Parameters , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdata . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }