/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 0 Ġ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 . fir . analysis . check ers . expression Ċ Ċ import Ġorg . jetbrains . kotlin . fir . F ir Source Element Ċ import Ġorg . jetbrains . kotlin . fir . analysis . check ers . context . Checker Context Ċ import Ġorg . jetbrains . kotlin . fir . analysis . diagnostics . Diagnostic Reporter Ċ import Ġorg . jetbrains . kotlin . fir . analysis . diagnostics . F ir Errors Ċ import Ġorg . jetbrains . kotlin . fir . declarations .* Ċ import Ġorg . jetbrains . kotlin . fir . expressions . F ir Qualified Access Expression Ċ import Ġorg . jetbrains . kotlin . fir . references . F ir Resolved Named Reference Ċ import Ġorg . jetbrains . kotlin . fir . resolve . subst itution . Con e Subst it utor Ċ import Ġorg . jetbrains . kotlin . fir . resolve . subst itution . subst it utor By Map Ċ import Ġorg . jetbrains . kotlin . fir . resolve . to Symbol Ċ import Ġorg . jetbrains . kotlin . fir . symbols . impl . F ir Constructor Symbol Ċ import Ġorg . jetbrains . kotlin . fir . symbols . impl . F ir Type Parameter Symbol Ċ import Ġorg . jetbrains . kotlin . fir . type Context Ċ import Ġorg . jetbrains . kotlin . fir . types .* Ċ import Ġorg . jetbrains . kotlin . types . Abstract Type Checker Ċ import Ġorg . jetbrains . kotlin . types . Abstract Type Checker Context Ċ import Ġorg . jetbrains . kotlin . utils . addTo Std lib . min Ċ import Ġorg . jetbrains . kotlin . utils . addTo Std lib . safe As Ċ Ċ object ĠF ir Upper Bound Vi olated Checker Ġ: ĠF ir Qualified Access Checker () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcheck ( expression : ĠF ir Qualified Access Expression , Ġcontext : ĠCheck er Context , Ġreporter : ĠDiagnostic Reporter ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġsomething Ġthat Ġcontains Ġthe Ġtype Ġparameters ĊĠĠĠĠĠĠĠ Ġ// Ġdeclarations Ġwith Ġtheir Ġdeclared Ġbounds . ĊĠĠĠĠĠĠĠ Ġ// Ġit Ġmay Ġbe Ġthe Ġcalled Ġfunction Ġdeclaration ĊĠĠĠĠĠĠĠ Ġ// Ġor Ġthe Ġclass Ġdeclaration ĊĠĠĠĠĠĠĠ Ġval Ġcal lee F ir Ġ= Ġexpression . callee Reference . safe As < F ir Resolved Named Reference >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . resolved Symbol ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . fir . safe As < F ir Type Parameter Refs Owner >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġmin ( callee F ir . type Parameters . size , Ġexpression . type Arguments . size ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( count Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġparameter Pairs Ġ= Ġmutable Map Of < F ir Type Parameter Symbol , ĠF ir Resolved Type Ref >() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( it Ġin Ġ 0 Ġuntil Ġcount ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . type Arguments [ it ]. safe As < F ir Type Projection With Variance >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . type Ref . safe As < F ir Resolved Type Ref >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġthat Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( that Ġ! is ĠF ir ErrorType Ref ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Pairs [ callee F ir . type Parameters [ it ]. symbol ] Ġ= Ġthat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġwe Ġsubstitute Ġactual Ġvalues Ġto Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġtype Ġparameters Ġfrom Ġthe Ġdeclaration ĊĠĠĠĠĠĠĠ Ġval Ġsubstit utor Ġ= Ġsubstit utor By Map ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Pairs . map Values Ġ{ Ġit . value . type Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtype Checker Context Ġ= Ġcontext . session . type Context . new BaseType Checker Context ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Types EqualTo Anything Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstub Types EqualTo Anything Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġparameter Pairs . forEach Ġ{ Ġ( proto , Ġactual ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( actual . source Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġinferred Ġtypes Ġdon 't Ġreport ĠIN AP PL IC ABLE _ C AND ID ATE Ġfor Ġtype Ġaliases ! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! satisf ies Bounds ( proto , Ġactual . type , Ġsubstit utor , Ġtype Checker Context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreporter . report ( actual . source , Ġproto , Ġactual . type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġmust Ġanalyze Ġnested Ġthings Ġlike ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠS < S < K , ĠL >, ĠT < K , ĠL >>() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactual . type . safe As < Con e Class Like Type >() ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Occurred Ġ= Ġanalyze Type Parameters ( it , Ġcontext , Ġreporter , Ġtype Checker Context , Ġactual . source ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( error Occurred ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġif Ġwe 're Ġdealing Ġwith Ġa Ġconstructor ĊĠĠĠĠĠĠĠ Ġ// Ġresolved Ġfrom Ġa Ġtype alias Ġwe Ġneed Ġto ĊĠĠĠĠĠĠĠ Ġ// Ġcheck Ġif Ġour Ġactual Ġparameters Ġsatisfy ĊĠĠĠĠĠĠĠ Ġ// Ġthis Ġconstructor Ġparameters . ĊĠĠĠĠĠĠĠ Ġ// Ġe . g . ĊĠĠĠĠĠĠĠ Ġ// Ġclass ĠB < T Ġ: ĠCollection < Number >> ĊĠĠĠĠĠĠĠ Ġ// Ġtype alias ĠA < G > Ġ= ĠB < List < G >> ĊĠĠĠĠĠĠĠ Ġ// Ġval Ġa Ġ= ĠA < Int >() ĊĠĠĠĠĠĠĠ Ġwhen Ġ( callee F ir ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠF ir Constructor Ġ-> Ġanalyze Constructor Call ( expression , Ġsubstit utor , Ġtype Checker Context , Ġreporter ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġanalyze Constructor Call ( ĊĠĠĠĠĠĠĠ Ġfunction Call : ĠF ir Qualified Access Expression , ĊĠĠĠĠĠĠĠ Ġcall Site Subst it utor : ĠC one Subst it utor , ĊĠĠĠĠĠĠĠ Ġtype Checker Context : ĠAbstract Type Checker Context , ĊĠĠĠĠĠĠĠ Ġreporter : ĠDiagnostic Reporter ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġholds ĠCollection < Number > Ġbound . ĊĠĠĠĠĠĠĠ Ġ// Ġnote Ġthat Ġif ĠB Ġused Ġanother Ġtype Ġparameter Ġhere , ĊĠĠĠĠĠĠĠ Ġ// Ġwe 'd Ġget ĠCollection < K >. ĠSo Ġwe Ġneed Ġto Ġdo Ġone Ġmore ĊĠĠĠĠĠĠĠ Ġ// Ġsubstitution Ġhere ĊĠĠĠĠĠĠĠ Ġval Ġproto Constructor Ġ= Ġfunction Call . callee Reference . safe As < F ir Resolved Named Reference >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . resolved Symbol . safe As < F ir Constructor Symbol >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . over ridden Symbol ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . fir . safe As < F ir Constructor >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġ// Ġholds ĠCollection < G > Ġbound . ĊĠĠĠĠĠĠĠ Ġ// Ġwe Ġneed Ġto Ġdo Ġsubstitution Ġhere Ġto Ġget ĊĠĠĠĠĠĠĠ Ġ// ĠCollection < Int > ĊĠĠĠĠĠĠĠ Ġval Ġactual Constructor Ġ= Ġfunction Call . callee Reference . safe As < F ir Resolved Named Reference >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . resolved Symbol . safe As < F ir Constructor Symbol >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . fir . safe As < F ir Constructor >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . returnType Ref . safe As < F ir Resolved Type Ref >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . type . safe As < Con e Class Like Type >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġmin ( proto Constructor . type Parameters . size , Ġactual Constructor . type Arguments . size ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( count Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġconstructors Parameter Pairs Ġ= Ġmutable Map Of < F ir Type Parameter Symbol , ĠC one Simple Kotlin Type >() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( it Ġin Ġ 0 Ġuntil Ġcount ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactual Constructor . type Arguments [ it ]. safe As < Con e Simple Kotlin Type >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġthat Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( that Ġ! is ĠC one Class ErrorType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructors Parameter Pairs [ proto Constructor . type Parameters [ it ]. symbol ] Ġ= Ġthat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġwe Ġsubstitute Ġtype alias Ġdeclaration ĊĠĠĠĠĠĠĠ Ġ// Ġparameters Ġto Ġthe Ġones Ġused Ġin Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġtype alias Ġtarget ĊĠĠĠĠĠĠĠ Ġval Ġdeclaration Site Subst it utor Ġ= Ġsubstit utor By Map ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconstructors Parameter Pairs . toMap (). map Values Ġ{ Ġit . value . type Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġconstructors Parameter Pairs . forEach Ġ{ Ġ( proto , Ġactual ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġjust Ġin Ġcase ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġintersection Ġ= Ġtype Checker Context . intersect Types ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproto . fir . bounds . filter Is Instance < F ir Resolved Type Ref >(). map Ġ{ Ġit . type Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). safe As < Con e Kotlin Type >() Ġ?: Ġreturn @ forEach ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġintersection Ġ= Ġdeclaration Site Subst it utor . substitute Or Self ( intersection ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintersection Ġ= Ġcall Site Subst it utor . substitute Or Self ( intersection ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsubstitute ĠInt Ġfor ĠG Ġfrom ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġexample Ġabove ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġcall Site Subst it utor . substitute Or Self ( actual ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsatisfies Bounds Ġ= ĠAbstract Type Checker . is Subtype Of ( type Checker Context , Ġtarget , Ġintersection ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! satisf ies Bounds ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreporter . report ( function Call . source , Ġproto , Ġactual ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRe cursively Ġanaly zes Ġtype Ġparameters ĊĠĠĠĠ Ġ* Ġand Ġreports Ġthe Ġdiagnostic Ġon Ġthe Ġgiven ĊĠĠĠĠ Ġ* Ġreport Target Ġ( because Ġwe Ġcan 't Ġreport Ġthem ĊĠĠĠĠ Ġ* Ġon Ġtype Ġparameters Ġthemselves Ġnow ). ĊĠĠĠĠ Ġ* ĠReturns Ġtrue Ġif Ġan Ġerror Ġoccured ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġanalyze Type Parameters ( ĊĠĠĠĠĠĠĠ Ġtype : ĠC one Class Like Type , ĊĠĠĠĠĠĠĠ Ġcontext : ĠCheck er Context , ĊĠĠĠĠĠĠĠ Ġreporter : ĠDiagnostic Reporter , ĊĠĠĠĠĠĠĠ Ġtype Checker Context : ĠAbstract Type Checker Context , ĊĠĠĠĠĠĠĠ Ġreport Target : ĠF ir Source Element ? ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprototype Class Ġ= Ġtype . lookup Tag . to Symbol ( context . session ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . fir . safe As < F ir Regular Class >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġmin ( prototype Class . type Parameters . size , Ġtype . type Arguments . size ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( count Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġparameter Pairs Ġ= Ġmutable Map Of < F ir Type Parameter Symbol , ĠC one Class Like Type >() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( it Ġin Ġ 0 Ġuntil Ġcount ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . type Arguments [ it ]. safe As < Con e Class Like Type >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġthat Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( that Ġ! is ĠC one Class ErrorType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Pairs [ prototype Class . type Parameters [ it ]. symbol ] Ġ= Ġthat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsubstit utor Ġ= Ġsubstit utor By Map ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Pairs . toMap (). map Values Ġ{ Ġit . value . type Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġparameter Pairs . forEach Ġ{ Ġ( proto , Ġactual ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! satisf ies Bounds ( proto , Ġactual . type , Ġsubstit utor , Ġtype Checker Context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġshould Ġreport Ġon Ġthe Ġparameter Ġinstead ! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreporter . report ( report Target , Ġproto , Ġactual ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Occurred Ġ= Ġanalyze Type Parameters ( actual , Ġcontext , Ġreporter , Ġtype Checker Context , Ġreport Target ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( error Occurred ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġtrue Ġif Ġtarget Ġsatisfies Ġthe ĊĠĠĠĠ Ġ* Ġbounds Ġof Ġthe Ġprototype Symbol . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġsatisfies Bounds ( ĊĠĠĠĠĠĠĠ Ġprototype Symbol : ĠF ir Type Parameter Symbol , ĊĠĠĠĠĠĠĠ Ġtarget : ĠC one Kotlin Type , ĊĠĠĠĠĠĠĠ Ġsubstit utor : ĠC one Subst it utor , ĊĠĠĠĠĠĠĠ Ġtype Checker Context : ĠAbstract Type Checker Context ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġintersection Ġ= Ġtype Checker Context . intersect Types ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprototype Symbol . fir . bounds . filter Is Instance < F ir Resolved Type Ref >(). map Ġ{ Ġit . type Ġ} ĊĠĠĠĠĠĠĠ Ġ). safe As < Con e Kotlin Type >() Ġ?: Ġreturn Ġtrue ĊĊĠĠĠĠĠĠĠ Ġintersection Ġ= Ġsubstit utor . substitute Or Self ( intersection ) ĊĠĠĠĠĠĠĠ Ġreturn ĠAbstract Type Checker . is Subtype Of ( type Checker Context , Ġtarget , Ġintersection ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠDiagnostic Reporter . report ( source : ĠF ir Source Element ?, Ġproto : ĠF ir Type Parameter Symbol , Ġactual : ĠC one Kotlin Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsource ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreport ( F ir Errors . UPPER _ BOUND _ VI OL ATED . on ( it , Ġproto , Ġactual )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ