/* Ċ Ġ* Ġ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 . declaration Ċ Ċ import Ġorg . jetbrains . kotlin . Kt Fake Source Element Kind Ċ import Ġorg . jetbrains . kotlin . diagnostics . Diagnostic Reporter Ċ import Ġorg . jetbrains . kotlin . diagnostics . report On Ċ import Ġorg . jetbrains . kotlin . fir . analysis . check ers . context . Checker Context Ċ import Ġorg . jetbrains . kotlin . fir . analysis . check ers . extract Arguments Type Ref And Source Ċ import Ġorg . jetbrains . kotlin . fir . analysis . diagnostics . F ir Errors Ċ import Ġorg . jetbrains . kotlin . fir . declarations .* Ċ import Ġorg . jetbrains . kotlin . fir . resolve . fully Expanded Type Ċ import Ġorg . jetbrains . kotlin . fir . symbols . impl . F ir Regular Class Symbol Ċ import Ġorg . jetbrains . kotlin . fir . types .* Ċ import Ġorg . jetbrains . kotlin . types . Variance Ċ Ċ object ĠF ir Projection Relation Checker Ġ: ĠF ir Basic Declaration Checker () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcheck ( declaration : ĠF ir Declaration , Ġcontext : ĠCheck er Context , Ġreporter : ĠDiagnostic Reporter ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( declaration Ġis ĠF ir Property Accessor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( declaration Ġis ĠF ir Callable Declaration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Type Ref ( declaration . returnType Ref , Ġcontext , Ġreporter ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( declaration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠF ir Class Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( it Ġin Ġdeclaration . super Type Refs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Type Ref ( it , Ġcontext , Ġreporter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠF ir Type Alias Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Type Ref ( declaration . expanded Type Ref , Ġcontext , Ġreporter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Type Ref ( ĊĠĠĠĠĠĠĠ Ġtype Ref : ĠF ir Type Ref , ĊĠĠĠĠĠĠĠ Ġcontext : ĠCheck er Context , ĊĠĠĠĠĠĠĠ Ġreporter : ĠDiagnostic Reporter ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġtype Ref . cone Type Safe < Con e Class Like Type >() ĊĠĠĠĠĠĠĠ Ġval Ġfully Expanded Type Ġ= Ġtype ?. fully Expanded Type ( context . session ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġdeclaration Ġ= Ġfully Expanded Type . to Symbol ( context . session ) Ġas ? ĠF ir Regular Class Symbol Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġtype Parameters Ġ= Ġdeclaration . type Parameter Symbols ĊĠĠĠĠĠĠĠ Ġval Ġtype Arguments Ġ= Ġtype . type Arguments ĊĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġmin Of ( type Parameters . size , Ġtype Arguments . size ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtype Ref And Sources For Arguments Ġ= Ġextract Arguments Type Ref And Source ( type Ref ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġfor Ġ( it Ġin Ġ 0 Ġuntil Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproto Ġ= Ġtype Parameters [ it ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġtype Arguments [ it ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfully Expanded Projection Ġ= Ġfully Expanded Type . type Arguments [ it ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproto Variance Ġ= Ġproto . variance ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprojection Relation Ġ= Ġif Ġ( fully Expanded Projection Ġis ĠC one Kotlin Type Conflict ing Projection Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Ġis ĠC one Kotlin Type Projection In Ġ&& Ġproto Variance Ġ== ĠVari ance . OUT _ VARI ANCE Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Ġis ĠC one Kotlin Type Projection Out Ġ&& Ġproto Variance Ġ== ĠVari ance . IN _ VARI ANCE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProjection Relation . Conflict ing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( actual Ġis ĠC one Kotlin Type Projection In Ġ&& Ġproto Variance Ġ== ĠVari ance . IN _ VARI ANCE Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Ġis ĠC one Kotlin Type Projection Out Ġ&& Ġproto Variance Ġ== ĠVari ance . OUT _ VARI ANCE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProjection Relation . Red undant ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProjection Relation . None ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarg Type Ref Source Ġ= Ġtype Ref And Sources For Arguments . get OrNull ( it ) Ġ?: Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( projection Relation Ġ!= ĠProjection Relation . None Ġ&& Ġtype Ref . source ?. kind Ġ! is ĠK t Fake Source Element Kind ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreporter . report On ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarg Type Ref Source . source Ġ?: Ġarg Type Ref Source . type Ref ?. source , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( projection Relation Ġ== ĠProjection Relation . Conflict ing ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġ!= Ġfully Expanded Type ) ĠF ir Errors . CONF LI CT ING _ PRO JECTION _ IN _ TYPE ALIAS _ EXP AN SION Ġelse ĠF ir Errors . CONF LI CT ING _ PRO JECTION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF ir Errors . RED UND ANT _ PRO JECTION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfully Expanded Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġarg Type Ref Source . type Ref ?. let Ġ{ Ġcheck Type Ref ( it , Ġcontext , Ġreporter ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġenum Ġclass ĠProjection Relation Ġ{ ĊĠĠĠĠĠĠĠ ĠConflict ing , ĊĠĠĠĠĠĠĠ ĠRed undant , ĊĠĠĠĠĠĠĠ ĠNone ĊĠĠĠ Ġ} Ċ } Ċ