/* Ċ Ġ* Ġ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 Ġkotlinx . collections . immutable . to ImmutableList Ċ import Ġorg . jetbrains . kotlin . fir . F ir Session Ċ import Ġorg . jetbrains . kotlin . fir . declarations .* Ċ import Ġorg . jetbrains . kotlin . fir . declarations . utils . is From Var arg Ċ import Ġorg . jetbrains . kotlin . fir . expressions .* Ċ import Ġorg . jetbrains . kotlin . fir . resolve . Scope Session Ċ import Ġorg . jetbrains . kotlin . fir . resolve . diagnostics . Con e Cyc lic Type Bound Ċ import Ġorg . jetbrains . kotlin . fir . resolve . lookup Super Types Ċ import Ġorg . jetbrains . kotlin . fir . scopes . F ir Composite Scope Ċ import Ġorg . jetbrains . kotlin . fir . scopes . F ir Scope Ċ import Ġorg . jetbrains . kotlin . fir . scopes . create Import ing Scopes Ċ import Ġorg . jetbrains . kotlin . fir . scopes . get Nested Classifier Scope Ċ import Ġorg . jetbrains . kotlin . fir . scopes . impl . F ir Member Type Parameter Scope Ċ import Ġorg . jetbrains . kotlin . fir . scopes . impl . nested Classifier Scope Ċ import Ġorg . jetbrains . kotlin . fir . scopes . impl . wrap Nested Classifier Scope With Substitution For Super Type Ċ import Ġorg . jetbrains . kotlin . fir . types .* Ċ import Ġorg . jetbrains . kotlin . fir . types . builder . build ErrorType Ref Ċ Ċ class ĠF ir Type Resolve Processor ( ĊĠĠĠ Ġsession : ĠF ir Session , ĊĠĠĠ Ġscope Session : ĠScope Session Ċ ) Ġ: ĠF ir Transformer Based Resolve Processor ( session , Ġscope Session ) Ġ{ ĊĠĠĠ Ġoverride Ġval Ġtransformer Ġ= ĠF ir Type Resolve Transformer ( session , Ġscope Session ) Ċ } Ċ Ċ fun Ġ< F Ġ: ĠF ir Class Like Declaration > ĠF . run Type Resolve Phase For Local Class ( ĊĠĠĠ Ġsession : ĠF ir Session , ĊĠĠĠ Ġscope Session : ĠScope Session , ĊĠĠĠ Ġcurrent Scope List : ĠList < F ir Scope >, Ċ ): ĠF Ġ{ ĊĠĠĠ Ġval Ġtransformer Ġ= ĠF ir Type Resolve Transformer ( session , Ġscope Session , Ġcurrent Scope List ) ĊĊĠĠĠ Ġreturn Ġthis . transform < F , ĠNothing ? >( transformer , Ġnull ) Ċ } Ċ Ċ open Ġclass ĠF ir Type Resolve Transformer ( ĊĠĠĠ Ġfinal Ġoverride Ġval Ġsession : ĠF ir Session , ĊĠĠĠ Ġprivate Ġval Ġscope Session : ĠScope Session , ĊĠĠĠ Ġinitial Scopes : ĠList < F ir Scope > Ġ= Ġempty List () Ċ ) Ġ: ĠF ir Abstract Tree Transformer < Any ? >( F ir Resolve Phase . TYPES ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġclass Declarations Stack Ġ= ĠArray Deque < F ir Regular Class >() ĊĠĠĠ Ġprivate Ġval Ġscopes Ġ= Ġmutable ListOf < F ir Scope >() ĊĠĠĠ Ġprivate Ġval Ġto wer Scope Ġ= ĠF ir Composite Scope ( scopes . as Re versed ()) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġscopes . addAll ( initial Scopes . as Re versed ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġtype Resolver Transformer : ĠF ir Specific Type Resolver Transformer Ġ= ĠF ir Specific Type Resolver Transformer ( session ) ĊĠĠĠ Ġprivate Ġvar Ġcurrent File : ĠF ir File ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġtransform File ( file : ĠF ir File , Ġdata : ĠAny ?): ĠF ir File Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Session Consistency ( file ) ĊĠĠĠĠĠĠĠ Ġcurrent File Ġ= Ġfile ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Scope Cleanup Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscopes . addAll ( create Import ing Scopes ( file , Ġsession , Ġscope Session )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . transform File ( file , Ġdata ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtransform Regular Class ( regular Class : ĠF ir Regular Class , Ġdata : ĠAny ?): ĠF ir Statement Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Class Declaration Cleanup ( class Declarations Stack , Ġregular Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Scope Cleanup Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregular Class . add Type Parameters Scope () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregular Class . type Parameters . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . accept ( this , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun bound Cycles In Type Parameters Sup ert ypes ( regular Class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresolve Class Content ( regular Class , Ġdata ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtransform Anonymous Object ( anonymous Object : ĠF ir Anonymous Object , Ġdata : ĠAny ?): ĠF ir Statement Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġresolve Class Content ( anonymous Object , Ġdata ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtransform Constructor ( constructor : ĠF ir Constructor , Ġdata : ĠAny ?): ĠF ir Constructor Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Scope Cleanup Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor . add Type Parameters Scope () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransform Declaration ( constructor , Ġdata ) ĊĠĠĠĠĠĠĠ Ġ} Ġas ĠF ir Constructor ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtransform Type Alias ( type Alias : ĠF ir Type Alias , Ġdata : ĠAny ?): ĠF ir Type Alias Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Scope Cleanup Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Alias . add Type Parameters Scope () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransform Declaration ( type Alias , Ġdata ) ĊĠĠĠĠĠĠĠ Ġ} Ġas ĠF ir Type Alias ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtransform Enum Entry ( enum Entry : ĠF ir Enum Entry , Ġdata : ĠAny ?): ĠF ir Enum Entry Ġ{ ĊĠĠĠĠĠĠĠ Ġenum Entry . transform ReturnType Ref ( this , Ġdata ) ĊĠĠĠĠĠĠĠ Ġenum Entry . transform Type Parameters ( this , Ġdata ) ĊĠĠĠĠĠĠĠ Ġenum Entry . transform Annotations ( this , Ġdata ) ĊĠĠĠĠĠĠĠ Ġreturn Ġenum Entry ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtransform Property ( property : ĠF ir Property , Ġdata : ĠAny ?): ĠF ir Property Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Scope Cleanup Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperty . add Type Parameters Scope () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperty . transform Type Parameters ( this , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. transform ReturnType Ref ( this , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. transform Receiver Type Ref ( this , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. transform Getter ( this , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. transform Setter ( this , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. transform Backing Field ( this , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. transform Annotations ( this , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( property . is From Var arg Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty . transform Type ToArray Type () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty . getter ?. transform ReturnType Ref ( Store Type , Ġproperty . returnType Ref ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty . setter ?. value Parameters ?. map Ġ{ Ġit . transform ReturnType Ref ( Store Type , Ġproperty . returnType Ref ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġun bound Cycles In Type Parameters Sup ert ypes ( property ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperty ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtransform Field ( field : ĠF ir Field , Ġdata : ĠAny ?): ĠF ir Field Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Scope Cleanup Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield . transform ReturnType Ref ( this , Ġdata ). transform Annotations ( this , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtransform Simple Function ( simple Function : ĠF ir Simple Function , Ġdata : ĠAny ?): ĠF ir Simple Function Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Scope Cleanup Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsimple Function . add Type Parameters Scope () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransform Declaration ( simple Function , Ġdata ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun bound Cycles In Type Parameters Sup ert ypes ( it Ġas ĠF ir Type Parameters Owner ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġas ĠF ir Simple Function ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġun bound Cycles In Type Parameters Sup ert ypes ( type Parameters Owner : ĠF ir Type Parameter Refs Owner ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( type Parameter Ġin Ġtype Parameters Owner . type Parameters ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Parameter Ġ! is ĠF ir Type Parameter ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Sup ertype Path To Parameter ( type Parameter , Ġtype Parameter , Ġmutable Set Of ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Type Ġ= Ġbuild ErrorType Ref Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdiagnostic Ġ= ĠC one Cyc lic Type Bound ( type Parameter . symbol , Ġtype Parameter . bounds . to ImmutableList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Parameter . replace Bounds ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( error Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhas Sup ertype Path To Parameter ( ĊĠĠĠĠĠĠĠ Ġcurrent Type Parameter : ĠF ir Type Parameter , ĊĠĠĠĠĠĠĠ Ġtype Parameter : ĠF ir Type Parameter , ĊĠĠĠĠĠĠĠ Ġvisited : ĠMutable Set < F ir Type Parameter > ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( visited . isNotEmpty () Ġ&& Ġcurrent Type Parameter Ġ== Ġtype Parameter ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ(! visited . add ( current Type Parameter )) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcurrent Type Parameter . bounds . any Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Type Parameter Ġ= Ġit . cone Type Safe < Con e Type ParameterType >() ?. lookup Tag ?. type Parameter Symbol ?. fir Ġ?: Ġreturn @ any Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas Sup ertype Path To Parameter ( next Type Parameter , Ġtype Parameter , Ġvisited ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtransform Implicit Type Ref ( implicit Type Ref : ĠF ir Implicit Type Ref , Ġdata : ĠAny ?): ĠF ir Type Ref Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġimplicit Type Ref ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtransform Type Ref ( type Ref : ĠF ir Type Ref , Ġdata : ĠAny ?): ĠF ir Resolved Type Ref Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtype Resolver Transformer . with File ( current File ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ref . transform ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Resolver Transformer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠScope Class Declaration ( tower Scope , Ġclass Declarations Stack . last OrNull ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtransform Value Parameter ( value Parameter : ĠF ir Value Parameter , Ġdata : ĠAny ?): ĠF ir Statement Ġ{ ĊĠĠĠĠĠĠĠ Ġvalue Parameter . transform ReturnType Ref ( this , Ġdata ) ĊĠĠĠĠĠĠĠ Ġvalue Parameter . transform Annotations ( this , Ġdata ) ĊĠĠĠĠĠĠĠ Ġvalue Parameter . transform Var arg Type ToArray Type () ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue Parameter ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtransform Block ( block : ĠF ir Block , Ġdata : ĠAny ?): ĠF ir Statement Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġblock ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtransform Annotation ( annotation : ĠF ir Annotation , Ġdata : ĠAny ?): ĠF ir Statement Ġ{ ĊĠĠĠĠĠĠĠ Ġannotation . transform Annotation Type Ref ( this , Ġdata ) ĊĠĠĠĠĠĠĠ Ġreturn Ġannotation ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtransform Annotation Call ( annotation Call : ĠF ir Annotation Call , Ġdata : ĠAny ?): ĠF ir Statement Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtransform Annotation ( annotation Call , Ġdata ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< T > Ġwith Scope Cleanup ( cross inline Ġl : Ġ() Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsize Before Ġ= Ġscopes . size ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġl () ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġscopes . size ĊĠĠĠĠĠĠĠ Ġassert ( size Ġ>= Ġsize Before ) ĊĠĠĠĠĠĠĠ Ġrepeat ( size Ġ- Ġsize Before ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscopes . remove At ( scopes . last Index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġresolve Class Content ( ĊĠĠĠĠĠĠĠ Ġfir Class : ĠF ir Class , ĊĠĠĠĠĠĠĠ Ġdata : ĠAny ? ĊĠĠĠ Ġ): ĠF ir Statement Ġ{ ĊĊĠĠĠĠĠĠĠ Ġwith Scope Cleanup Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfir Class . transform Annotations ( this , Ġnull ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fir Class Ġis ĠF ir Regular Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfir Class . add Type Parameters Scope () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠConstruct ed Type Ref Ġshould Ġbe Ġresolved Ġonly Ġwith Ġtype Ġparameters , Ġbut Ġnot Ġwith Ġnested Ġclasses Ġand Ġclasses Ġfrom Ġsup ert ypes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( constructor Ġin Ġfir Class . declarations . filter Is Instance < F ir Constructor >()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor . deleg ated Constructor ?. let ( this :: resolve Construct ed Type Ref For Deleg ated Constructor Call ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwith Scope Cleanup Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ? ĠIs Ġit ĠOk Ġto Ġuse Ġoriginal Ġfile Ġsession Ġhere Ġ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuper Types Ġ= Ġlookup Super Types ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfir Class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlookup Interfaces Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeep Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubstitute Types Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse Site Session Ġ= Ġsession ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). as Re versed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( super Type Ġin Ġsuper Types ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper Type . lookup Tag . get Nested Classifier Scope ( session , Ġscope Session )?. let Ġ{ Ġnested Classifier Scope Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscope Ġ= Ġnested Classifier Scope . wrap Nested Classifier Scope With Substitution For Super Type ( super Type , Ġsession ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscopes . add ( scope ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession . nested Classifier Scope ( fir Class )?. let ( scopes :: add ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fir Class Ġis ĠF ir Regular Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcompanion Object Ġ= Ġfir Class . comp anion Object ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( comp anion Object Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession . nested Classifier Scope ( comp anion Object )?. let ( scopes :: add ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfir Class . add Type Parameters Scope () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNote Ġthat Ġannotations Ġare Ġstill Ġvisited Ġhere ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġagain , Ġalthough Ġthere 's Ġno Ġneed Ġin Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransform Element ( fir Class , Ġdata ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġresolve Construct ed Type Ref For Deleg ated Constructor Call ( ĊĠĠĠĠĠĠĠ Ġdeleg ated Constructor Call : ĠF ir Deleg ated Constructor Call ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdeleg ated Constructor Call . replace Construct ed Type Ref ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeleg ated Constructor Call . construct ed Type Ref . transform < F ir Type Ref , ĠAny ? >( this , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġdeleg ated Constructor Call . transform Cal lee Reference ( this , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠF ir Member Declaration . add Type Parameters Scope () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( type Parameters . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscopes . add ( F ir Member Type Parameter Scope ( this )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ