package Ġcom . pal ml ang . pal m . lang . pal m . frontend Ċ Ċ import Ġcom . pal ml ang . pal m . lang . common .* Ċ import Ġcom . pal ml ang . pal m . lang . common . frontend .* Ċ import Ġcom . pal ml ang . pal m . lang . common . frontend . lexer . Lexer Ċ import Ġcom . pal ml ang . pal m . lang . common . frontend . parser . Parser Ċ import Ġcom . pal ml ang . pal m . lang . common . util . Indexed Map Ċ import Ġcom . pal ml ang . pal m . lang . common . util . Mutable Indexed Map Ċ import Ġcom . pal ml ang . pal m . lang . pal m . frontend . analysis .* Ċ import Ġcom . pal ml ang . pal m . lang . pal m . frontend . lexer . lex File Ċ import Ġcom . pal ml ang . pal m . lang . pal m . frontend . parser .* Ċ import Ġcom . pal ml ang . pal m . lang . pal m . frontend . parser . Function Ċ Ċ class ĠP alm File Handler ( val Ġcontext : ĠCompilation Context ) Ġ: ĠFile Handler Ġ{ ĊĠĠĠ Ġprivate Ġval Ġroot Scope Ġ= ĠRoot Scope ( context . root Mod ) ĊĠĠĠ Ġprivate Ġval Ġdefault Imports Ġby Ġlazy Ġ{ ĠImport Scope ( rootScope , Ġcreate Default Imports ( context )) Ġ} ĊĊĠĠĠ Ġval Ġparent Ġ= ĠSet Query < Pal m AST Node , ĠP alm AST Node >() ĊĠĠĠ Ġval Ġfile Ġ= ĠSet Query < Pal m AST Node , ĠFile >() ĊĠĠĠ Ġval Ġvar Property Ġ= ĠSet Query < Identifier , ĠP alm Property Descriptor >() ĊĠĠĠ Ġval Ġproperty Vars Ġ= ĠSet Query < Property , ĠList < Pal m Var Descriptor >>() ĊĠĠĠ Ġval Ġmut ability Ġ= ĠSet Query < Identifier , ĠBoolean >() ĊĠĠĠ Ġval Ġmembers Ġ= ĠSet Query < Dec Body , ĠMembers >() ĊĊĠĠĠ Ġoverride Ġfun Ġhandle File ( module : ĠJ Module , Ġpath : ĠString , Ġcode : ĠString ): ĠFile Descriptor Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġpath . drop Last ( 5 ). split ('/ '). let Ġ{ Ġlist Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list . last () Ġ== Ġ" mod ") Ġlist . drop Last ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġlist ĊĠĠĠĠĠĠĠ Ġ}. let Ġ{ Ġlist Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . path Info From ( Module Path ( list )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġerrors Ġ= Ġmutable ListOf < Compilation Error >() ĊĊĠĠĠĠĠĠĠ Ġreturn ĠLex er ( code , Ġerrors ). also Ġ{ Ġit . lex File () Ġ}. let Ġ{ Ġlexer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠParser ( lexer . tokens , Ġcode , Ġlexer . poses , Ġlexer . errors , ĠP alm Node Types . Ign orable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġit . parse File ( module , Ġnode ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġparser Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġast Ġ= Ġparser . parse File ( module , Ġnode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Desc Ġ= ĠP alm FileDescriptor ( ast , Ġthis ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġast . forEach Pal m Child Ġ{ Ġprocess Node ( ast , Ġast , Ġit ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . error Handler . add ( file Desc . node , Ġerrors ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Desc ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Node ( file Node : ĠFile , Ġparent Node : ĠP alm AST Node , Ġnode : ĠP alm AST Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( node . nodeType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP alm Node Types . Dec Body Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Ġas ĠDec Body ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . imports ?. let Ġ{ Ġprocess Node ( file Node , Ġnode , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Statements ( file Node , Ġnode , Ġnode . statements ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP alm Node Types . Property Ġ-> Ġprocess Property ( node Ġas ĠProperty ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnode . forEach Pal m Child Ġ{ Ġprocess Node ( file Node , Ġnode , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġparent [ node ] Ġ= Ġparent Node ĊĠĠĠĠĠĠĠ Ġfile [ node ] Ġ= Ġfile Node ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Property ( property : ĠProperty ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvars Ġ= Ġmutable ListOf < Pal m Var Descriptor >() ĊĠĠĠĠĠĠĠ Ġval Ġdesc Ġ= ĠP alm Property Descriptor ( property , Ġthis @ Pal m File Handler ) ĊĠĠĠĠĠĠĠ Ġprocess Property Vars ( desc , Ġvars , Ġfalse , Ġproperty . pattern ) ĊĠĠĠĠĠĠĠ Ġproperty Vars [ property ] Ġ= Ġvars ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Property Vars ( ĊĠĠĠĠĠĠĠ Ġproperty : ĠP alm Property Descriptor , ĊĠĠĠĠĠĠĠ Ġlist : ĠMutable List < Pal m Var Descriptor >, ĊĠĠĠĠĠĠĠ Ġmutable : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġnode : ĠP alm AST Node ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( node . nodeType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP alm Node Types . Ident Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Ġas ĠIdentifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Property [ node ] Ġ= Ġproperty ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Ġ+= ĠP alm Var Descriptor ( node , Ġthis @ Pal m File Handler ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmut ability [ node ] Ġ= Ġmutable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP alm Node Types . Mutable Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Ġas ĠMutable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Property Vars ( property , Ġlist , Ġtrue , Ġnode . nested ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP alm Node Types . Property Dest ruct ure Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Ġas ĠProperty Dest ruct ure ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpattern Ġ= Ġnode . pattern ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pattern Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Property Vars ( property , Ġlist , Ġmutable , Ġnode . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Property Vars ( property , Ġlist , Ġmutable , Ġpattern ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnode . forEach Pal m Child Ġ{ Ġprocess Property Vars ( property , Ġlist , Ġmutable , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġname Of ( ident : ĠIdent Or Error ) Ġ= Ġwhen Ġ( ident . nodeType ) Ġ{ ĊĠĠĠĠĠĠĠ ĠP alm Node Types . Ident Ġ-> Ġ( ident Ġas ĠIdentifier ). text ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Statements ( file Node : ĠFile , Ġparent Node : ĠDec Body , Ġnode : ĠStatement List ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmutable Ġ= Ġmutable Map Of < String , ĠMutable Member >() ĊĠĠĠĠĠĠĠ Ġval Ġconstructors Ġ= Ġmutable ListOf < Pal m Constructor Descriptor >() ĊĠĠĠĠĠĠĠ Ġnode . list . forEach Ġ{ Ġchild Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Node ( file Node , Ġnode , Ġchild ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( child . nodeType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP alm Node Types . Class Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild Ġas ĠClass ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġname Of ( child . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmember Ġ= Ġmutable . compute If Absent ( name ) Ġ{ ĠMutable Member () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmember . type Ġ= ĠP alm Class Descriptor ( child , Ġthis @ Pal m File Handler ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP alm Node Types . Trait Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild Ġas ĠTrait ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġname Of ( child . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmember Ġ= Ġmutable . compute If Absent ( name ) Ġ{ ĠMutable Member () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmember . type Ġ= ĠP alm Trait Descriptor ( child , Ġthis @ Pal m File Handler ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP alm Node Types . Type Alias Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild Ġas ĠType Alias ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġname Of ( child . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmember Ġ= Ġmutable . compute If Absent ( name ) Ġ{ ĠMutable Member () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmember . type Ġ= ĠP alm Type Alias Descriptor ( child , Ġthis @ Pal m File Handler ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP alm Node Types . Function Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild Ġas ĠFunction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġname Of ( child . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmember Ġ= Ġmutable . compute If Absent ( name ) Ġ{ ĠMutable Member () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmember . functions Ġ+= ĠP alm Function Descriptor ( child , Ġthis @ Pal m File Handler ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP alm Node Types . Property Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Vars [ child Ġas ĠProperty ]. forEach Ġ{ Ġvariable Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġvariable . node . text ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmember Ġ= Ġmutable . compute If Absent ( name ) Ġ{ ĠMutable Member () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmember . variables Ġ+= Ġvariable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP alm Node Types . Primary Constructor , ĠP alm Node Types . Secondary Constructor Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructors Ġ+= Ġ( child Ġas ĠConstructor ). descriptor ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmembers [ parentNode ] Ġ= ĠMembers ( construct ors , Ġmutable . map Values Ġ{ Ġit . value . to Member () Ġ}) ĊĠĠĠĠĠĠĠ Ġfile [ node ] Ġ= Ġfile Node ĊĠĠĠĠĠĠĠ Ġparent [ node ] Ġ= Ġparent Node ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġfind Parent ( start Node : ĠP alm AST Node , Ġpred : Ġ( Pal m AST Node ) Ġ-> ĠBoolean ): ĠP alm AST Node ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġnode : ĠP alm AST Node ? Ġ= Ġstart Node ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( node Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pred ( node )) Ġreturn Ġnode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode Ġ= Ġparent [ node ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġconstructors : ĠQuery < Class , ĠList < Pal m Constructor Descriptor >> Ġ= ĠQuery Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠ Ġmutable ListOf < Pal m Constructor Descriptor >(). also Ġ{ Ġres Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . primary ?. let Ġ{ Ġres Ġ+= Ġit . descriptor ( this @ Pal m File Handler ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . body ?. let Ġ{ Ġres Ġ+= Ġmembers [ it ]. construct ors Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġouter Scope : ĠQuery < Pal m AST Node , ĠDec Body > Ġ= ĠCached Query Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠ Ġfind Parent ( node ) Ġ{ Ġit . nodeType Ġ== ĠP alm Node Types . Dec Body Ġ} Ġas ĠDec Body ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġouter Declaration : ĠQuery < Pal m AST Node , ĠDeclaration > Ġ= ĠCached Query Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠ Ġfind Parent ( node ) Ġ{ Ġit . nodeType Ġin ĠP alm Node Types . Declaration Ġ} Ġas ĠDeclaration ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġouter Type : ĠQuery < Pal m AST Node , ĠClass Or Trait ?> Ġ= ĠCached Query Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠ Ġouter Namespace [ node ] Ġas ? ĠClass Or Trait ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġouter Namespace : ĠQuery < Pal m AST Node , ĠNamespace > Ġ= ĠCached Query Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠ Ġvar Ġscoped Ġ= Ġouter Scoped [ node ] ĊĠĠĠĠĠĠĠ Ġwhile Ġ( scoped . nodeType Ġ== ĠP alm Node Types . Scope Lambda ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscoped Ġ= Ġouter Scoped [ scoped ] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġscoped Ġas ĠNamespace ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġouter Scoped : ĠQuery < Pal m AST Node , ĠScoped > Ġ= ĠCached Query Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠ Ġparent [ outer Scope [ node ]] Ġas ĠScoped ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġvisibility : ĠQuery < Declaration , ĠVisibility > Ġ= ĠCached Query Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġmodifiers Ġ= Ġnode . modifiers Ġ?: Ġreturn @ Cached Query ĠVisibility . Public ĊĠĠĠĠĠĠĠ Ġval Ġvisibility List Ġ= Ġmodifiers . list . filter Ġ{ Ġit . nodeType Ġin ĠP alm Node Types . Visibility Modifiers Ġ} ĊĠĠĠĠĠĠĠ Ġwhen Ġ( visibility List . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> ĠVisibility . Public ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvis Node Ġ= Ġvisibility List . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( vis Node . nodeType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP alm Node Types . Private Mod Ġ-> ĠVisibility . Private ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP alm Node Types . Protected Mod Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġouter Ġ= Ġouter Type [ node ] Ġ?: Ġreturn @ Cached Query ĠVisibility . Private Ġ// ĠTODO : ĠError ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVisibility . Protected ( outer . descriptor ( this @ Pal m File Handler )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP alm Node Types . Internal Mod Ġ-> ĠVisibility . Internal ( file [ node ]. j Module ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠVisibility . Public ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġstatic : ĠQuery < Declaration , ĠBoolean > Ġ= ĠCached Query Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠ Ġnode . modifiers ?. list ?. any Ġ{ Ġit . nodeType Ġ== ĠP alm Node Types . Static Mod Ġ} Ġ?: Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġis Override : ĠQuery < Declaration , ĠBoolean > Ġ= ĠCached Query Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠ Ġnode . modifiers ?. list ?. any Ġ{ Ġit . nodeType Ġ== ĠP alm Node Types . Override Mod Ġ} Ġ?: Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġmember Modal ity : ĠQuery < Declaration , ĠMod ality > Ġ= ĠCached Query Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠ Ġnode . modifiers ?. list ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . first OrNull Ġ{ Ġit . nodeType Ġin ĠP alm Node Types . Member Modal ity Modifiers Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it . nodeType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP alm Node Types . Open Mod Ġ-> ĠMod ality . Open ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP alm Node Types . Final Mod Ġ-> ĠMod ality . Final ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Should Ġnot Ġoccur ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġif Ġ( is Override [ node ]) ĠMod ality . Open Ġelse ĠMod ality . Final ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġtype Modal ity : ĠQuery < Declaration , ĠType Modal ity > Ġ= ĠCached Query Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠ Ġnode . modifiers ?. list ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . first OrNull Ġ{ Ġit . nodeType Ġin ĠP alm Node Types . Type Modal ity Modifiers Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it . nodeType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP alm Node Types . Open Mod Ġ-> ĠMod ality . Open ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP alm Node Types . Final Mod Ġ-> ĠMod ality . Final ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP alm Node Types . Se aled Mod Ġ-> ĠMod ality . Se aled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Should Ġnot Ġoccur ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: ĠMod ality . Final ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠChecks Ġagainst Ġclass Ġtype ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġclass Type : ĠQuery < Declaration , ĠClass Type > Ġ= ĠCached Query Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠ Ġnode . modifiers ?. list ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . first OrNull Ġ{ Ġit . nodeType Ġin ĠP alm Node Types . ClassType Modifiers Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it . nodeType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP alm Node Types . Unit Mod Ġ-> ĠClass Type . Unit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP alm Node Types . Data Mod Ġ-> ĠClass Type . Data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP alm Node Types . Annotation Mod Ġ-> ĠClass Type . Annotation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP alm Node Types . Abstract Mod Ġ-> ĠClass Type . Abstract ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Should Ġnot Ġoccur ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: ĠClass Type . Normal ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġstatic Members : ĠQuery < Scoped , ĠStatic Members > Ġ= ĠCached Query Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġmutable Map Of < String , ĠStatic Member >() ĊĠĠĠĠĠĠĠ Ġmembers [ node . body Ġ?: Ġreturn @ Cached Query Ġempty Map ()]. map . forEach Ġ{ Ġ( name , Ġmember ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunctions Ġ= Ġmember . functions . filter Ġ{ Ġit . static Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariable Ġ= Ġmember . variables . first OrNull Ġ{ Ġit . property . static Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(!( functions . isEmpty () Ġ&& Ġvariable Ġ== Ġnull Ġ&& Ġmember . type Ġ== Ġnull )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres [ name ] Ġ= ĠStatic Member ( name , Ġfunctions , Ġvariable , Ġmember . type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġres ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġtype Params : ĠQuery < Declaration , ĠIndexed Map < String , ĠP alm Type Var Descriptor >> Ġ= ĠCached Query Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= ĠMutable Indexed Map < String , ĠP alm Type Var Descriptor >() ĊĠĠĠĠĠĠĠ Ġnode . type Params ?. list ?. forEach Ġ{ Ġparam Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġname Of ( param . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġres . add ( name , ĠP alm Type Var Descriptor ( param , Ġthis @ Pal m File Handler )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġres ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġvirtual Members : ĠQuery < Scoped , ĠVirtual Members > Ġ= ĠCached Query Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġmutable Map Of < String , ĠVirtual Member >() ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠPrimary Ġparams ĊĠĠĠĠĠĠĠ Ġmembers [ node . body Ġ?: Ġreturn @ Cached Query Ġres ]. map . forEach Ġ{ Ġ( name , Ġmember ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunctions Ġ= Ġmember . functions . filter Ġ{ Ġ! it . static Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariable Ġ= Ġmember . variables . first OrNull Ġ{ Ġ! it . property . static Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(!( functions . isEmpty () Ġ&& Ġvariable Ġ== Ġnull )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres [ name ] Ġ= ĠVirtual Member ( name , Ġfunctions , Ġvariable ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġres ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġtype Alias Type Ġ= ĠCached Query < Type Alias , ĠType Instance Pair > Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠCheck Ġcycles ĊĠĠĠĠĠĠĠ Ġnode . result . to Type Instance ( import Scope [ outer Namespace [ node ]], Ġcontext , Ġthis @ Pal m File Handler ). resolved ( context ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġtype Param Scope : ĠQuery < Declaration , ĠType Var Scope > Ġ= ĠCached Query Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠ Ġcreate Type Var Scope ( import Scope [ outer Namespace [ node ]], Ġnode , Ġthis @ Pal m File Handler ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġtype Scope : ĠQuery < Class Or Trait , ĠVirtual Scope > Ġ= ĠCached Query Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠ ĠVirtual Scope ( type Param Scope [ node ], Ġnode . descriptor ( this @ Pal m File Handler ), Ġcontext ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġns Scope : ĠQuery < Scoped , ĠScope > Ġ= ĠCached Query Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠ Ġwhen Ġ( node . nodeType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP alm Node Types . File Ġ-> ĠFile SS cope ( default Imports , Ġ( node Ġas ĠFile ). node ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin ĠP alm Node Types . Class Or Trait Ġ-> ĠStatic Scope ( type Scope [ node Ġas ĠClass Or Trait ], Ġstatic Members [ node ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠStatic Scope ( get ( outer Scoped [ node ]), Ġstatic Members [ node ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġimport Scope : ĠQuery < Scoped , ĠImport Scope > Ġ= ĠCached Query Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġnearest NS Ġ= Ġif Ġ( node . nodeType Ġ== ĠP alm Node Types . Scope Lambda ) Ġouter Namespace [ node ] Ġelse Ġnode Ġas ĠNamespace ĊĠĠĠĠĠĠĠ Ġcreate Pal m Import Scope ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġns Scope [ node ], ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnearest NS . descriptor ( this @ Pal m File Handler ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Pal m File Handler , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġun filtered Direct Sup ert ypes : ĠQuery < Class Or Trait , ĠList < Type Instance Pair >> Ġ= ĠCached Query Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġscope Ġ= Ġtype Param Scope [ node ] ĊĠĠĠĠĠĠĠ Ġval Ġsuper Types Ġ= Ġnode . super Types Ġ?: Ġreturn @ Cached Query Ġempty List () ĊĊĠĠĠĠĠĠĠ Ġsuper Types . list . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . type . to Type Instance ( scope , Ġcontext , Ġthis @ Pal m File Handler ). resolved ( context ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠHandle Ġresolution Ġdifferently Ġto Ġprevent Ġstar - projects Ġand Ġwith Ġthat Ġrecursive Ġissues ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġun filtered Direct Sup ert ypes Query : ĠQuery < Class Or Trait , ĠList < Super Type Instance >> Ġ= ĊĠĠĠĠĠĠĠ ĠCached Query Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstances Ġ= Ġun filtered Direct Sup ert ypes [ node ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( instances . isEmpty ()) ĠlistOf ( Type Instance . Def ( context . builtin Types . any , Ġempty Map (), Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġinstances . map NotNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġtype Type Ġ= Ġit . resolved ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠType Instance . Error Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠType Instance . Def Ġ-> Ġwhen Ġ( val Ġsuper Desc Ġ= Ġtype Type . desc ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠClass Or Trait Descriptor Ġ-> ĠType Instance . Def ( super Desc , Ġtype Type . args , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠType Variable Descriptor Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠType Instance . Context Fun Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠType Instance . Union Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠType Instance . Var Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġtype Param Variance : ĠQuery < Type Param , ĠVari ance > Ġ= ĠCached Query Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠ Ġwhen Ġ( node . variance ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP alm Node Types . In Ġ-> ĠVari ance . In ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP alm Node Types . Out Ġ-> ĠVari ance . Out ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠVari ance . None ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġdeclaration Type Var Bounds : ĠQuery < Declaration , ĠMap < Type Variable Descriptor , ĠResolved Type Instance >> Ġ= ĊĠĠĠĠĠĠĠ ĠCached Query Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Type Param Types ( context , Ġthis @ Pal m File Handler , Ġtype Param Scope [ node ], Ġnode ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġtype Var Bound : ĠQuery < Type Param , ĠResolved Type Instance > Ġ= ĠCached Query Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠ Ġdeclaration Type Var Bounds [ outer Declaration [ node ]][ node . descriptor ( this @ Pal m File Handler )] !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġparam Header : ĠQuery < Parameterized , ĠParams Header > Ġ= ĠCached Query Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġscope Ġ= Ġtype Param Scope [ node ] ĊĠĠĠĠĠĠĠ Ġval Ġtype Vars Ġ= Ġtype Params [ node ]. values ĊĠĠĠĠĠĠĠ Ġval Ġbounds Ġ= Ġtype Vars . map Ġ{ Ġit . bound Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcontext Params Ġ= Ġnode . context ?. types ?. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . to Type Instance ( scope , Ġcontext , Ġthis @ Pal m File Handler ). resolved ( context ) ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġempty List () ĊĊĠĠĠĠĠĠĠ Ġval Ġnormal Params Ġ= Ġwhen Ġ( node . nodeType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP alm Node Types . Function Ġ-> Ġ( node Ġas ĠFunction ). params . list . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . type ?. to Type Instance ( scope , Ġcontext , Ġthis @ Pal m File Handler )?. resolved ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġresolved ErrorType Instance ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP alm Node Types . Secondary Constructor Ġ-> Ġ( node Ġas ĠFunction ). params . list . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . type ?. to Type Instance ( scope , Ġcontext , Ġthis @ Pal m File Handler )?. resolved ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġresolved ErrorType Instance ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP alm Node Types . Primary Constructor Ġ-> Ġ( node Ġas ĠFunction ). params . list . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . type ?. to Type Instance ( scope , Ġcontext , Ġthis @ Pal m File Handler )?. resolved ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġresolved ErrorType Instance ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Should Ġnot Ġoccur ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠParams Header ( type Vars , Ġbounds , Ġcontext Params , Ġnormal Params ) ĊĠĠĠ Ġ} Ċ }