/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 8 Ġ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 . transformers Ċ Ċ import Ġorg . jetbrains . kotlin . descriptors . Class Kind Ċ import Ġorg . jetbrains . kotlin . descriptors . Modal ity Ċ import Ġorg . jetbrains . kotlin . descriptors . Vis ibilities Ċ import Ġorg . jetbrains . kotlin . descriptors . Visibility Ċ import Ġorg . jetbrains . kotlin . fir . F ir Session Ċ import Ġorg . jetbrains . kotlin . fir . declarations .* Ċ import Ġorg . jetbrains . kotlin . fir . declarations . impl . F ir Declaration Status Impl Ċ import Ġorg . jetbrains . kotlin . fir . visitor s . Composite Transform Result Ċ import Ġorg . jetbrains . kotlin . fir . visitor s . compose Ċ Ċ class ĠF ir Status Resolve Transformer Ġ: ĠF ir Abstract Tree Transformer ( phase Ġ= ĠF ir Resolve Phase . STATUS ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġdeclarations With Statuses Ġ= Ġmutable ListOf < F ir Declaration >() ĊĊĠĠĠ Ġprivate Ġval Ġclasses Ġ= Ġmutable ListOf < F ir Regular Class >() ĊĊĠĠĠ Ġprivate Ġfun ĠF ir Declaration . resolve Visibility (): ĠVisibility Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġis ĠF ir Constructor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġklass Ġ= Ġclasses . last OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( klass Ġ!= Ġnull Ġ&& Ġ( klass . class Kind Ġ== ĠClass Kind . ENUM _ CLASS Ġ|| Ġklass . modal ity Ġ== ĠMod ality . SE AL ED )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠVis ibilities . PRIVATE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠVis ibilities . PUBLIC Ġ// ĠTODO Ġ( overrides ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠF ir Declaration . resolve Modal ity (): ĠMod ality Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠF ir Enum Entry Ġ-> ĠMod ality . FINAL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠF ir Regular Class Ġ-> Ġif Ġ( class Kind Ġ== ĠClass Kind . INTERFACE ) ĠMod ality . AB STR ACT Ġelse ĠMod ality . FINAL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠF ir Callable Member Declaration < *> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontaining Class Ġ= Ġclasses . last OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontaining Class Ġ== Ġnull Ġ-> ĠMod ality . FINAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontaining Class . class Kind Ġ== ĠClass Kind . INTERFACE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ== ĠVis ibilities . PRIVATE Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMod ality . FINAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ġis ĠF ir Named Function Ġ&& Ġbody Ġ== Ġnull Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMod ality . AB STR ACT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ġis ĠF ir Property Ġ&& Ġinitializer Ġ== Ġnull Ġ&& Ġgetter ?. body Ġ== Ġnull Ġ&& Ġsetter ?. body Ġ== Ġnull Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMod ality . AB STR ACT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMod ality . OPEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Override Ġ&& Ġcontaining Class . modal ity Ġ!= ĠMod ality . FINAL ) ĠMod ality . OPEN Ġelse ĠMod ality . FINAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠMod ality . FINAL ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġlateinit Ġvar Ġsession : ĠF ir Session ĊĊĠĠĠ Ġoverride Ġfun Ġtransform File ( file : ĠF ir File , Ġdata : ĠNothing ?): ĠComposite Transform Result < F ir File > Ġ{ ĊĠĠĠĠĠĠĠ Ġsession Ġ= Ġfile . file Session ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . transform File ( file , Ġdata ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtransform Declaration Status ( ĊĠĠĠĠĠĠĠ Ġdeclaration Status : ĠF ir Declaration Status , ĊĠĠĠĠĠĠĠ Ġdata : ĠNothing ? ĊĠĠĠ Ġ): ĠComposite Transform Result < F ir Declaration Status > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( declaration Status . visibility Ġ== ĠVis ibilities . UNKNOWN Ġ|| Ġdeclaration Status . modal ity Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeclaration Ġ= Ġdeclarations With Statuses . last () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvisibility Ġ= Ġwhen Ġ( declaration Status . visibility ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVis ibilities . UNKNOWN Ġ-> Ġdeclaration . resolve Visibility () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġdeclaration Status . visibility ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmod ality Ġ= Ġdeclaration Status . modal ity Ġ?: Ġdeclaration . resolve Modal ity () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresolved Status Ġ= Ġ( declaration Status Ġas ĠF ir Declaration Status Impl ). resolved ( visibility , Ġmod ality ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresolved Status . compose () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . transform Declaration Status ( declaration Status , Ġdata ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġstore Declaration ( ĊĠĠĠĠĠĠĠ Ġdeclaration : ĠF ir Declaration , ĊĠĠĠĠĠĠĠ Ġcompute Result : Ġ() Ġ-> ĠComposite Transform Result < F ir Declaration > ĊĠĠĠ Ġ): ĠComposite Transform Result < F ir Declaration > Ġ{ ĊĠĠĠĠĠĠĠ Ġdeclarations With Statuses Ġ+= Ġdeclaration ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcompute Result () ĊĠĠĠĠĠĠĠ Ġdeclarations With Statuses . remove At ( declarations With Statuses . last Index ) ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġstore Class ( ĊĠĠĠĠĠĠĠ Ġklass : ĠF ir Regular Class , ĊĠĠĠĠĠĠĠ Ġcompute Result : Ġ() Ġ-> ĠComposite Transform Result < F ir Declaration > ĊĠĠĠ Ġ): ĠComposite Transform Result < F ir Declaration > Ġ{ ĊĠĠĠĠĠĠĠ Ġclasses Ġ+= Ġklass ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcompute Result () ĊĠĠĠĠĠĠĠ Ġclasses . remove At ( classes . last Index ) ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtransform Regular Class ( regular Class : ĠF ir Regular Class , Ġdata : ĠNothing ?): ĠComposite Transform Result < F ir Declaration > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstore Class ( regular Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . transform Regular Class ( regular Class , Ġdata ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtransform Member Declaration ( ĊĠĠĠĠĠĠĠ Ġmember Declaration : ĠF ir Member Declaration , ĊĠĠĠĠĠĠĠ Ġdata : ĠNothing ? ĊĠĠĠ Ġ): ĠComposite Transform Result < F ir Declaration > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstore Declaration ( member Declaration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . transform Member Declaration ( member Declaration , Ġdata ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtransform Property Accessor ( ĊĠĠĠĠĠĠĠ Ġproperty Accessor : ĠF ir Property Accessor , ĊĠĠĠĠĠĠĠ Ġdata : ĠNothing ? ĊĠĠĠ Ġ): ĠComposite Transform Result < F ir Declaration > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstore Declaration ( property Accessor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . transform Property Accessor ( property Accessor , Ġdata ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtransform Constructor ( ĊĠĠĠĠĠĠĠ Ġconstructor : ĠF ir Constructor , ĊĠĠĠĠĠĠĠ Ġdata : ĠNothing ? ĊĠĠĠ Ġ): ĠComposite Transform Result < F ir Declaration > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstore Declaration ( constructor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . transform Constructor ( constructor , Ġdata ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtransform Named Function ( ĊĠĠĠĠĠĠĠ Ġnamed Function : ĠF ir Named Function , ĊĠĠĠĠĠĠĠ Ġdata : ĠNothing ? ĊĠĠĠ Ġ): ĠComposite Transform Result < F ir Declaration > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstore Declaration ( named Function ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . transform Named Function ( named Function , Ġdata ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtransform Property ( ĊĠĠĠĠĠĠĠ Ġproperty : ĠF ir Property , ĊĠĠĠĠĠĠĠ Ġdata : ĠNothing ? ĊĠĠĠ Ġ): ĠComposite Transform Result < F ir Declaration > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstore Declaration ( property ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . transform Property ( property , Ġdata ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }