/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 5 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . idea . cache s . resolve Ċ Ċ import Ġorg . jetbrains . kotlin . psi . Jet Element Ċ import Ġorg . jetbrains . kotlin . psi . Jet File Ċ import Ġcom . intellij . psi . util . Psi Tree Util Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġorg . jetbrains . kotlin . analyzer . Analysis Result Ċ import Ġcom . intellij . psi . util . Cached Values Manager Ċ import Ġorg . jetbrains . kotlin . diagnostics . Diagnostic Utils Ċ import Ġcom . intellij . util . containers . SL RU Cache Ċ import Ġcom . intellij . psi . util . Psi Modification Tracker Ċ import Ġcom . intellij . openapi . project . D umb Service Ċ import Ġorg . jetbrains . kotlin . resolve . Delegating Binding Trace Ċ import Ġorg . jetbrains . kotlin . context . Simple Global Context Ċ import Ġorg . jetbrains . kotlin . resolve . Top Down Analysis Parameters Ċ import Ġcom . intellij . openapi . progress . Process Canceled Exception Ċ import Ġcom . intellij . psi . util . Cached Value Provider Ċ import Ġorg . jetbrains . kotlin . as Java . Light Class Util Ċ import Ġorg . jetbrains . kotlin . resolve . Library Source H acks Ċ import Ġorg . jetbrains . kotlin . idea . project . Target Platform Ċ import Ġorg . jetbrains . kotlin . idea . project . Resolve Session For B odies Ċ import Ġjava . util . HashMap Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġorg . jetbrains . kotlin . resolve . Binding Context Ċ import Ġorg . jetbrains . kotlin . psi . Jet Named Function Ċ import Ġorg . jetbrains . kotlin . psi . Jet Class Initializer Ċ import Ġorg . jetbrains . kotlin . psi . Jet Property Ċ import Ġorg . jetbrains . kotlin . psi . Jet Import Directive Ċ import Ġorg . jetbrains . kotlin . psi . Jet Annotation Entry Ċ import Ġorg . jetbrains . kotlin . psi . Jet Type Constraint Ċ import Ġorg . jetbrains . kotlin . psi . Jet Package Directive Ċ import Ġorg . jetbrains . kotlin . psi . Jet Psi Util Ċ import Ġorg . jetbrains . kotlin . psi . Jet Declaration Ċ import Ġorg . jetbrains . kotlin . resolve . Composite Binding Context Ċ import Ġorg . jetbrains . kotlin . psi . Jet Parameter Ċ import Ġorg . jetbrains . kotlin . psi . Jet Deleg ation Specifier List Ċ import Ġorg . jetbrains . kotlin . psi . Jet Type Parameter Ċ import Ġorg . jetbrains . kotlin . psi . Jet Class Or Object Ċ import Ġorg . jetbrains . kotlin . psi . Jet Callable Declaration Ċ import Ġorg . jetbrains . kotlin . psi . Jet Code Fragment Ċ import Ġorg . jetbrains . kotlin . psi . Jet Expression Ċ import Ġorg . jetbrains . kotlin . analyzer . analyze In Context Ċ import Ġorg . jetbrains . kotlin . resolve . Binding Trace Context Ċ import Ġorg . jetbrains . kotlin . types . Type Utils Ċ import Ġorg . jetbrains . kotlin . resolve . scopes . Chain ed Scope Ċ import Ġorg . jetbrains . kotlin . resolve . binding Context Util . getData Flow Info Ċ import Ġorg . jetbrains . kotlin . di . Injector For Lazy Body Resolve Ċ import Ġorg . jetbrains . kotlin . idea . project . Target Platform Detector Ċ import Ġorg . jetbrains . kotlin . resolve . lazy . descriptors . Lazy Class Descriptor Ċ import Ġorg . jetbrains . kotlin . resolve . calls . smart casts . Data Flow Info Ċ import Ġorg . jetbrains . kotlin . resolve . scopes . Jet Scope Ċ import Ġorg . jetbrains . kotlin . resolve . lazy . Body Resolve Mode Ċ import Ġcom . intellij . openapi . project . Index Not Ready Exception Ċ import Ġorg . jetbrains . kotlin . psi . Jet Block Expression Ċ Ċ public Ġtrait ĠCache Extension < T > Ġ{ ĊĠĠĠ Ġpublic Ġval Ġplatform : ĠTarget Platform ĊĠĠĠ Ġpublic Ġfun ĠgetData ( resolver Provider : ĠModule Resolver Provider ): ĠT Ċ } Ċ Ċ private Ġclass ĠKotlin Resolve Cache ( ĊĠĠĠĠĠĠĠ Ġval Ġproject : ĠProject , ĊĠĠĠĠĠĠĠ Ġcompute Module Resolver Provider : Ġ() Ġ-> ĠCached Value Provider . Result < Module Resolver Provider > Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġresolver Cache Ġ= ĠSynchron ized Cached Value ( project , Ġcompute Module Resolver Provider , Ġtrack Value Ġ= Ġfalse ) ĊĊĠĠĠ Ġval Ġmodule Resolver Provider : ĠModule Resolver Provider ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġresolver Cache . getValue () ĊĊĠĠĠ Ġpublic Ġfun Ġget Lazy Resolve Session ( element : ĠJet Element ): ĠResolve Session For B odies Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmodule Resolver Provider . resolve Session For B odies By Module ( element . getModule Info ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġ< T > Ġget ( extension : ĠCache Extension < T >): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġextension . getData ( module Resolver Provider ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġanalysis Results Ġ= ĠCached Values Manager . getManager ( project ). create Cached Value ( ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresolver Provider Ġ= Ġmodule Resolver Provider ĊĠĠĠĠĠĠĠ Ġval Ġresults Ġ= Ġobject Ġ: ĠS LR U Cache < Jet File , ĠPer File Analysis Cache >( 2 , Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate Value ( file : ĠJet File ?): ĠPer File Analysis Cache Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPer File Analysis Cache ( file !! , Ġresolver Provider . resolve Session For B odies By Module ( file . getModule Info ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠCached Value Provider . Result ( results , ĠPsi Modification Tracker . MO DIF ICATION _ COUNT , Ġresolver Provider . exception Tracker ) ĊĠĠĠ Ġ}, Ġfalse ) ĊĊĠĠĠ Ġfun Ġget Analysis Results For Elements ( elements : ĠCollection < Jet Element >): ĠAnalysis Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsl ru Cache Ġ= Ġsynchronized ( analysis Results ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanalysis Results . getValue () !! ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġresults Ġ= Ġelements . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġper File Cache Ġ= Ġsynchronized ( sl ru Cache ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsl ru Cache [ it . get Containing Jet File ()] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġper File Cache . get Analysis Results ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġwith Error Ġ= Ġresults . first OrNull Ġ{ Ġit . isError () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġbinding Context Ġ= ĠComposite Binding Context . create ( results . map Ġ{ Ġit . binding Context Ġ}) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( with Error Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAnalysis Result . error ( binding Context , Ġwith Error . error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO : Ġ( module Ġrefactoring ) Ġseveral Ġelements Ġare Ġpassed Ġhere Ġin Ġdebugger ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAnalysis Result . success ( binding Context , Ġget Lazy Resolve Session ( elements . first ()). getModule Descriptor ()) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠPer File Analysis Cache ( val Ġfile : ĠJet File , Ġval Ġresolve Session : ĠResolve Session For B odies ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġcache Ġ= ĠHashMap < Psi Element , ĠAnalysis Result >() ĊĊĠĠĠ Ġprivate Ġfun Ġlook Up ( analy z ableElement : ĠJet Element ): ĠAnalysis Result ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠLooking Ġfor Ġparent Ġelements Ġthat Ġare Ġalready Ġanalyzed ĊĠĠĠĠĠĠĠ Ġ// ĠAlso Ġremoving Ġall Ġelements Ġwhose Ġparents Ġare Ġalready Ġanalyzed , Ġto Ġguarantee Ġconsistency ĊĠĠĠĠĠĠĠ Ġval Ġdesc endants Of Current Ġ= Ġarray ListOf < Psi Element >() ĊĠĠĠĠĠĠĠ Ġval Ġto Remove Ġ= Ġhash Set Of < Psi Element >() ĊĊĠĠĠĠĠĠĠ Ġvar Ġcurrent : ĠPsi Element ? Ġ= Ġanaly z ableElement ĊĠĠĠĠĠĠĠ Ġvar Ġresult : ĠAnalysis Result ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġwhile Ġ( current Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcached Ġ= Ġcache [ current ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cached Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġcached ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Remove . addAll ( desc endants Of Current ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdesc endants Of Current . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdesc endants Of Current . add ( current !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġcurrent !!. getParent () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcache . keySet (). removeAll ( to Remove ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Analysis Results ( element : ĠJet Element ): ĠAnalysis Result Ġ{ ĊĠĠĠĠĠĠĠ Ġassert Ġ( element . get Containing Jet File () Ġ== Ġfile , Ġ" Wrong Ġfile . ĠExpected Ġ$ file , Ġbut Ġwas Ġ${ element . get Containing Jet File () }") ĊĊĠĠĠĠĠĠĠ Ġval Ġanaly z able Parent Ġ= ĠKotlin Resolve DataProvider . find Analy z able Parent ( element ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsynchronized ( this ) Ġ{ Ġ(): ĠAnalysis Result Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcached Ġ= Ġlook Up ( analy z able Parent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cached Ġ!= Ġnull ) Ġreturn @ synchronized Ġcached ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġanalyze ( analy z able Parent ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache [ analy z able Parent ] Ġ= Ġresult ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ synchronized Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġanalyze ( analy z ableElement : ĠJet Element ): ĠAnalysis Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproject Ġ= Ġanaly z ableElement . getProject () ĊĠĠĠĠĠĠĠ Ġif Ġ( D umb Service . is D umb ( project )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAnalysis Result . EMPTY ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠKotlin Resolve DataProvider . analyze ( project , Ġresolve Session , Ġanaly z ableElement ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠProcess Canceled Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠIndex Not Ready Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDiagnostic Utils . throw If Running On Server ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . error ( e ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAnalysis Result . error ( Binding Context . EMPTY , Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġobject ĠKotlin Resolve DataProvider Ġ{ ĊĠĠĠ Ġprivate Ġval Ġtop most Element Types Ġ= Ġarray < Class < out ĠPsi Element ?> ? >( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjava Class < Jet Named Function >(), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjava Class < Jet Class Initializer >(), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjava Class < Jet Property >(), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjava Class < Jet Import Directive >(), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjava Class < Jet Package Directive >(), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjava Class < Jet Code Fragment >(), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠNon - analy z able Ġso Ġfar , Ġadd Ġmore Ġgran ular Ġanalysis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjava Class < Jet Annotation Entry >(), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjava Class < Jet Type Constraint >(), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjava Class < Jet Deleg ation Specifier List >(), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjava Class < Jet Type Parameter >(), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjava Class < Jet Parameter >() ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġfun Ġfind Analy z able Parent ( element : ĠJet Element ): ĠJet Element Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtop most Element Ġ= ĠJet Psi Util . get Top most Parent Of Types ( element , Ġ* top most Element Types ) Ġas ĠJet Element ? ĊĠĠĠĠĠĠĠ Ġ// Ġparameters Ġand Ġsup ertype Ġlists Ġare Ġnot Ġanaly z able Ġby Ġthemselves , Ġbut Ġif Ġwe Ġdon 't Ġcount Ġthem Ġas Ġtop most , Ġwe 'll Ġstop Ġinside , Ġsay , ĊĠĠĠĠĠĠĠ Ġ// Ġobject Ġexpressions Ġinside Ġarguments Ġof Ġsuper Ġconstructors Ġof Ġclasses Ġ( note Ġthat Ġclasses Ġthemselves Ġare Ġnot Ġtop most Ġelements ) ĊĠĠĠĠĠĠĠ Ġval Ġanaly z ableElement Ġ= Ġwhen Ġ( top most Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠJet Annotation Entry , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠJet Type Constraint , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠJet Deleg ation Specifier List , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠJet Type Parameter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠJet Parameter Ġ-> ĠPsi Tree Util . getParent OfType ( top most Element , Ġjava Class < Jet Class Or Object >(), Ġjava Class < Jet Callable Declaration >()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtop most Element ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġanaly z ableElement ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġnone Ġof Ġthe Ġabove Ġworked , Ġtake Ġthe Ġout erm ost Ġdeclaration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠPsi Tree Util . get Top most Parent OfType ( element , Ġjava Class < Jet Declaration >()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġeven Ġthat Ġdidn 't Ġwork , Ġtake Ġthe Ġwhole Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġelement . get Containing Jet File () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġanalyze ( project : ĠProject , Ġresolve Session : ĠResolve Session For B odies , Ġanaly z ableElement : ĠJet Element ): ĠAnalysis Result Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( analy z ableElement Ġis ĠJet Code Fragment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAnalysis Result . success ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanalyze Expression Code Fragment ( resolve Session , Ġanaly z ableElement ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Session . getModule Descriptor () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġanaly z ableElement . get Containing Jet File () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Light Class Util . belongsTo Kotlin Built Ins ( file ) Ġ|| Ġfile . getModule Info () Ġis ĠLibrary Source Info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLibrary Ġsources : Ġmark Ġfile Ġto Ġskip ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . put UserData ( Library Source H acks . SKIP _ TOP _ LEVEL _ MEMBER S , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtrace Ġ= ĠDeleg ating Binding Trace ( resolve Session . get Binding Context (), Ġ" Trace Ġfor Ġresolution Ġof Ġ" Ġ+ Ġanaly z ableElement ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Platform Ġ= ĠTarget Platform Detector . get Platform ( analy z ableElement . get Containing Jet File ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlazy Top Down Analyzer Ġ= ĠInject or For Lazy Body Resolve ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSimple Global Context ( resolve Session . get Storage Manager (), Ġresolve Session . get Exception Tracker ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Session , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrace , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Platform . getAdditional Checker Provider (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Platform . get Dynamic Types Settings () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). get Lazy Top Down Analyzer For TopLevel () !! ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlazy Top Down Analyzer . analyze Declarations ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTop Down Analysis Parameters . create ( resolve Session . get Storage Manager (), Ġresolve Session . get Exception Tracker (), Ġfalse , Ġfalse ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( analy z ableElement ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAnalysis Result . success ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrace . get Binding Context (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Session . getModule Descriptor () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠProcess Canceled Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠIndex Not Ready Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDiagnostic Utils . throw If Running On Server ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . error ( e ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAnalysis Result . error ( Binding Context . EMPTY , Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġanalyze Expression Code Fragment ( resolve Session : ĠResolve Session For B odies , Ġcode Fragment : ĠJet Code Fragment ): ĠBinding Context Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Fragment Expression Ġ= Ġcode Fragment . getContent Element () ĊĠĠĠĠĠĠĠ Ġif Ġ( code Fragment Expression Ġ! is ĠJet Expression ) Ġreturn ĠBinding Context . EMPTY ĊĊĠĠĠĠĠĠĠ Ġval Ġcontext Element Ġ= Ġcode Fragment . getContext () ĊĊĠĠĠĠĠĠĠ Ġval Ġscope For Context Element : ĠJet Scope ? ĊĠĠĠĠĠĠĠ Ġval Ġdata Flow Info : ĠData Flow Info ĊĠĠĠĠĠĠĠ Ġif Ġ( context Element Ġis ĠJet Class Or Object ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġresolve Session . resolve To Descriptor ( context Element ) Ġas ĠLazy Class Descriptor ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope For Context Element Ġ= Ġdescriptor . get Scope For Member Declaration Resolution () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Flow Info Ġ= ĠData Flow Info . EMPTY ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( context Element Ġis ĠJet Block Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Context Element Ġ= Ġcontext Element . getState ments (). last OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Context Element Ġ! is ĠJet Expression ) Ġreturn ĠBinding Context . EMPTY ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontext For Element Ġ= Ġnew Context Element . get Resolution Facade (). analyze ( new Context Element , ĠBody Resolve Mode . FULL ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope For Context Element Ġ= Ġcontext For Element [ Binding Context . RESOL UTION _ SCOPE , Ġnew Context Element ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Flow Info Ġ= Ġcontext For Element . getData Flow Info ( new Context Element ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( context Element Ġ! is ĠJet Expression ) Ġreturn ĠBinding Context . EMPTY ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontext For Element Ġ= Ġcontext Element . get Resolution Facade (). analyze ( context Element , ĠBody Resolve Mode . PAR TIAL _ FOR _ COMP LE TION ) Ġ// TODO : Ġdiscuss Ġit ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope For Context Element Ġ= Ġcontext For Element [ Binding Context . RESOL UTION _ SCOPE , Ġcontext Element ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Flow Info Ġ= Ġcontext For Element . getData Flow Info ( context Element ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( scope For Context Element Ġ== Ġnull ) Ġreturn ĠBinding Context . EMPTY ĊĊĠĠĠĠĠĠĠ Ġval Ġcode Fragment Scope Ġ= Ġresolve Session . get Scope Provider (). getFile Scope ( code Fragment ) ĊĠĠĠĠĠĠĠ Ġval Ġchained Scope Ġ= ĠCh ained Scope ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope For Context Element . get Containing Declaration (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Scope Ġfor Ġresolve Ġcode Ġfragment ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope For Context Element , Ġcode Fragment Scope ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcode Fragment Expression . analyze In Context ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchained Scope , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBinding Trace Context (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Flow Info , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType Utils . NO _ EXPECTED _ TYPE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Session . getModule Descriptor () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ