/* Ċ Ġ* ĠF used Po jo TypeDescriptor . kt Ċ Ġ* ĠCopyright ĠÂ© Ġ 1 9 9 3 - 2 0 2 1 , ĠThe ĠAv ail ĠFoundation , ĠLLC . Ċ Ġ* ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠRedistribution Ġand Ġuse Ġin Ġsource Ġand Ġbinary Ġforms , Ġwith Ġor Ġwithout Ċ Ġ* Ġmodification , Ġare Ġpermitted Ġprovided Ġthat Ġthe Ġfollowing Ġconditions Ġare Ġmet : Ċ Ġ* Ċ Ġ* Ġ* ĠRedistributions Ġof Ġsource Ġcode Ġmust Ġretain Ġthe Ġabove Ġcopyright Ġnotice , Ġthis Ċ Ġ* ĠĠ Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer . Ċ Ġ* Ċ Ġ* Ġ* ĠRedistributions Ġin Ġbinary Ġform Ġmust Ġreproduce Ġthe Ġabove Ġcopyright Ġnotice , Ċ Ġ* ĠĠ Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer Ġin Ġthe Ġdocumentation Ċ Ġ* ĠĠ Ġand / or Ġother Ġmaterials Ġprovided Ġwith Ġthe Ġdistribution . Ċ Ġ* Ċ Ġ* Ġ* ĠNeither Ġthe Ġname Ġof Ġthe Ġcopyright Ġholder Ġnor Ġthe Ġnames Ġof Ġthe Ġcontributors Ċ Ġ* ĠĠ Ġmay Ġbe Ġused Ġto Ġendorse Ġor Ġpromote Ġproducts Ġderived Ġfrom Ġthis Ġsoftware Ċ Ġ* ĠĠ Ġwithout Ġspecific Ġprior Ġwritten Ġpermission . Ċ Ġ* Ċ Ġ* ĠTHIS ĠSOFTWARE ĠIS ĠPROVIDED ĠBY ĠTHE ĠCOPYRIGHT ĠHOLDERS ĠAND ĠCONTRIBUTORS Ġ" AS ĠIS " Ċ Ġ* ĠAND ĠANY ĠEXPRESS ĠOR ĠIMPLIED ĠWARRANTIES , ĠINCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠTHE Ċ Ġ* ĠIMPLIED ĠWARRANTIES ĠOF ĠMERCHANTABILITY ĠAND ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE Ċ Ġ* ĠARE ĠDISCLAIMED . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠCOPYRIGHT ĠHOLDER ĠOR ĠCONTRIBUTORS ĠBE Ċ Ġ* ĠLIABLE ĠFOR ĠANY ĠDIRECT , ĠINDIRECT , ĠINCIDENTAL , ĠSPECIAL , ĠEXEMPLARY , ĠOR Ċ Ġ* ĠCONSEQUENTIAL ĠDAMAGES Ġ( INCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠPROCUREMENT ĠOF Ċ Ġ* ĠSUBSTITUTE ĠGOODS ĠOR ĠSERVICES ; ĠLOSS ĠOF ĠUSE , ĠDATA , ĠOR ĠPROFITS ; ĠOR ĠBUSINESS Ċ Ġ* ĠINTERRUPTION ) ĠHOWEVER ĠCAUSED ĠAND ĠON ĠANY ĠTHEORY ĠOF ĠLIABILITY , ĠWHETHER ĠIN Ċ Ġ* ĠCONTRACT , ĠSTRICT ĠLIABILITY , ĠOR ĠTORT Ġ( INCLUDING ĠNEGLIGENCE ĠOR ĠOTHERWISE ) Ċ Ġ* ĠARISING ĠIN ĠANY ĠWAY ĠOUT ĠOF ĠTHE ĠUSE ĠOF ĠTHIS ĠSOFTWARE , ĠEVEN ĠIF ĠADVISED ĠOF ĠTHE Ċ Ġ* ĠPOSSIBILITY ĠOF ĠSUCH ĠDAMAGE . Ċ Ġ*/ Ċ package Ġcom . avail . descriptor . types Ċ Ċ import Ġcom . avail . annotations . Thread Safe Ċ import Ġcom . avail . descriptor . maps . A _ Map Ċ import Ġcom . avail . descriptor . maps . A _ Map . Companion . forEach Ċ import Ġcom . avail . descriptor . maps . A _ Map . Companion . has Key Ċ import Ġcom . avail . descriptor . maps . A _ Map . Companion . keys As Set Ċ import Ġcom . avail . descriptor . maps . A _ Map . Companion . map At Ċ import Ġcom . avail . descriptor . maps . A _ Map . Companion . map At Put ting Can Destroy Ċ import Ġcom . avail . descriptor . maps . A _ Map . Companion . map Size Ċ import Ġcom . avail . descriptor . maps . Map Descriptor Ċ import Ġcom . avail . descriptor . maps . Map Descriptor . Companion . empty Map Ċ import Ġcom . avail . descriptor . po jos . Po jo Descriptor Ċ import Ġcom . avail . descriptor . po jos . Raw Po jo Descriptor . Companion . raw Object Class Ċ import Ġcom . avail . descriptor . representation . A _ Basic Object Ċ import Ġcom . avail . descriptor . representation . A _ Basic Object . Companion . synchron ize If Ċ import Ġcom . avail . descriptor . representation . Abstract Slots Enum Ċ import Ġcom . avail . descriptor . representation . Avail Object Ċ import Ġcom . avail . descriptor . representation . Avail Object . Companion . combine 2 Ċ import Ġcom . avail . descriptor . representation . Bit Field Ċ import Ġcom . avail . descriptor . representation . Integer Slots Enum Ċ import Ġcom . avail . descriptor . representation . Mut ability Ċ import Ġcom . avail . descriptor . representation . Nil Descriptor . Companion . nil Ċ import Ġcom . avail . descriptor . representation . Object Slots Enum Ċ import Ġcom . avail . descriptor . sets . Set Descriptor Ċ import Ġcom . avail . descriptor . tuples . A _ Tuple Ċ import Ġcom . avail . descriptor . tuples . A _ Tuple . Companion . tuple At Ċ import Ġcom . avail . descriptor . tuples . A _ Tuple . Companion . tuple Size Ċ import Ġcom . avail . descriptor . tuples . String Descriptor Ċ import Ġcom . avail . descriptor . tuples . String Descriptor . Companion . string From Ċ import Ġcom . avail . descriptor . tuples . Tuple Descriptor Ċ import Ġcom . avail . descriptor . tuples . Tuple Descriptor . Companion . empty Tuple Ċ import Ġcom . avail . descriptor . types . A _ Type . Companion . type Intersection Of Po jo F used Type Ċ import Ġcom . avail . descriptor . types . A _ Type . Companion . type Intersection Of Po jo Type Ċ import Ġcom . avail . descriptor . types . A _ Type . Companion . type Union Of Po jo Type Ċ import Ġcom . avail . descriptor . types . Bottom Po jo TypeDescriptor . Companion . pojo Bottom Ċ import Ġcom . avail . descriptor . types . F used Po jo TypeDescriptor . Integer Slots . Companion . HASH _ OR _ ZERO Ċ import Ġcom . avail . descriptor . types . F used Po jo TypeDescriptor . Integer Slots . HASH _ AND _ MORE Ċ import Ġcom . avail . descriptor . types . F used Po jo TypeDescriptor . Object Slots . JAVA _ ANCE ST ORS Ċ import Ġcom . avail . descriptor . types . F used Po jo TypeDescriptor . Object Slots . SELF _ TYPE Ċ import Ġcom . avail . descriptor . types . F used Po jo TypeDescriptor . Object Slots . TYPE _ VARIABLE S Ċ import Ġcom . avail . serialization . Serializer Operation Ċ import Ġcom . avail . utility . if Zero Ċ import Ġcom . avail . utility . json . JSON Writer Ċ import Ġjava . lang . reflect . Modifier Ċ import Ġjava . lang . reflect . Type Variable Ċ import Ġjava . util . Identity HashMap Ċ Ċ /** Ċ Ġ* Ġ` F used Po jo TypeDescriptor ` Ġdescribes Ġsynthetic Ġpoints Ġin ĠAv ail 's Ġpo jo Ġtype Ċ Ġ* Ġhierarchy . ĠThis Ġis Ġa Ġsuper set Ġof ĠJava 's Ġown Ġreference Ġtype Ġhierarchy . ĠIn Ċ Ġ* Ġparticular , Ġthe Ġpo jo Ġtype Ġhierarchy Ġincludes Ġtype Ġun ions Ġand Ġtype Ċ Ġ* Ġinter sections Ġthat Ġmay Ġstill Ġconform Ġto Ġactual Ġ( but Ġunspecified ) ĠJava Ġclasses Ċ Ġ* Ġand Ġinterfaces . ĠFor Ġinstance , Ġthe Ġtype Ġintersection Ġof ĠJava 's Ġ` Clone able ` Ġand Ċ Ġ* Ġ[ Serializable ] Ġdescribes Ġ** 1 )** Ġany Ġinterface Ġthat Ġextends Ġboth Ġand Ġ** 2 )** Ċ Ġ* Ġany Ġclass Ġthat Ġimplements Ġboth . Ċ Ġ* Ċ Ġ* Ġ@ author ĠT odd ĠL ĠSmith Ġ& lt ; tod d @ avail lang . org & gt ; Ċ Ġ* Ċ Ġ* Ġ@ constructor Ċ Ġ* ĠConstruct Ġa Ġnew Ġ[ F used Po jo TypeDescriptor ]. Ċ Ġ* Ċ Ġ* Ġ@ param Ġmut ability Ċ Ġ* ĠĠ ĠThe Ġ[ mut ability ][ Mut ability ] Ġof Ġthe Ġnew Ġdescriptor . Ċ Ġ*/ Ċ internal Ġclass ĠF used Po jo TypeDescriptor Ġconstructor Ġ( mut ability : ĠMut ability ) Ċ ĉ : ĠPo jo TypeDescriptor ( Ċĉ ĉ mut ability , ĠObject Slots :: class . java , ĠInteger Slots :: class . java ) Ċ { Ċ ĉ /** ĠThe Ġlayout Ġof Ġthe Ġinteger Ġslots . Ġ*/ Ċ ĉ internal Ġenum Ġclass ĠInteger Slots Ġ: ĠInteger Slots Enum Ċ ĉ { Ċĉ ĉ /** Ċĉĉ Ġ* ĠThe Ġlow Ġ 3 2 Ġbits Ġare Ġused Ġfor Ġthe Ġ[ HASH _ OR _ ZERO ], Ġbut Ġthe Ġupper Ċĉĉ Ġ* Ġ 3 2 Ġcan Ġbe Ġused Ġby Ġother Ġ[ Bit Field ] s Ġin Ġsubclasses . Ċĉĉ Ġ*/ Ċĉ ĉ HASH _ AND _ MORE ; ĊĊĉ ĉ comp anion Ġobject Ċĉ ĉ { Ċĉĉ ĉ /** Ċĉĉĉ Ġ* ĠA Ġslot Ġto Ġhold Ġthe Ġhash Ġvalue , Ġor Ġzero Ġif Ġit Ġhas Ġnot Ġbeen Ċĉĉĉ Ġ* Ġcomputed . ĠThe Ġhash Ġof Ġan Ġatom Ġis Ġa Ġrandom Ġnumber , Ġcomputed Ġonce . Ċĉĉĉ Ġ*/ Ċĉĉ ĉ val ĠHASH _ OR _ ZERO Ġ= ĠBit Field ( HASH _ AND _ MORE , Ġ 0 , Ġ 3 2 ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ /** ĠThe Ġlayout Ġof Ġthe Ġobject Ġslots . Ġ*/ Ċ ĉ internal Ġenum Ġclass ĠObject Slots Ġ: ĠObject Slots Enum Ċ ĉ { Ċĉ ĉ /** Ċĉĉ Ġ* ĠA Ġ[ map ][ Map Descriptor ] Ġfrom Ġ[ po jos ][ Po jo Descriptor ] Ġthat Ġwrap Ċĉĉ Ġ* Ġ[ Java &# 3 2 ; classes &# 3 2 ; and &# 3 2 ; interfaces ][ Class ] Ġto Ġtheir Ċĉĉ Ġ* Ġ[ type &# 3 2 ; parameter izations ][ Tuple Descriptor ]. ĠThe Ċĉĉ Ġ* Ġ[ keys ][ A _ Map . keys As Set ] Ġconst itute Ġthis Ġtype 's Ġcomplete Ċĉĉ Ġ* Ġ[ ance stry ][ Set Descriptor ] Ġof ĠJava Ġtypes . Ċĉĉ Ġ*/ Ċĉ ĉ JAVA _ ANCE ST ORS , ĊĊĉ ĉ /** Ċĉĉ Ġ* ĠA Ġ[ map ][ Map Descriptor ] Ġfrom Ġfully - qualified Ċĉĉ Ġ* Ġ[ type &# 3 2 ; variable ][ Type Variable ] Ġ[ names ][ String Descriptor ] Ġto Ġtheir Ċĉĉ Ġ* Ġ[ values ][ TypeDescriptor ] Ġin Ġthis Ġ[ type ][ Un f used Po jo TypeDescriptor ]. Ċĉĉ Ġ*/ Ċĉ ĉ TYPE _ VARIABLE S , ĊĊĉ ĉ /** Ċĉĉ Ġ* ĠThe Ġcached Ġ[ self &# 3 2 ; type ][ Self Po jo TypeDescriptor ] Ġof Ġthis Ċĉĉ Ġ* Ġ[ pojo &# 3 2 ; type ][ Un f used Po jo TypeDescriptor ]. Ċĉĉ Ġ*/ Ċĉ ĉ SELF _ TYPE Ċ ĉ } ĊĊ ĉ override Ġfun Ġallows Immutable To Mutable Reference In Field ( Ċĉ ĉ e : ĠAbstract Slots Enum ): ĠBoolean Ġ= Ċĉĉ ĉ e Ġ=== ĠHASH _ AND _ MORE Ċĉĉĉ ĉ || Ġe Ġ=== ĠTYPE _ VARIABLE S Ċĉĉĉ ĉ || Ġe Ġ=== ĠS ELF _ TYPE ĊĊ ĉ override Ġfun Ġo _ Equals Po jo Type ( Ċĉ ĉ self : ĠAv ail Object , Ċĉ ĉ a Po jo Type : ĠAv ail Object ): ĠBoolean Ċ ĉ { Ċĉ ĉ if Ġ( a Po jo Type . is Po jo Self Type ) Ċĉ ĉ { Ċĉĉ ĉ return Ġself . pojo Self Type (). equals Po jo Type ( a Po jo Type ) Ċĉ ĉ } Ċĉ ĉ if Ġ( a Po jo Type . java Class (). not Nil ) Ċĉ ĉ { Ċĉĉ ĉ return Ġfalse Ċĉ ĉ } Ċĉ ĉ val Ġan cestors : ĠA _ Map Ġ= Ġself . slot ( JAVA _ ANCE ST ORS ) Ċĉ ĉ val Ġother An cestors : ĠA _ Map Ġ= Ġa Po jo Type . java An cestors () Ċĉ ĉ if Ġ( ance stors . map Size Ġ!= Ġother An cestors . map Size ) Ċĉ ĉ { Ċĉĉ ĉ return Ġfalse Ċĉ ĉ } Ċĉ ĉ for Ġ( ancestor Ġin Ġan cestors . keys As Set ) Ċĉ ĉ { Ċĉĉ ĉ if Ġ(! other An cestors . has Key ( ancestor )) Ċĉĉ ĉ { Ċĉĉĉ ĉ return Ġfalse Ċĉĉ ĉ } Ċĉĉ ĉ val Ġparams : ĠA _ Tuple Ġ= Ġan cestors . map At ( ancestor ) Ċĉĉ ĉ val Ġother Params : ĠA _ Tuple Ġ= Ġother An cestors . map At ( ancestor ) Ċĉĉ ĉ val Ġlimit Ġ= Ġparams . tuple Size Ċĉĉ ĉ assert ( limit Ġ== Ġother Params . tuple Size ) Ċĉĉ ĉ for Ġ( i Ġin Ġ 1 Ġ.. Ġlimit ) Ċĉĉ ĉ { Ċĉĉĉ ĉ if Ġ(! params . tuple At ( i ). equals ( other Params . tuple At ( i ))) Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ return Ġfalse Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ // ĠThe Ġobjects Ġare Ġknown Ġto Ġbe Ġequal Ġand Ġnot Ġreference Ġidentical Ċĉ ĉ // Ġ( checked Ġby Ġa Ġcaller ), Ġso Ġco alesce Ġthem Ġif Ġpossible . Ċĉ ĉ if Ġ(! is Shared ) Ċĉ ĉ { Ċĉĉ ĉ a Po jo Type . make Immutable () Ċĉĉ ĉ self . be come Ind irection To ( a Po jo Type ) Ċĉ ĉ } Ċĉ ĉ else Ġif Ġ(! a Po jo Type . descriptor (). is Shared ) Ċĉ ĉ { Ċĉĉ ĉ self . make Immutable () Ċĉĉ ĉ a Po jo Type . be come Ind irection To ( self ) Ċĉ ĉ } Ċĉ ĉ return Ġtrue Ċ ĉ } ĊĊ ĉ override Ġfun Ġo _ Hash ( self : ĠAv ail Object ): ĠInt Ġ= Ċĉ ĉ self . synchron ize If ( is Shared ) Ġ{ Ġhash ( self ) Ġ} ĊĊ ĉ override Ġfun Ġo _ Is Abstract ( self : ĠAv ail Object ): ĠBoolean Ġ= Ġtrue ĊĊ ĉ override Ġfun Ġo _ Is Po jo ArrayType ( self : ĠAv ail Object ): ĠBoolean Ġ= Ġfalse ĊĊ ĉ override Ġfun Ġo _ Is Po jo F used Type ( self : ĠAv ail Object ): ĠBoolean Ġ= Ġtrue ĊĊ ĉ override Ġfun Ġo _ Java An cestors ( self : ĠAv ail Object ): ĠAv ail Object Ġ= Ċĉ ĉ self . slot ( JAVA _ ANCE ST ORS ) ĊĊ ĉ override Ġfun Ġo _ Java Class ( self : ĠAv ail Object ): ĠAv ail Object Ġ= Ġnil ĊĊ ĉ // ĠTODO : Ġ[ TLS ] ĠAnswer Ġthe Ġnearest Ġmut ual Ġparent Ġof Ġthe Ġleaf Ġtypes . Ċ ĉ override Ġfun Ġo _ Marshal To Java ( Ċĉ ĉ self : ĠAv ail Object , Ċĉ ĉ class Hint : ĠClass < *> ?): ĠAny Ġ= ĠAny :: class . java ĊĊ ĉ /** Ċĉ Ġ* ĠL az ily Ġcompute Ġthe Ġself Ġtype Ġof Ġthe Ġspecified Ċĉ Ġ* Ġ[ object ][ F used Po jo TypeDescriptor ]. Ċĉ Ġ* Ċĉ Ġ* Ġ@ param Ġself Ċĉ Ġ* ĠĠ ĠAn Ġobject . Ċĉ Ġ* Ġ@ return Ċĉ Ġ* ĠĠ ĠThe Ġself Ġtype . Ċĉ Ġ*/ Ċ ĉ private Ġfun Ġpo jo Self Type ( self : ĠAv ail Object ): ĠAv ail Object Ċ ĉ { Ċĉ ĉ var Ġself Type Ġ= Ġself . slot ( SELF _ TYPE ) Ċĉ ĉ if Ġ( self Type . is Nil ) Ċĉ ĉ { Ċĉĉ ĉ self Type Ġ= ĠSelf Po jo TypeDescriptor . new Self Po jo Type ( Ċĉĉĉ ĉ nil , Ġself . slot ( JAVA _ ANCE ST ORS ). keys As Set ) Ċĉĉ ĉ if Ġ( is Shared ) Ċĉĉ ĉ { Ċĉĉĉ ĉ self Type Ġ= Ġself Type . tra versed (). make Shared () Ċĉĉ ĉ } Ċĉĉ ĉ self . set Slot ( SELF _ TYPE , Ġself Type ) Ċĉ ĉ } Ċĉ ĉ return Ġself Type Ċ ĉ } ĊĊ ĉ override Ġfun Ġo _ Po jo Self Type ( self : ĠAv ail Object ): ĠA _ Type Ċ ĉ { Ċĉ ĉ if Ġ( is Shared ) Ċĉ ĉ { Ċĉĉ ĉ synchronized ( self ) Ġ{ Ġreturn Ġpo jo Self Type ( self ) Ġ} Ċĉ ĉ } Ċĉ ĉ return Ġpo jo Self Type ( self ) Ċ ĉ } ĊĊ ĉ @ Thread Safe Ċ ĉ override Ġfun Ġo _ Serializer Operation ( self : ĠAv ail Object ): ĠSerializer Operation Ġ= Ċĉ ĉ Serializer Operation . F USED _ PO JO _ TYPE ĊĊ ĉ override Ġfun Ġo _ Type Intersection Of Po jo Type ( Ċĉ ĉ self : ĠAv ail Object , Ċĉ ĉ a Po jo Type : ĠA _ Type ): ĠA _ Type Ċ ĉ { Ċĉ ĉ if Ġ( a Po jo Type . is Po jo Self Type ) Ċĉ ĉ { Ċĉĉ ĉ return Ġself . pojo Self Type (). type Intersection Of Po jo Type ( a Po jo Type ) Ċĉ ĉ } Ċĉ ĉ // ĠA ĠJava Ġarray Ġtype Ġis Ġeffectively Ġfinal , Ġso Ġthe Ġtype Ġintersection Ġwith Ċĉ ĉ // Ġof Ġa Ġpo jo Ġarray Ġtype Ġand Ġa Ġsingleton Ġpo jo Ġtype Ġis Ġpo jo Ġbottom . Ċĉ ĉ return Ġif Ġ( a Po jo Type . is Po jo ArrayType ) Ċĉ ĉ { Ċĉĉ ĉ pojo Bottom () Ċĉ ĉ } Ċĉ ĉ else Ġcanonical Po jo Type ( Ċĉĉ ĉ a Po jo Type . type Intersection Of Po jo F used Type ( self ), Ċĉĉ ĉ false ) Ċ ĉ } ĊĊ ĉ override Ġfun Ġo _ Type Intersection Of Po jo F used Type ( Ċĉ ĉ self : ĠAv ail Object , Ċĉ ĉ a F used Po jo Type : ĠA _ Type ): ĠA _ Type Ċ ĉ { Ċĉ ĉ val Ġintersection Ġ= Ġcompute Intersection ( self , Ġa F used Po jo Type ) Ċĉ ĉ return Ġif Ġ( intersection . equals Po jo Bottom Type ()) Ċĉ ĉ { Ċĉĉ ĉ pojo Bottom () Ċĉ ĉ } Ċĉ ĉ else Ġcreate F used Po jo Type ( intersection Ġas ĠA _ Map ) Ċĉ ĉ // ĠThe Ġresult Ġwill Ġbe Ġa Ġpo jo Ġf used Ġtype . ĠFind Ġthe Ġunion Ġof Ġthe Ġkey Ġsets Ċĉ ĉ // Ġand Ġthe Ġintersection Ġof Ġtheir Ġparameter izations . Ċ ĉ } ĊĊ ĉ override Ġfun Ġo _ Type Intersection Of Po jo Un f used Type ( Ċĉ ĉ self : ĠAv ail Object , Ċĉ ĉ an Un f used Po jo Type : ĠA _ Type ): ĠA _ Type Ċ ĉ { Ċĉ ĉ val Ġother Java Class Ġ= Ċĉĉ ĉ an Un f used Po jo Type . java Class (). java Object NotNull < Class <* >>() Ċĉ ĉ val Ġother Modifiers Ġ= Ġother Java Class . modifiers Ċĉ ĉ // ĠIf Ġthe Ġun f used Ġpo jo Ġtype 's Ġclass Ġis Ġfinal , Ġthen Ġthe Ġintersection Ġis Ċĉ ĉ // Ġpo jo Ġbottom . Ċĉ ĉ if Ġ( Modifier . is Final ( other Modifiers )) Ċĉ ĉ { Ċĉĉ ĉ return Ġpo jo Bottom () Ċĉ ĉ } Ċĉ ĉ // ĠIf Ġthe Ġun f used Ġpo jo Ġtype Ġis Ġa Ġclass , Ġthen Ġcheck Ġthat Ġnone Ġof Ġthe Ċĉ ĉ // Ġf used Ġpo jo Ġtype 's Ġan cestors Ġare Ġclasses . Ċĉ ĉ if Ġ(! Modifier . is Interface ( other Modifiers )) Ċĉ ĉ { Ċĉĉ ĉ // ĠIf Ġany Ġof Ġthe Ġf used Ġpo jo Ġtype 's Ġan cestors Ġare ĠJava Ġclasses , Ġthen Ċĉĉ ĉ // Ġthe Ġintersection Ġis Ġpo jo Ġbottom . Ċĉĉ ĉ for Ġ( ancestor Ġin Ġself . slot ( JAVA _ ANCE ST ORS ). keys As Set ) Ċĉĉ ĉ { Ċĉĉĉ ĉ // ĠIgnore Ġjava . lang . Object . Ċĉĉĉ ĉ if Ġ(! ancestor . equals ( raw Object Class ())) Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ val Ġjava Class Ġ= Ġancestor . java Object NotNull < Class <* >>() Ċĉĉĉĉ ĉ val Ġmodifiers Ġ= Ġjava Class . modifiers Ċĉĉĉĉ ĉ if Ġ( Modifier . is Final ( modifiers ) Ċĉĉĉĉĉ ĉ || Ġ! Modifier . is Interface ( modifiers )) Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ return Ġpo jo Bottom () Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ val Ġintersection Ġ= Ġcompute Intersection ( self , Ġan Un f used Po jo Type ) Ċĉ ĉ return Ġif Ġ( intersection . equals Po jo Bottom Type ()) Ċĉ ĉ { Ċĉĉ ĉ pojo Bottom () Ċĉ ĉ } Ċĉ ĉ else Ġcreate F used Po jo Type ( intersection Ġas ĠA _ Map ) Ċĉ ĉ // ĠThe Ġresult Ġwill Ġbe Ġa Ġpo jo Ġf used Ġtype . ĠFind Ġthe Ġunion Ġof Ġthe Ġkey Ġsets Ċĉ ĉ // Ġand Ġthe Ġintersection Ġof Ġtheir Ġparameter izations . Ċ ĉ } ĊĊ ĉ override Ġfun Ġo _ Type Union Of Po jo Type ( Ċĉ ĉ self : ĠAv ail Object , Ċĉ ĉ a Po jo Type : ĠA _ Type ): ĠA _ Type Ġ= Ċĉĉ ĉ if Ġ( a Po jo Type . is Po jo Self Type ) Ċĉĉ ĉ { Ċĉĉĉ ĉ self . pojo Self Type (). type Union Of Po jo Type ( a Po jo Type ) Ċĉĉ ĉ } Ċĉĉ ĉ else Ċĉĉ ĉ { Ċĉĉĉ ĉ canonical Po jo Type ( Ċĉĉĉĉ ĉ a Po jo Type . type Union Of Po jo Type ( self ), Ċĉĉĉĉ ĉ false ) Ċĉĉ ĉ } ĊĊ ĉ override Ġfun Ġo _ Type Union Of Po jo F used Type ( Ċĉ ĉ self : ĠAv ail Object , Ċĉ ĉ a F used Po jo Type : ĠA _ Type ): ĠA _ Type Ċ ĉ { Ċĉ ĉ val Ġintersection An cestors Ġ= Ġcompute Union ( Ċĉĉ ĉ self , Ġa F used Po jo Type ) Ċĉ ĉ val Ġjava Class Ġ= Ġmost Specific Of ( intersection An cestors . keys As Set ) Ċĉ ĉ // ĠIf Ġthe Ġintersection Ġcontains Ġa Ġmost Ġspecific Ġtype , Ġthen Ġthe Ġanswer Ġis Ċĉ ĉ // Ġnot Ġa Ġf used Ġpo jo Ġtype ; Ġotherwise Ġit Ġis . Ċĉ ĉ return Ġif Ġ( java Class . not Nil ) Ċĉ ĉ { Ċĉĉ ĉ Un f used Po jo TypeDescriptor Ċĉĉĉ ĉ . create Un f used Po jo Type ( java Class , Ġintersection An cestors ) Ċĉ ĉ } Ċĉ ĉ else Ċĉ ĉ { Ċĉĉ ĉ create F used Po jo Type ( intersection An cestors ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ override Ġfun Ġo _ Type Union Of Po jo Un f used Type ( Ċĉ ĉ self : ĠAv ail Object , Ċĉ ĉ an Un f used Po jo Type : ĠA _ Type ): ĠA _ Type Ċ ĉ { Ċĉ ĉ val Ġintersection An cestors Ġ= Ġcompute Union ( self , Ġan Un f used Po jo Type ) Ċĉ ĉ val Ġjava Class Ġ= Ġmost Specific Of ( intersection An cestors . keys As Set ) Ċĉ ĉ // ĠIf Ġthe Ġintersection Ġcontains Ġa Ġmost Ġspecific Ġtype , Ġthen Ġthe Ġanswer Ġis Ċĉ ĉ // Ġnot Ġa Ġf used Ġpo jo Ġtype ; Ġotherwise Ġit Ġis . Ċĉ ĉ return Ġif Ġ( java Class . not Nil ) Ċĉ ĉ { Ċĉĉ ĉ Un f used Po jo TypeDescriptor Ċĉĉĉ ĉ . create Un f used Po jo Type ( java Class , Ġintersection An cestors ) Ċĉ ĉ } Ċĉ ĉ else Ċĉ ĉ { Ċĉĉ ĉ create F used Po jo Type ( intersection An cestors ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠL az ily Ġcompute Ġthe Ġtype Ġvariables Ġof Ġthe Ġspecified Ċĉ Ġ* Ġ[ object ][ F used Po jo TypeDescriptor ]. Ċĉ Ġ* Ċĉ Ġ* Ġ@ param Ġself Ċĉ Ġ* ĠĠ ĠAn Ġobject . Ċĉ Ġ* Ġ@ return Ċĉ Ġ* ĠĠ ĠThe Ġtype Ġvariables . Ċĉ Ġ*/ Ċ ĉ private Ġfun Ġtype Variables ( self : ĠAv ail Object ): ĠA _ Map Ċ ĉ { Ċĉ ĉ var Ġtype Vars : ĠA _ Map Ġ= Ġself . slot ( TYPE _ VARIABLE S ) Ċĉ ĉ if Ġ( type Vars . is Nil ) Ċĉ ĉ { Ċĉĉ ĉ type Vars Ġ= Ġempty Map Ċĉĉ ĉ self . slot ( JAVA _ ANCE ST ORS ). forEach Ġ{ Ġkey , Ġvalue Ġ-> Ċĉĉĉ ĉ val Ġancestor Ġ= Ġkey . java Object NotNull < Class <* >>() Ċĉĉĉ ĉ val Ġvars Ġ= Ġancestor . type Parameters Ċĉĉĉ ĉ val Ġtype Args : ĠA _ Tuple Ġ= Ġvalue Ċĉĉĉ ĉ assert ( vars . size Ġ== Ġtype Args . tuple Size ) Ċĉĉĉ ĉ vars . forEach Indexed Ġ{ Ġi , Ġeach Var Ġ-> Ċĉĉĉĉ ĉ type Vars Ġ= Ġtype Vars . map At Put ting Can Destroy ( Ċĉĉĉĉĉ ĉ string From ( ancestor . name Ġ+ Ġ"." Ġ+ Ġeach Var . name ), Ċĉĉĉĉĉ ĉ type Args . tuple At ( i Ġ+ Ġ 1 ), Ċĉĉĉĉĉ ĉ true ) Ċĉĉĉ ĉ } Ċĉĉĉ ĉ if Ġ( is Shared ) Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ type Vars Ġ= Ġtype Vars . tra versed (). make Shared () Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉĉ ĉ self . set Slot ( TYPE _ VARIABLE S , Ġtype Vars ) Ċĉ ĉ } Ċĉ ĉ return Ġtype Vars Ċ ĉ } ĊĊ ĉ override Ġfun Ġo _ Type Variables ( self : ĠAv ail Object ): ĠA _ Map Ċ ĉ { Ċĉ ĉ if Ġ( is Shared ) Ċĉ ĉ { Ċĉĉ ĉ synchronized ( self ) Ġ{ Ġreturn Ġtype Variables ( self ) Ġ} Ċĉ ĉ } Ċĉ ĉ return Ġtype Variables ( self ) Ċ ĉ } ĊĊ ĉ override Ġfun Ġprint Object On Avoid ing Indent ( Ċĉ ĉ self : ĠAv ail Object , Ċĉ ĉ builder : ĠStringBuilder , Ċĉ ĉ recursion Map : ĠIdentity HashMap < A _ Basic Object , ĠVoid >, Ċĉ ĉ indent : ĠInt ) Ċ ĉ { Ċĉ ĉ val Ġan cestors : ĠA _ Map Ġ= Ġself . slot ( JAVA _ ANCE ST ORS ) Ċĉ ĉ val Ġchild less Ġ= Ġmutable ListOf < Avail Object >() Ċĉ ĉ child less . addAll ( child less A mong ( ance stors . keys As Set )) Ċĉ ĉ child less . sortBy Ġ{ Ġo 1 Ġ-> Ġo 1 . java Object NotNull < Class <* >> (). name Ġ} Ċĉ ĉ var Ġfirst Child less Ġ= Ġtrue Ċĉ ĉ for Ġ( java Class Ġin Ġchild less ) Ċĉ ĉ { Ċĉĉ ĉ if Ġ(! firstChild less ) Ċĉĉ ĉ { Ċĉĉĉ ĉ builder . append (" ĠâĪ© Ġ") Ċĉĉ ĉ } Ċĉĉ ĉ firstChild less Ġ= Ġfalse Ċĉĉ ĉ builder . append ( java Class . java Object NotNull < Class <* >> (). name ) Ċĉĉ ĉ val Ġparams : ĠA _ Tuple Ġ= Ċĉĉĉ ĉ if Ġ( ance stors . has Key ( java Class )) Ġan cestors . map At ( java Class ) Ċĉĉĉ ĉ else Ġempty Tuple Ċĉĉ ĉ if Ġ( params . tuple Size Ġ!= Ġ 0 ) Ċĉĉ ĉ { Ċĉĉĉ ĉ builder . append ('< ') Ċĉĉĉ ĉ var Ġfirst Param Ġ= Ġtrue Ċĉĉĉ ĉ for Ġ( param Ġin Ġparams ) Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ if Ġ(! first Param ) Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ builder . append (", Ġ") Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ first Param Ġ= Ġfalse Ċĉĉĉĉ ĉ param . print On Avoid ing Indent ( builder , Ġrecursion Map , Ġindent ) Ċĉĉĉ ĉ } Ċĉĉĉ ĉ builder . append (' >') Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ override Ġfun Ġo _ WriteTo ( self : ĠAv ail Object , Ġwriter : ĠJSON Writer ) Ċ ĉ { Ċĉ ĉ writer . start Object () Ċĉ ĉ writer . write (" kind ") Ċĉ ĉ writer . write (" pojo Ġtype ") Ċĉ ĉ writer . write (" class ") Ċĉ ĉ writer . write ( self . toString ()) Ċĉ ĉ writer . end Object () Ċ ĉ } ĊĊ ĉ override Ġfun Ġmutable (): ĠF used Po jo TypeDescriptor Ġ= Ġmutable ĊĊ ĉ override Ġfun Ġimmutable (): ĠF used Po jo TypeDescriptor Ġ= Ġimmutable ĊĊ ĉ override Ġfun Ġshared (): ĠF used Po jo TypeDescriptor Ġ= Ġshared ĊĊ ĉ comp anion Ġobject Ċ ĉ { Ċĉ ĉ /** Ċĉĉ Ġ* ĠL az ily Ġcompute Ġthe Ġhash Ġof Ġthe Ġspecified Ċĉĉ Ġ* Ġ[ object ][ F used Po jo TypeDescriptor ]. Ċĉĉ Ġ* Ċĉĉ Ġ* Ġ@ param Ġself Ċĉĉ Ġ* ĠĠ ĠAn Ġobject . Ċĉĉ Ġ* Ġ@ return Ċĉĉ Ġ* ĠĠ ĠThe Ġhash . Ċĉĉ Ġ*/ Ċĉ ĉ private Ġfun Ġhash ( self : ĠAv ail Object ): ĠInt Ġ= Ċĉĉ ĉ self . slot ( HASH _ OR _ ZERO ). if Zero Ġ{ Ċĉĉĉ ĉ // ĠNote Ġthat Ġthis Ġdefinition Ġproduces Ġa Ġvalue Ġcompatible Ġwith Ġa Ċĉĉĉ ĉ // Ġpo jo Ġself Ġtype ; Ġthis Ġis Ġnecessary Ġto Ġpermit Ġcomparison Ċĉĉĉ ĉ // Ġbetween Ġan Ġun f used Ġpo jo Ġtype Ġand Ġits Ġself Ġtype . Ċĉĉĉ ĉ combine 2 ( Ċĉĉĉĉ ĉ self . slot ( JAVA _ ANCE ST ORS ). keys As Set . hash (), Ċĉĉĉĉ ĉ - 0 x 5 fea 4 3 bc Ċĉĉĉ ĉ ). also Ġ{ Ġself . set Slot ( HASH _ OR _ ZERO , Ġit ) Ġ} Ċĉĉ ĉ } ĊĊĉ ĉ /** ĠThe Ġmutable Ġ[ F used Po jo TypeDescriptor ]. Ġ*/ Ċĉ ĉ private Ġval Ġmutable Ġ= ĠF used Po jo TypeDescriptor ( Mut ability . MUT ABLE ) ĊĊĉ ĉ /** ĠThe Ġimmutable Ġ[ F used Po jo TypeDescriptor ]. Ġ*/ Ċĉ ĉ private Ġval Ġimmutable Ġ= ĠF used Po jo TypeDescriptor ( Mut ability . IM MUT ABLE ) ĊĊĉ ĉ /** ĠThe Ġshared Ġ[ F used Po jo TypeDescriptor ]. Ġ*/ Ċĉ ĉ private Ġval Ġshared Ġ= ĠF used Po jo TypeDescriptor ( Mut ability . SHARED ) ĊĊĉ ĉ /** Ċĉĉ Ġ* ĠCreate Ġa Ġnew Ġ[ Avail Object ] Ġthat Ġrepresents Ġan Ġ[ un parameter ized Ġpo jo Ċĉĉ Ġ* Ġtype ][ F used Po jo TypeDescriptor ]. Ċĉĉ Ġ* Ċĉĉ Ġ* Ġ@ param Ġjava An cestors Ċĉĉ Ġ* ĠĠ ĠA Ġ[ map ][ Map Descriptor ] Ġfrom Ġ[ po jos ][ Po jo Descriptor ] Ġthat Ġwrap Ċĉĉ Ġ* ĠĠ Ġ[ Java &# 3 2 ; classes &# 3 2 ; and &# 3 2 ; interfaces ][ Class ] Ġto Ġtheir Ċĉĉ Ġ* ĠĠ Ġ[ type &# 3 2 ; parameter izations ][ Tuple Descriptor ]. ĠThe Ċĉĉ Ġ* ĠĠ Ġ[ keys ][ A _ Map . keys As Set ] Ġconst itute Ġthis Ġtype 's Ġcomplete Ċĉĉ Ġ* ĠĠ Ġ[ ance stry ][ Set Descriptor ] Ġof ĠJava Ġtypes . Ċĉĉ Ġ* Ġ@ return Ċĉĉ Ġ* ĠĠ ĠThe Ġrequested Ġpo jo Ġtype . Ċĉĉ Ġ*/ Ċĉ ĉ fun Ġcreate F used Po jo Type ( java An cestors : ĠA _ Map ?): ĠAv ail Object Ġ= Ċĉĉ ĉ mutable . create Immutable Ġ{ Ċĉĉĉ ĉ set Slot ( HASH _ OR _ ZERO , Ġ 0 ) Ċĉĉĉ ĉ set Slot ( JAVA _ ANCE ST ORS , Ġjava An cestors !! ) Ċĉĉĉ ĉ set Slot ( TYPE _ VARIABLE S , Ġnil ) Ċĉĉĉ ĉ set Slot ( SELF _ TYPE , Ġnil ) Ċĉĉ ĉ } Ċ ĉ } Ċ } Ċ