/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 1 Ġ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 . load . java . lazy . types Ċ Ċ import Ġorg . jetbrains . kotlin . descriptors . Class Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Type Parameter Descriptor Ċ import Ġorg . jetbrains . kotlin . storage . Lock Based Storage Manager Ċ import Ġorg . jetbrains . kotlin . types .* Ċ import Ġorg . jetbrains . kotlin . types . type Util . extract Type Parameters From Upper Bounds Ċ import Ġorg . jetbrains . kotlin . types . type Util . replace Arguments With Star Projection Or Mapped Ċ import Ġorg . jetbrains . kotlin . types . type Util . replace Arguments With Star Projection s Ċ Ċ internal Ġclass ĠType Parameter Upper Bound E ras er ( raw Substitution : ĠRaw Substitution ? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġstorage Ġ= ĠLock Based Storage Manager (" Type Ġparameter Ġupper Ġbound Ġer asion Ġresults ") ĊĠĠĠ Ġprivate Ġval Ġerr one ous Erase d Bound Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠError Utils . create ErrorType (" Can 't Ġcompute Ġer ased Ġupper Ġbound Ġof Ġtype Ġparameter Ġ`$ this ` ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġraw Substitution Ġ= Ġraw Substitution Ġ?: ĠRaw Substitution ( this ) ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠData To Erase Upper Bound ( ĊĠĠĠĠĠĠĠ Ġval Ġtype Parameter : ĠType Parameter Descriptor , ĊĠĠĠĠĠĠĠ Ġval Ġis Raw : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġval Ġtype Attr : ĠJava Type Attributes ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠData To Erase Upper Bound ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġother . type Parameter Ġ== Ġthis . type Parameter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġother . is Raw Ġ== Ġthis . is Raw ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġother . type Attr . flex ibility Ġ== Ġthis . type Attr . flex ibility ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġother . type Attr . how This Type Is Used Ġ== Ġthis . type Attr . how This Type Is Used ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġother . type Attr . is For Annotation Parameter Ġ== Ġthis . type Attr . is For Annotation Parameter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġother . type Attr . default Type Ġ== Ġthis . type Attr . default Type ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġtype Parameter . hashCode () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ+= Ġ 3 1 Ġ* Ġresult Ġ+ Ġif Ġ( is Raw ) Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ+= Ġ 3 1 Ġ* Ġresult Ġ+ Ġtype Attr . flex ibility . hashCode () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ+= Ġ 3 1 Ġ* Ġresult Ġ+ Ġtype Attr . how This Type Is Used . hashCode () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ+= Ġ 3 1 Ġ* Ġresult Ġ+ Ġif Ġ( type Attr . is For Annotation Parameter ) Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ+= Ġ 3 1 Ġ* Ġresult Ġ+ Ġtype Attr . default Type . hashCode () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġget Erase d Upper Bound Ġ= Ġstorage . create Memo ized Function < DataTo Erase Upper Bound , ĠKotlin Type > Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( it ) Ġ{ Ġget Erase d Upper Bound Internal ( type Parameter , Ġis Raw , Ġtype Attr ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġget Erase d Upper Bound ( ĊĠĠĠĠĠĠĠ Ġtype Parameter : ĠType Parameter Descriptor , ĊĠĠĠĠĠĠĠ Ġis Raw : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġtype Attr : ĠJava Type Attributes ĊĠĠĠ Ġ) Ġ= Ġget Erase d Upper Bound ( DataTo Erase Upper Bound ( type Parameter , Ġis Raw , Ġtype Attr )) ĊĊĠĠĠ Ġprivate Ġfun ĠgetDefault Type ( type Attr : ĠJava Type Attributes ) Ġ= ĊĠĠĠĠĠĠĠ Ġtype Attr . default Type ?. replace Arguments With Star Projection s () Ġ?: Ġerr one ous Erase d Bound ĊĊĠĠĠ Ġ// ĠDefinition : ĊĠĠĠ Ġ// ĠE rase d Upper Bound ( T Ġ: ĠG < t >) Ġ= ĠG < *> Ġ// ĠUpper Bound ( T ) Ġis Ġa Ġtype ĠG < t > Ġwith Ġarguments ĊĠĠĠ Ġ// ĠE rase d Upper Bound ( T Ġ: ĠA ) Ġ= ĠA Ġ// ĠUpper Bound ( T ) Ġis Ġa Ġtype ĠA Ġwithout Ġarguments ĊĠĠĠ Ġ// ĠE rase d Upper Bound ( T Ġ: ĠF ) Ġ= ĠUpper Bound ( F ) Ġ// ĠU B ( T ) Ġis Ġanother Ġtype Ġparameter ĠF ĊĠĠĠ Ġprivate Ġfun Ġget Erase d Upper Bound Internal ( ĊĠĠĠĠĠĠĠ Ġ// ĠCalcul ation Ġof Ġ` pot entially Recursive Type Parameter . upper Bounds ` Ġmay Ġrecursively Ġdepend Ġon Ġ` this . get Erase d Upper Bound ` ĊĠĠĠĠĠĠĠ Ġ// ĠE . g . Ġ` class ĠA < T Ġextends ĠA , ĠF Ġextends ĠA >` ĊĠĠĠĠĠĠĠ Ġ// ĠTo Ġprevent Ġrecursive Ġcalls Ġreturn ĠdefaultValue () Ġinstead ĊĠĠĠĠĠĠĠ Ġtype Parameter : ĠType Parameter Descriptor , ĊĠĠĠĠĠĠĠ Ġis Raw : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġtype Attr : ĠJava Type Attributes ĊĠĠĠ Ġ): ĠKotlin Type Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvisited Type Parameters Ġ= Ġtype Attr . visited Type Parameters ĊĊĠĠĠĠĠĠĠ Ġif Ġ( visited Type Parameters Ġ!= Ġnull Ġ&& Ġtype Parameter . original Ġin Ġvisited Type Parameters ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠgetDefault Type ( type Attr ) ĊĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠ Ġ* ĠWe Ġshould Ġdo Ġer asure Ġof Ġcontaining Ġtype Ġparameters Ġwith Ġtheir Ġer asure Ġto Ġavoid Ġcreating Ġinconsistent Ġtypes . ĊĠĠĠĠĠĠĠĠ Ġ* ĠE . g . Ġfor Ġ` class ĠFoo < T : ĠFoo < B >, ĠB >`, Ġwe 'd Ġhave Ġer asure Ġfor Ġlower Ġbound : ĠFoo < Foo <* >, ĠAny >, ĊĠĠĠĠĠĠĠĠ Ġ* Ġbut Ġit 's Ġwrong Ġtype : Ġprojection (*) Ġ!= Ġprojection ( Any ). ĊĠĠĠĠĠĠĠĠ Ġ* ĠSo Ġwe Ġshould Ġsubstitute Ġer asure Ġof Ġthe Ġcorresponding Ġtype Ġparameter : Ġ` Foo < Foo < Any >, ĠAny >` Ġor Ġ` Foo < Foo <* >, Ġ*> `. ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġer ased Upper Bounds Ġ= Ġtype Parameter . default Type . extract Type Parameters From Upper Bounds ( visited Type Parameters ). associate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbound Projection Ġ= Ġif Ġ( visited Type Parameters Ġ== Ġnull Ġ|| Ġit Ġ! in Ġvisited Type Parameters ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġraw Substitution . compute Projection ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġer asure Ġhappens Ġdue Ġto Ġinvalid Ġarguments Ġnumber , Ġuse Ġstar Ġprojection s Ġinstead ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Raw ) Ġtype Attr Ġelse Ġtype Attr . with Flex ibility ( Java Type Flex ibility . INF LEX IBLE ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Erase d Upper Bound ( it , Ġis Raw , Ġtype Attr . with New Vis ited Type Parameter ( type Parameter )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġmake Star Projection ( it , Ġtype Attr ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . type Constructor Ġto Ġbound Projection ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġer ased Upper Bounds Subst it utor Ġ= ĠType Subst it utor . create ( Type Constructor Substitution . create By Construct ors Map ( er ased Upper Bounds )) ĊĊĠĠĠĠĠĠĠ Ġval Ġfirst Upper Bound Ġ= Ġtype Parameter . upper Bounds . first () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( first Upper Bound . constructor . declaration Descriptor Ġis ĠClass Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfirst Upper Bound . replace Arguments With Star Projection Or Mapped ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġer ased Upper Bounds Subst it utor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġer ased Upper Bounds , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVari ance . OUT _ VARI ANCE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Attr . visited Type Parameters ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġstop At Ġ= Ġtype Attr . visited Type Parameters Ġ?: Ġset Of ( this ) ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Ġ= Ġfirst Upper Bound . constructor . declaration Descriptor Ġas ĠType Parameter Descriptor ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( current Ġ! in Ġstop At ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Upper Bound Ġ= Ġcurrent . upper Bounds . first () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Upper Bound . constructor . declaration Descriptor Ġis ĠClass Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnext Upper Bound . replace Arguments With Star Projection Or Mapped ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġer ased Upper Bounds Subst it utor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġer ased Upper Bounds , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVari ance . OUT _ VARI ANCE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Attr . visited Type Parameters ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġnext Upper Bound . constructor . declaration Descriptor Ġas ĠType Parameter Descriptor ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠgetDefault Type ( type Attr ) ĊĠĠĠ Ġ} Ċ }