package Ġnor swap . uran ium . java . model . source Ċ import Ġnor swap . lang . Node Ċ import Ġnor swap . lang . java 8 . ast . ClassType Ċ import Ġnor swap . lang . java 8 . ast . Ctor Call Ċ import Ġnor swap . lang . java 8 . ast . Keyword Ċ import Ġnor swap . lang . java 8 . ast . Type Ċ import Ġnor swap . lang . java 8 . ast . Type Decl Ċ import Ġnor swap . lang . java 8 . ast . Type Decl Kind . AN NOT ATION Ċ import Ġnor swap . lang . java 8 . ast . Type Decl Kind . ENUM Ċ import Ġnor swap . lang . java 8 . ast . Type Decl Kind . INTERFACE Ċ import Ġnor swap . uran ium . java . Context Ċ import Ġnor swap . uran ium . java . model . Data Ċ import Ġnor swap . uran ium . java . model . Field Ċ import Ġnor swap . uran ium . java . model . K lass Ċ import Ġnor swap . uran ium . java . model . Method Ċ import Ġnor swap . uran ium . java . types . ParameterType Ċ import Ġnor swap . uran ium . java . types . Ref Type Ċ import Ġnor swap . uran ium . java . typing . resolve _ qualified _ type Ċ import Ġnor swap . uran ium . java . types . ClassType Ġas ĠClass T Ċ import Ġnor swap . utils . cast Ċ import Ġnor swap . utils . maybe _ list Ċ import Ġnor swap . utils . mult imap . Hash Multi Map Ċ import Ġnor swap . utils . mult imap . Multi Map Ċ import Ġnor swap . utils . mult imap . flat _ filter _ values Ċ import Ġnor swap . utils . pro claim Ċ import Ġnor swap . utils . range To Ċ Ċ // Ġnode Ġis ĠType Decl Ġor ĠC tor Call Ċ class ĠSource Class Ġ( val Ġnode : ĠNode , Ġoverride Ġval Ġouter : ĠScope , Ġval Ġindex : ĠInt ): ĠK lass (), ĠScope Ċ { ĊĠĠĠ Ġ// Ġ-------------------------------------------------------------------------------- ------------- ĊĊĠĠĠ Ġval Ġdecl Ġget () Ġ= Ġnode Ġas ĠType Decl ĊĠĠĠ Ġval Ġcall Ġget () Ġ= Ġnode Ġas ĠC tor Call ĊĊĠĠĠ Ġ// Ġ-------------------------------------------------------------------------------- ------------- ĊĊĠĠĠ Ġoverride Ġval Ġis _ anonymous ĊĠĠĠĠĠĠĠ Ġ= Ġnode Ġis ĠC tor Call ĊĊĠĠĠ Ġ// Ġ-------------------------------------------------------------------------------- ------------- ĊĊĠĠĠ Ġoverride Ġval Ġis _ local ĊĠĠĠĠĠĠĠ Ġ= Ġ! is _ anonymous Ġ&& Ġindex Ġ!= Ġ 0 ĊĊĠĠĠ Ġ// Ġ-------------------------------------------------------------------------------- ------------- ĊĊĠĠĠ Ġoverride Ġval Ġname Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġis _ anonymous Ġ-> Ġ"$ index " ĊĠĠĠĠĠĠĠ Ġis _ local ĠĠĠĠ Ġ-> Ġ"$ index " Ġ+ Ġdecl . name ĊĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠ Ġ-> Ġdecl . name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ-------------------------------------------------------------------------------- ------------- ĊĊĠĠĠ Ġ// ĠNOTE ( nor swap ): ĠThe Ġan on / local Ġchecks Ġbelow Ġare Ġin Ġcase Ġthe Ġuser Ġprovided Ġan Ġillegal Ġmodifier . ĊĊĠĠĠ Ġ// Ġ-------------------------------------------------------------------------------- ------------- ĊĊĠĠĠ Ġoverride Ġval Ġis _ nested ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ! is _ anonymous Ġ&& Ġouter Ġis ĠSource Class ĊĊĠĠĠ Ġ// Ġ-------------------------------------------------------------------------------- ------------- ĊĊĠĠĠ Ġoverride Ġval Ġstatic ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġif Ġ( is _ anonymous Ġ|| Ġis _ local ) Ġfalse Ġelse Ġdecl . mods . contains ( Keyword . static ) ĊĊĠĠĠ Ġ// Ġ-------------------------------------------------------------------------------- ------------- ĊĊĠĠĠ Ġoverride Ġval Ġis _ enum ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġif Ġ( is _ anonymous Ġ|| Ġis _ local ) Ġfalse Ġelse Ġdecl . kind Ġ== ĠEN UM ĊĊĠĠĠ Ġ// Ġ-------------------------------------------------------------------------------- ------------- ĊĊĠĠĠ Ġoverride Ġval Ġis _ interface ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġif Ġ( is _ anonymous Ġ|| Ġis _ local ) Ġfalse Ġelse Ġdecl . kind Ġ== ĠINTER FACE Ġ|| Ġdecl . kind Ġ== ĠAN NOT ATION ĊĊĠĠĠ Ġ// Ġ-------------------------------------------------------------------------------- ------------- ĊĊĠĠĠ Ġoverride Ġval Ġis _ annotation ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġif Ġ( is _ anonymous Ġ|| Ġis _ local ) Ġfalse Ġelse Ġdecl . kind Ġ== ĠAN NOT ATION ĊĊĠĠĠ Ġ// Ġ-------------------------------------------------------------------------------- ------------- ĊĊĠĠĠ Ġoverride Ġval Ġbinary _ name : ĠString ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġbinary _ name Ġ= Ġwhen Ġ( outer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFile Ġ Ġ-> Ġouter . pkg . prefix Ġ+ Ġname ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK lass Ġ-> Ġouter . binary _ name Ġ+ Ġ"$ " Ġ+ Ġname ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBlock Ġ-> Ġouter . inner most _ outer _ class . binary _ name Ġ+ Ġ"$ " Ġ+ Ġindex Ġ+ Ġif Ġ( this . is _ anonymous ) Ġ"" Ġelse Ġname ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠĠĠ Ġ-> Ġthrow ĠError (" unknown Ġscope Ġtype ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ-------------------------------------------------------------------------------- ------------- ĊĊĠĠĠ Ġ// ĠConstruct ed Ġby Ġvisitor s . ĊĠĠĠ Ġoverride Ġval Ġfields Ġ= Ġ ĠHashMap < String , ĠField >() ĊĊĠĠĠ Ġ// Ġ-------------------------------------------------------------------------------- ------------- ĊĊĠĠĠ Ġoverride Ġval Ġstatic _ fields : ĠMap < String , ĠField > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġfields . filter Values Ġ{ Ġit . static Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ-------------------------------------------------------------------------------- ------------- ĊĊĠĠĠ Ġ// ĠConstruct ed Ġby Ġvisitor s . ĊĠĠĠ Ġoverride Ġval Ġmethods Ġ= ĠHash Multi Map < String , ĠMethod >() ĊĊĠĠĠ Ġ// Ġ-------------------------------------------------------------------------------- ------------- ĊĊĠĠĠ Ġoverride Ġval Ġstatic _ methods : ĠMulti Map < String , ĠMethod > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġmethods . flat _ filter _ values Ġ{ Ġit . static Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ-------------------------------------------------------------------------------- ------------- ĊĊĠĠĠ Ġ// ĠConstruct ed Ġby Ġvisitor s . ĊĠĠĠ Ġoverride Ġval Ġconstructors Ġ= ĠArrayList < Source Constructor >() ĊĊĠĠĠ Ġ// Ġ-------------------------------------------------------------------------------- ------------- ĊĊĠĠĠ Ġ// ĠConstruct ed Ġby Ġvisitor s . ĊĠĠĠ Ġval Ġkl asses Ġ= ĠHashMap < String , ĠSource Class >() ĊĊĠĠĠ Ġ// Ġ-------------------------------------------------------------------------------- ------------- ĊĊĠĠĠ Ġval Ġstatic _ kl asses : ĠMap < String , ĠSource Class > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġkl asses . filter Values Ġ{ Ġit . static Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ-------------------------------------------------------------------------------- ------------- ĊĊĠĠĠ Ġoverride Ġval Ġclasses : ĠMap < String , ĠString > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġkl asses . map Values Ġ{ Ġit . value . binary _ name Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ-------------------------------------------------------------------------------- ------------- ĊĊĠĠĠ Ġoverride Ġval Ġstatic _ classes : ĠMap < String , ĠString > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġstatic _ kl asses . map Values Ġ{ Ġit . value . binary _ name Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ-------------------------------------------------------------------------------- ------------- ĊĊĠĠĠ Ġ// ĠConstruct ed Ġby Ġvisitor s . ĊĠĠĠ Ġoverride Ġval Ġtype _ parameters Ġ= ĠHashMap < String , ĠSource Type Parameter >() ĊĊĠĠĠ Ġ// Ġ-------------------------------------------------------------------------------- ------------- ĊĊĠĠĠ Ġoverride Ġval Ġenum _ constants : ĠMap < String , ĠSource Enum Constant >? ĊĠĠĠĠĠĠĠ Ġ= Ġ( is _ enum .. Ġ{ Ġfields . filter Values Ġ{ Ġit Ġis ĠSource Enum Constant Ġ} Ġ}). cast () ĊĊĠĠĠ Ġ// Ġ-------------------------------------------------------------------------------- ------------- ĊĊĠĠĠ Ġoverride Ġfun Ġsuperclass Ġ( ctx : ĠContext ): ĠK lass ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( node Ġis ĠC tor Call ) Ġ// Ġanonymous ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlookup _ super class ( node . type , Ġctx ) ĊĊĠĠĠĠĠĠĠ Ġpro claim Ġ( node Ġas ĠType Decl ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is _ interface ) Ġ// Ġsense less Ġquery ! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġctx . Object Class ĊĊĠĠĠĠĠĠĠ Ġif Ġ( node . extends . size Ġ== Ġ 0 ) Ġ// Ġno Ġextends Ġclause ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is _ enum ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġctx . Enum Class ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġctx . Object Class ĊĊĠĠĠĠĠĠĠ Ġreturn Ġlookup _ super class ( node . extends [ 0 ], Ġctx ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ-------------------------------------------------------------------------------- ------------- ĊĊĠĠĠ Ġprivate Ġfun Ġlookup _ super class Ġ( type : ĠType , Ġctx : ĠContext ): ĠK lass ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( type Ġ! is ĠClass Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . report (" Invalid Ġsuperclass Ġreference Ġ$ type Ġfor Ġ$ binary _ name ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġctx . Object Class ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsuperclass _ name Ġ= Ġtype . parts . map Ġ{ Ġit . name Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsuperclass Ġ= Ġresolve _ qualified _ type ( super class _ name , Ġctx ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( super class Ġ== Ġnull Ġ|| Ġsuperclass . is _ interface ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġctx . Object Class ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuperclass ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ-------------------------------------------------------------------------------- ------------- ĊĊĠĠĠ Ġoverride Ġfun Ġsuper interfaces Ġ( ctx : ĠContext ): ĠList < K lass > ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( node Ġis ĠC tor Call ) Ġ// Ġanonymous ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmaybe _ list ( lookup _ super interface ( node . type , Ġctx )) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper interfaces _ of _ named ( node Ġas ĠType Decl , Ġctx ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ-------------------------------------------------------------------------------- ------------- ĊĊĠĠĠ Ġfun Ġlookup _ super interface Ġ( type : ĠType , Ġctx : ĠContext ): ĠK lass ? ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( type Ġ! is ĠClass Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . report (" Invalid Ġsuper interface Ġreference Ġ$ type Ġfor Ġ$ binary _ name ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsuper interface _ name Ġ= Ġtype . parts . map Ġ{ Ġit . name Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsuper interface Ġ= Ġresolve _ qualified _ type ( super interface _ name , Ġctx ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( super interface ?. is _ interface Ġ== Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper interface ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ-------------------------------------------------------------------------------- ------------- ĊĊĠĠĠ Ġfun Ġsuper interfaces _ of _ named Ġ( node : ĠType Decl , Ġctx : ĠContext ): ĠList < K lass > ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= ĠArrayList < K lass >() ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is _ annotation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( ctx . Annotation Class ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġare Ġfor g iving Ġand Ġallow Ġ" implements " Ġon Ġinterfaces . ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġalso Ġallow Ġ" extends " Ġon Ġannotations . ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġerror ( s ) Ġwill Ġbe Ġreported Ġseparately Ġby Ġanother Ġcheck . ĊĠĠĠĠĠĠĠ Ġval Ġtypes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġif Ġ( is _ interface ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . extends Ġ+ Ġnode . implements ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . implements ĊĊĠĠĠĠĠĠĠ Ġtypes . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlookup _ super interface ( it , Ġctx )?. let Ġ{ Ġlist . add ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġlist ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ-------------------------------------------------------------------------------- ------------- ĊĊĠĠĠ Ġoverride Ġfun Ġouter _ class Ġ( ctx : ĠContext ): ĠK lass ? ĊĠĠĠĠĠĠĠ Ġ= Ġis _ nested Ġ.. Ġ{ Ġouter Ġas ĠSource Class Ġ} ĊĊĠĠĠ Ġ// Ġ-------------------------------------------------------------------------------- ------------- ĊĊĠĠĠ Ġoverride Ġfun Ġget _ data Ġ( name : ĠString ): ĠData ? ĊĠĠĠĠĠĠĠ Ġ= Ġfields [ name ] ĊĊĠĠĠ Ġ// Ġ-------------------------------------------------------------------------------- ------------- ĊĊĠĠĠ Ġoverride Ġfun Ġget _ method Ġ( name : ĠString ): ĠList < Method > ĊĠĠĠĠĠĠĠ Ġ= Ġmethods [ name ] Ġ?: Ġempty List () ĊĊĠĠĠ Ġ// Ġ-------------------------------------------------------------------------------- ------------- ĊĊĠĠĠ Ġ// ĠTODO Ġwhat Ġabout ĠClass T ' Ġparameters ? ĊĠĠĠ Ġ// ĠType Ġparameters Ġshadow Ġinner Ġclasses . ĊĠĠĠ Ġoverride Ġfun Ġget _ type Ġ( name : ĠString , Ġctx : ĠContext ): ĠRef Type ? ĊĠĠĠĠĠĠĠ Ġ= Ġtype _ parameters [ name ]?. let (:: ParameterType ) Ġ?: Ġkl asses [ name ]?. let Ġ{ ĠClass T ( it ) Ġ} ĊĊĠĠĠ Ġ// Ġ-------------------------------------------------------------------------------- ------------- ĊĊĠĠĠ Ġoverride Ġfun Ġklass Ġ( name : ĠString , Ġctx : ĠContext ): ĠK lass ? ĊĠĠĠĠĠĠĠ Ġ= Ġkl asses [ name ] ĊĊĠĠĠ Ġ// Ġ-------------------------------------------------------------------------------- ------------- Ċ }