/* Ċ Ġ* Ġ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 . resolve Ċ Ċ import Ġorg . jetbrains . kotlin . config . Language Feature Ċ import Ġorg . jetbrains . kotlin . config . Language Version Settings Ċ import Ġorg . jetbrains . kotlin . container . Default Implementation Ċ import Ġorg . jetbrains . kotlin . descriptors . Classifier Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Type Parameter Descriptor Ċ import Ġorg . jetbrains . kotlin . diagnostics . Diagnostic Factory 2 Ċ import Ġorg . jetbrains . kotlin . diagnostics . Diagnostic Factory 3 Ċ import Ġorg . jetbrains . kotlin . diagnostics . Errors .* Ċ import Ġorg . jetbrains . kotlin . diagnostics . report Diagnostic Once Ċ import Ġorg . jetbrains . kotlin . psi . Kt Element Ċ import Ġorg . jetbrains . kotlin . psi . Kt Expression Ċ import Ġorg . jetbrains . kotlin . psi . Kt Type Reference Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . getElement Text WithContext Ċ import Ġorg . jetbrains . kotlin . types .* Ċ import Ġorg . jetbrains . kotlin . types . checker . Kotlin Type Checker Ċ import Ġorg . jetbrains . kotlin . types . type Util . contains Type Alias Parameters Ċ Ċ @ Default Implementation ( impl Ġ= ĠUpper Bound Checker :: class ) Ċ open Ġclass ĠUpper Bound Checker Ġ{ ĊĠĠĠ Ġopen Ġfun Ġcheck Bounds Of Expanded Type Alias ( type : ĠKotlin Type , Ġexpression : ĠK t Expression , Ġtrace : ĠBinding Trace ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġdo Ġnothing Ġin Ġthe Ġstrict Ġmode Ġas Ġthe Ġerrors Ġare Ġalready Ġreported Ġin Ġthe Ġtype Ġinference Ġif Ġnecessary ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġcheck Bounds ( ĊĠĠĠĠĠĠĠ Ġargument Reference : ĠK t Type Reference ?, ĊĠĠĠĠĠĠĠ Ġargument Type : ĠKotlin Type , ĊĠĠĠĠĠĠĠ Ġtype Parameter Descriptor : ĠType Parameter Descriptor , ĊĠĠĠĠĠĠĠ Ġsubstit utor : ĠType Subst it utor , ĊĠĠĠĠĠĠĠ Ġtrace : ĠBinding Trace , ĊĠĠĠĠĠĠĠ Ġtype Alias Usage Element : ĠK t Element ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġdiagnostic ForType Aliases : ĠDiagnostic Factory 3 < Kt Element , ĠKotlin Type , ĠKotlin Type , ĠClass ifier Descriptor > Ġ= ĠUPPER _ BOUND _ VI OL ATED _ IN _ TYPE ALIAS _ EXP AN SION ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( type Parameter Descriptor . upper Bounds . isEmpty ()) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġdiagnostics Reporter Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUpper Bound Vi olated Reporter ( trace , Ġargument Type , Ġtype Parameter Descriptor , Ġdiagnostic ForType Aliases Ġ= Ġdiagnostic ForType Aliases ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( bound Ġin Ġtype Parameter Descriptor . upper Bounds ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Bound ( bound , Ġargument Type , Ġargument Reference , Ġsubstit utor , Ġtype Alias Usage Element , Ġdiagnostics Reporter ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcheck Bounds In Sup ertype ( ĊĠĠĠĠĠĠĠ Ġtype Reference : ĠK t Type Reference , ĊĠĠĠĠĠĠĠ Ġtype : ĠKotlin Type , ĊĠĠĠĠĠĠĠ Ġtrace : ĠBinding Trace , ĊĠĠĠĠĠĠĠ Ġlanguage Version Settings : ĠLanguage Version Settings , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( type . isError ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġtype Element Ġ= Ġtype Reference . type Element Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġtype . constructor . parameters ĊĠĠĠĠĠĠĠ Ġval Ġarguments Ġ= Ġtype . arguments ĊĊĠĠĠĠĠĠĠ Ġassert ( parameters . size Ġ== Ġarguments . size ) ĊĊĠĠĠĠĠĠĠ Ġval Ġkt Type Arguments Ġ= Ġtype Element . type Arguments As Types ĊĊĠĠĠĠĠĠĠ Ġ// ĠA Ġtype Ġreference Ġfrom ĠKotlin Ġcode Ġcan Ġyield Ġa Ġflexible Ġtype Ġonly Ġif Ġit 's Ġ` ft < T 1 , ĠT 2 >`, Ġwhose Ġbounds Ġshould Ġnot Ġbe Ġchecked ĊĠĠĠĠĠĠĠ Ġif Ġ( type . is Flex ible () Ġ&& Ġ! type . is Dynamic ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( kt Type Arguments . size Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(" Flex ible Ġtype Ġcannot Ġbe Ġden oted Ġin ĠKotlin Ġotherwise Ġthan Ġas Ġft < T 1 , ĠT 2 >, Ġbut Ġwas : Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġtype Reference . getElement Text WithContext ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġit 's Ġreally Ġft < Foo , ĠBar > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflexible Type Ġ= Ġtype . as Flex ible Type () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Bounds In Sup ertype ( kt Type Arguments [ 0 ], Ġflexible Type . lower Bound , Ġtrace , Ġlanguage Version Settings ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Bounds In Sup ertype ( kt Type Arguments [ 1 ], Ġflexible Type . upper Bound , Ġtrace , Ġlanguage Version Settings ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( type Ġis ĠA bb re vi ated Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Bounds For Abbre vi ated Sup ertype ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype , Ġtrace , Ġtype Reference , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġerrors Ġhave Ġbeen Ġreported Ġpreviously Ġif Ġkt Type Arguments . size Ġaccidentally Ġwas Ġequal Ġto Ġthe Ġamount Ġof Ġarguments ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġin Ġthe Ġexpanded Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreport Warning Ġ= Ġkt Type Arguments . size Ġ!= Ġarguments . size Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! language Version Settings . supports Feature ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLanguage Feature . Report Missing Upper Bounds Vi olated Error On Abbre viation At Sup ert ypes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġnumbers Ġof Ġtype Ġarguments Ġdo Ġnot Ġmatch , Ġthe Ġerror Ġhas Ġbeen Ġalready Ġreported Ġin ĠType Resolver ĊĠĠĠĠĠĠĠ Ġif Ġ( kt Type Arguments . size Ġ!= Ġarguments . size ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġsubstit utor Ġ= ĠType Subst it utor . create ( type ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġkt Type Arguments . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkt Type Argument Ġ= Ġkt Type Arguments [ i ] Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Bounds In Sup ertype ( kt Type Argument , Ġarguments [ i ]. type , Ġtrace , Ġlanguage Version Settings ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Bounds ( kt Type Argument , Ġarguments [ i ]. type , Ġparameters [ i ], Ġsubstit utor , Ġtrace ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Bounds For Abbre vi ated Sup ertype ( ĊĠĠĠĠĠĠĠ Ġtype : ĠKotlin Type , ĊĠĠĠĠĠĠĠ Ġtrace : ĠBinding Trace , ĊĠĠĠĠĠĠĠ Ġtype Reference : ĠK t Type Reference , ĊĠĠĠĠĠĠĠ Ġreport Warning : ĠBoolean ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġtype . constructor . parameters ĊĠĠĠĠĠĠĠ Ġval Ġarguments Ġ= Ġtype . arguments ĊĠĠĠĠĠĠĠ Ġval Ġsubstit utor Ġ= ĠType Subst it utor . create ( type ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdiagnostic Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( report Warning ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUPPER _ BOUND _ VI OL ATED _ IN _ TYPE ALIAS _ EXP AN SION _ WARNING ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUPPER _ BOUND _ VI OL ATED _ IN _ TYPE ALIAS _ EXP AN SION ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġarguments . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( arguments [ i ]. is Star Projection ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargument Type Ġ= Ġarguments [ i ]. type ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Bounds For Abbre vi ated Sup ertype ( argument Type , Ġtrace , Ġtype Reference , Ġreport Warning ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Bounds ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargument Reference Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargument Type , Ġparameters [ i ], Ġsubstit utor , Ġtrace , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Alias Usage Element Ġ= Ġtype Reference , Ġdiagnostic ForType Aliases Ġ= Ġdiagnostic , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġcheck Bound ( ĊĠĠĠĠĠĠĠ Ġbound : ĠKotlin Type , ĊĠĠĠĠĠĠĠ Ġargument Type : ĠKotlin Type , ĊĠĠĠĠĠĠĠ Ġargument Reference : ĠK t Type Reference ?, ĊĠĠĠĠĠĠĠ Ġsubstit utor : ĠType Subst it utor , ĊĠĠĠĠĠĠĠ Ġtype Alias Usage Element : ĠK t Element ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġupper Bound Vi olated Reporter : ĠUpper Bound Vi olated Reporter ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsubstit uted Bound Ġ= Ġsubstit utor . safe Subst itute ( bound , ĠVari ance . IN VARIANT ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! Kotlin Type Checker . DEFAULT . is Subtype Of ( argument Type , Ġsubstit uted Bound )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( argument Reference Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupper Bound Vi olated Reporter . report ( argument Reference , Ġsubstit uted Bound ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( type Alias Usage Element Ġ!= Ġnull Ġ&& Ġ! subst it uted Bound . contains Type Alias Parameters () Ġ&& Ġ! argument Type . contains Type Alias Parameters ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupper Bound Vi olated Reporter . report ForType Alias Expansion ( type Alias Usage Element , Ġsubstit uted Bound ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠUpper Bound Vi olated Reporter ( ĊĠĠĠ Ġprivate Ġval Ġtrace : ĠBinding Trace , ĊĠĠĠ Ġprivate Ġval Ġargument Type : ĠKotlin Type , ĊĠĠĠ Ġprivate Ġval Ġtype Parameter Descriptor : ĠType Parameter Descriptor , ĊĠĠĠ Ġprivate Ġval Ġbase Diagnostic : ĠDiagnostic Factory 2 < Kt Type Reference , ĠKotlin Type , ĠKotlin Type > Ġ= ĠUPPER _ BOUND _ VI OL ATED , ĊĠĠĠ Ġprivate Ġval Ġdiagnostic ForType Aliases : ĠDiagnostic Factory 3 < Kt Element , ĠKotlin Type , ĠKotlin Type , ĠClass ifier Descriptor > Ġ= ĠUPPER _ BOUND _ VI OL ATED _ IN _ TYPE ALIAS _ EXP AN SION Ċ ) Ġ{ ĊĠĠĠ Ġfun Ġreport ( type Argument Reference : ĠK t Type Reference , Ġsubstit uted Bound : ĠKotlin Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtrace . report Diagnostic Once ( base Diagnostic . on ( type Argument Reference , Ġsubstit uted Bound , Ġargument Type )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreport ForType Alias Expansion ( call Element : ĠK t Element , Ġsubstit uted Bound : ĠKotlin Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtrace . report Diagnostic Once ( diagnostic ForType Aliases . on ( call Element , Ġsubstit uted Bound , Ġargument Type , Ġtype Parameter Descriptor )) ĊĠĠĠ Ġ} Ċ } Ċ