/* Ċ Ġ* Ġ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 . fir . resolve . dfa Ċ Ċ import Ġorg . jetbrains . kotlin . fir . F ir Element Ċ import Ġorg . jetbrains . kotlin . fir . F ir Symbol Owner Ċ import Ġorg . jetbrains . kotlin . fir . resolve . dfa . cfg . CFG Node Ċ import Ġorg . jetbrains . kotlin . fir . symbols . F ir Based Symbol Ċ Ċ interface ĠStack < T > Ġ{ ĊĠĠĠ Ġval Ġsize : ĠInt ĊĠĠĠ Ġfun Ġtop (): ĠT ĊĠĠĠ Ġfun Ġpop (): ĠT ĊĠĠĠ Ġfun Ġpush ( value : ĠT ) Ċ } Ċ Ċ fun Ġ< T > Ġstack Of ( var arg Ġvalues : ĠT ): ĠStack < T > Ġ= ĠStack Impl (* values ) Ċ val ĠStack <* >. isEmpty : ĠBoolean Ġget () Ġ= Ġsize Ġ== Ġ 0 Ċ val ĠStack <* >. isNotEmpty : ĠBoolean Ġget () Ġ= Ġsize Ġ!= Ġ 0 Ċ fun Ġ< T > ĠStack < T >. top OrNull (): ĠT ? Ġ= Ġif Ġ( size Ġ== Ġ 0 ) Ġnull Ġelse Ġtop () Ċ Ċ private Ġclass ĠStack Impl < T >( var arg Ġvalues : ĠT ) Ġ: ĠStack < T > Ġ{ ĊĠĠĠ Ġprivate Ġval Ġstack Ġ= Ġmutable ListOf (* values ) ĊĊĠĠĠ Ġoverride Ġfun Ġtop (): ĠT Ġ= Ġstack [ stack . size Ġ- Ġ 1 ] ĊĠĠĠ Ġoverride Ġfun Ġpop (): ĠT Ġ= Ġstack . remove At ( stack . size Ġ- Ġ 1 ) ĊĊĠĠĠ Ġoverride Ġfun Ġpush ( value : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstack . add ( value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġsize : ĠInt Ġget () Ġ= Ġstack . size Ċ } Ċ Ċ class ĠNode Storage < T Ġ: ĠF ir Element , ĠN Ġ: ĠCFG Node < T >>() Ġ: ĠStack < N > Ġ{ ĊĠĠĠ Ġprivate Ġval Ġstack : ĠStack < N > Ġ= ĠStack Impl () ĊĠĠĠ Ġprivate Ġval Ġmap : ĠMutable Map < T , ĠN > Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġoverride Ġval Ġsize : ĠInt Ġget () Ġ= Ġstack . size ĊĊĠĠĠ Ġoverride Ġfun Ġtop (): ĠN Ġ= Ġstack . top () ĊĊĠĠĠ Ġoverride Ġfun Ġpop (): ĠN Ġ= Ġstack . pop (). also Ġ{ ĊĠĠĠĠĠĠĠ Ġmap . remove ( it . fir ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpush ( value : ĠN ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstack . push ( value ) ĊĠĠĠĠĠĠĠ Ġmap [ value . fir ] Ġ= Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġget ( key : ĠT ): ĠN ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmap [ key ] ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠSymbol Based Node Storage < T , ĠN Ġ: ĠCFG Node < T >> Ġ: ĠStack < N > Ġwhere ĠT Ġ: ĠF ir Element Ġ{ ĊĠĠĠ Ġprivate Ġval Ġstack : ĠStack < N > Ġ= ĠStack Impl () ĊĠĠĠ Ġprivate Ġval Ġmap : ĠMutable Map < F ir Based Symbol <* >, ĠN > Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġoverride Ġval Ġsize : ĠInt Ġget () Ġ= Ġstack . size ĊĊĠĠĠ Ġoverride Ġfun Ġtop (): ĠN Ġ= Ġstack . top () ĊĊĠĠĠ Ġoverride Ġfun Ġpop (): ĠN Ġ= Ġstack . pop (). also Ġ{ ĊĠĠĠĠĠĠĠ Ġmap . remove (( it . fir Ġas ĠF ir Symbol Owner < *> ). symbol ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpush ( value : ĠN ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstack . push ( value ) ĊĠĠĠĠĠĠĠ Ġmap [( value . fir Ġas ĠF ir Symbol Owner < *> ). symbol ] Ġ= Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġget ( key : ĠF ir Based Symbol < *> ): ĠN ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmap [ key ] ĊĠĠĠ Ġ} Ċ }