/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 0 Ġ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 . idea . fir . low . level . api . api Ċ Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġorg . jetbrains . kotlin . fir . F ir Element Ċ import Ġorg . jetbrains . kotlin . fir . F ir Session Ċ import Ġorg . jetbrains . kotlin . fir . declarations .* Ċ import Ġorg . jetbrains . kotlin . fir . declarations . builder . build Property Accessor Copy Ċ import Ġorg . jetbrains . kotlin . fir . declarations . builder . build Property Copy Ċ import Ġorg . jetbrains . kotlin . fir . declarations . builder . build Simple Function Copy Ċ import Ġorg . jetbrains . kotlin . fir . expressions . F ir Return Expression Ċ import Ġorg . jetbrains . kotlin . fir . resolve . F ir Tower DataContext Ċ import Ġorg . jetbrains . kotlin . fir . symbols . impl . F ir Named Function Symbol Ċ import Ġorg . jetbrains . kotlin . fir . visitor s . F ir Visitor Void Ċ import Ġorg . jetbrains . kotlin . idea . fir . low . level . api . F ir Module Resolve State For Completion Ċ import Ġorg . jetbrains . kotlin . idea . fir . low . level . api . F ir Module Resolve State Impl Ċ import Ġorg . jetbrains . kotlin . idea . fir . low . level . api . element . builder . F ir Tower DataContext Collector Ċ import Ġorg . jetbrains . kotlin . idea . fir . low . level . api . providers . F ir Ide Provider Ċ import Ġorg . jetbrains . kotlin . idea . fir . low . level . api . providers . fir Ide Provider Ċ import Ġorg . jetbrains . kotlin . idea . util . getElement Text In Context Ċ import Ġorg . jetbrains . kotlin . psi . Kt Element Ċ import Ġorg . jetbrains . kotlin . psi . Kt Named Function Ċ import Ġorg . jetbrains . kotlin . psi . Kt Property Ċ Ċ object ĠLow Level F ir Api Facade For Completion Ġ{ ĊĠĠĠ Ġfun Ġget Resolve State For Completion ( original State : ĠF ir Module Resolve State ): ĠF ir Module Resolve State Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( original State Ġis ĠF ir Module Resolve State Impl ) ĊĠĠĠĠĠĠĠ Ġreturn ĠF ir Module Resolve State For Completion ( original State . project , Ġoriginal State ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠF ir Completion Context Ġinternal Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġval Ġsession : ĠF ir Session , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġto wer DataContext Collector : ĠF ir Tower DataContext Collector , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġget Tower DataContext ( element : ĠK t Element ): ĠF ir Tower DataContext Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcurrent : ĠPsi Element ? Ġ= Ġelement ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( current Ġis ĠK t Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto wer DataContext Collector . getContext ( current )?. let Ġ{ Ġreturn Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġcurrent . parent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" No Ġcontext Ġfor Ġ${ element . getElement Text In Context () }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild Completion Context For Function ( ĊĠĠĠĠĠĠĠ Ġfir File : ĠF ir File , ĊĠĠĠĠĠĠĠ Ġfake Element : ĠK t Named Function , ĊĠĠĠĠĠĠĠ Ġoriginal Element : ĠK t Named Function , ĊĠĠĠĠĠĠĠ Ġstate : ĠF ir Module Resolve State , ĊĠĠĠ Ġ): ĠF ir Completion Context Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfir Ide Provider Ġ= Ġfir File . session . fir Ide Provider ĊĊĠĠĠĠĠĠĠ Ġval Ġoriginal Function Ġ= Ġstate . get Or Build F ir For ( original Element ) Ġas ĠF ir Simple Function ĊĠĠĠĠĠĠĠ Ġval Ġcopy Function Ġ= Ġbuild Function Copy For Completion ( fir Ide Provider , Ġfake Element , Ġoriginal Function , Ġstate ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcontext Collector Ġ= ĠF ir Tower DataContext Collector () ĊĠĠĠĠĠĠĠ Ġstate . lazy Resolve Declaration For Completion ( copy Function , Ġfir File , Ġfir Ide Provider , ĠF ir Resolve Phase . BODY _ RESOL VE , Ġcontext Collector ) ĊĠĠĠĠĠĠĠ Ġstate . record Psi To F ir Mappings For Completion From ( copy Function , Ġfir File , Ġfake Element . containing Kt File ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠF ir Completion Context ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Function . session , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Collector ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild Completion Context For Property ( ĊĠĠĠĠĠĠĠ Ġfir File : ĠF ir File , ĊĠĠĠĠĠĠĠ Ġfake Element : ĠK t Property , ĊĠĠĠĠĠĠĠ Ġoriginal Element : ĠK t Property , ĊĠĠĠĠĠĠĠ Ġstate : ĠF ir Module Resolve State , ĊĠĠĠ Ġ): ĠF ir Completion Context Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfir Ide Provider Ġ= Ġfir File . session . fir Ide Provider ĊĊĠĠĠĠĠĠĠ Ġval Ġoriginal Property Ġ= Ġstate . get Or Build F ir For ( original Element ) Ġas ĠF ir Property ĊĠĠĠĠĠĠĠ Ġval Ġcopy Property Ġ= Ġbuild Property Copy For Completion ( fir Ide Provider , Ġfake Element , Ġoriginal Property , Ġstate ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcontext Collector Ġ= ĠF ir Tower DataContext Collector () ĊĠĠĠĠĠĠĠ Ġstate . lazy Resolve Declaration For Completion ( copy Property , Ġfir File , Ġfir Ide Provider , ĠF ir Resolve Phase . BODY _ RESOL VE , Ġcontext Collector ) ĊĠĠĠĠĠĠĠ Ġstate . record Psi To F ir Mappings For Completion From ( copy Property , Ġfir File , Ġfake Element . containing Kt File ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠF ir Completion Context ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Property . session , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Collector ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Function Copy For Completion ( ĊĠĠĠĠĠĠĠ Ġfir Ide Provider : ĠF ir Ide Provider , ĊĠĠĠĠĠĠĠ Ġelement : ĠK t Named Function , ĊĠĠĠĠĠĠĠ Ġoriginal Function : ĠF ir Simple Function , ĊĠĠĠĠĠĠĠ Ġstate : ĠF ir Module Resolve State ĊĠĠĠ Ġ): ĠF ir Simple Function Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilt Function Ġ= Ġfir Ide Provider . build Function With Body ( element , Ġoriginal Function ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġright Ġnow Ġwe Ġcan 't Ġresolve Ġbuilt Function Ġheader Ġproperly , Ġas Ġit Ġbuilt Ġright Ġin Ġair , ĊĠĠĠĠĠĠĠ Ġ// Ġwithout Ġfile , Ġwhich Ġis Ġnow Ġrequired Ġfor Ġrunning Ġstages Ġother Ġthen Ġbody Ġresolve , Ġso Ġwe ĊĠĠĠĠĠĠĠ Ġ// Ġtake Ġoriginal Ġfunction Ġheader Ġ( which Ġis Ġresolved ) Ġand Ġcopy Ġreplacing Ġbody Ġwith Ġbody Ġfrom Ġbuilt Function ĊĠĠĠĠĠĠĠ Ġreturn Ġbuild Simple Function Copy ( original Function ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= Ġbuilt Function . body ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol Ġ= Ġbuilt Function . symbol Ġas ĠF ir Named Function Symbol ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Phase Ġ= Ġmin Of ( original Function . resolve Phase , ĠF ir Resolve Phase . DECL AR ATIONS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= Ġbuilt Function . source ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession Ġ= Ġstate . root Module Session ĊĠĠĠĠĠĠĠ Ġ}. apply Ġ{ Ġre assign All Return Targets Ġ( built Function ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Property Copy For Completion ( ĊĠĠĠĠĠĠĠ Ġfir Ide Provider : ĠF ir Ide Provider , ĊĠĠĠĠĠĠĠ Ġelement : ĠK t Property , ĊĠĠĠĠĠĠĠ Ġoriginal Property : ĠF ir Property , ĊĠĠĠĠĠĠĠ Ġstate : ĠF ir Module Resolve State ĊĠĠĠ Ġ): ĠF ir Property Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilt Property Ġ= Ġfir Ide Provider . build Property With Body ( element , Ġoriginal Property ) ĊĊĠĠĠĠĠĠĠ Ġval Ġoriginal Setter Ġ= Ġoriginal Property . setter ĊĠĠĠĠĠĠĠ Ġval Ġbuilt Setter Ġ= Ġbuilt Property . setter ĊĊĠĠĠĠĠĠĠ Ġ// Ġsetter Ġhas Ġa Ġheader Ġwith Ġ` value ` Ġparameter , Ġand Ġwe Ġwant Ġit Ġtype Ġto Ġbe Ġresolved ĊĠĠĠĠĠĠĠ Ġval Ġcopy Setter Ġ= Ġif Ġ( original Setter Ġ!= Ġnull Ġ&& Ġbuilt Setter Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Property Accessor Copy ( original Setter ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= Ġbuilt Setter . body ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol Ġ= Ġbuilt Setter . symbol ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Phase Ġ= Ġmin Of ( built Setter . resolve Phase , ĠF ir Resolve Phase . DECL AR ATIONS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= Ġbuilt Setter . source ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession Ġ= Ġstate . root Module Session ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. apply Ġ{ Ġre assign All Return Targets ( built Setter ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilt Setter ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbuild Property Copy ( original Property ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol Ġ= Ġbuilt Property . symbol ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitializer Ġ= Ġbuilt Property . initializer ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġgetter Ġ= Ġbuilt Property . getter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetter Ġ= Ġcopy Setter ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Phase Ġ= Ġmin Of ( original Property . resolve Phase , ĠF ir Resolve Phase . DECL AR ATIONS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= Ġbuilt Property . source ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession Ġ= Ġstate . root Module Session ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun ĠF ir Function <* >. re assign All Return Targets ( from : ĠF ir Function <* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . accept ( object Ġ: ĠF ir Visitor Void () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Element ( element : ĠF ir Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element Ġis ĠF ir Return Expression Ġ&& Ġelement . target . labeled Element Ġ== Ġfrom ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . target . bind ( this @ re assign All Return Targets ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . accept Children ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} Ċ } Ċ