/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 9 Ġ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 . java . scopes Ċ Ċ import Ġorg . jetbrains . kotlin . descriptors . Modal ity Ċ import Ġorg . jetbrains . kotlin . fir . F ir Session Ċ import Ġorg . jetbrains . kotlin . fir . declarations .* Ċ import Ġorg . jetbrains . kotlin . fir . declarations . utils . is Static Ċ import Ġorg . jetbrains . kotlin . fir . declarations . utils . modal ity Ċ import Ġorg . jetbrains . kotlin . fir . java . Java Type Parameter Stack Ċ import Ġorg . jetbrains . kotlin . fir . java . en hancement . readOnly To Mutable Ċ import Ġorg . jetbrains . kotlin . fir . java . to Con e Kotlin Type Prob ably Flex ible Ċ import Ġorg . jetbrains . kotlin . fir . resolve . fully Expanded Type Ċ 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 . scopes . F ir Type Scope Ċ import Ġorg . jetbrains . kotlin . fir . scopes . Processor Action Ċ import Ġorg . jetbrains . kotlin . fir . scopes . impl . F ir Abstract Override Checker Ċ import Ġorg . jetbrains . kotlin . fir . scopes . jvm . compute Jvm Descriptor Representation Ċ import Ġorg . jetbrains . kotlin . fir . scopes . process Over ridden Functions Ċ import Ġorg . jetbrains . kotlin . fir . symbols . ensure Resolved Ċ import Ġorg . jetbrains . kotlin . fir . types .* Ċ import Ġorg . jetbrains . kotlin . name . Standard Class Ids Ċ Ċ class ĠJava Override Checker Ġinternal Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġsession : ĠF ir Session , ĊĠĠĠ Ġprivate Ġval Ġjava Type Parameter Stack : ĠJava Type Parameter Stack , ĊĠĠĠ Ġprivate Ġval Ġbase Scope : ĠF ir Type Scope ?, ĊĠĠĠ Ġprivate Ġval Ġconsider ReturnType Kinds : ĠBoolean , Ċ ) Ġ: ĠF ir Abstract Override Checker () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġcontext : ĠC one Type Context Ġ= Ġsession . type Context ĊĊĠĠĠ Ġprivate Ġfun Ġis Equal Types ( ĊĠĠĠĠĠĠĠ Ġcandidate Type : ĠC one Kotlin Type , ĊĠĠĠĠĠĠĠ Ġbase Type : ĠC one Kotlin Type , ĊĠĠĠĠĠĠĠ Ġsubstit utor : ĠC one Subst it utor ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( candidate Type Ġis ĠC one Raw Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcandidate Type . compute Jvm Descriptor Representation () Ġ== Ġbase Type . compute Jvm Descriptor Representation () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( candidate Type Ġis ĠC one Flex ible Type ) Ġreturn Ġis Equal Types ( candidate Type . lower Bound , Ġbase Type , Ġsubstit utor ) ĊĠĠĠĠĠĠĠ Ġif Ġ( base Type Ġis ĠC one Flex ible Type ) Ġreturn Ġis Equal Types ( candidate Type , Ġbase Type . lower Bound , Ġsubstit utor ) ĊĠĠĠĠĠĠĠ Ġif Ġ( candidate Type Ġis ĠC one Class Like Type Ġ&& Ġbase Type Ġis ĠC one Class Like Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcandidate Type Class Id Ġ= Ġcandidate Type . fully Expanded Type ( session ). lookup Tag . class Id . let Ġ{ Ġit . readOnly To Mutable () Ġ?: Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase Type Class Id Ġ= Ġbase Type . fully Expanded Type ( session ). lookup Tag . class Id . let Ġ{ Ġit . readOnly To Mutable () Ġ?: Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( candidate Type Class Id Ġ!= Ġbase Type Class Id ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( candidate Type Class Id Ġ== ĠStandard Class Ids . Array ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( candidate Type . type Arguments . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Array Ġtype Ġwith Ġunexpected Ġnumber Ġof Ġtype Ġarguments : Ġ$ candidate Type " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( base Type . type Arguments . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Array Ġtype Ġwith Ġunexpected Ġnumber Ġof Ġtype Ġarguments : Ġ$ base Type " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġis Equal Array ElementType Projection s ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcandidate Type . type Arguments . single (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase Type . type Arguments . single (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubstit utor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġwith ( context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġare Equal Type Construct ors ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubstit utor . substitute Or Self ( candidate Type ). type Constructor (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubstit utor . substitute Or Self ( base Type ). type Constructor () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Equal Types ( ĊĠĠĠĠĠĠĠ Ġcandidate Type Ref : ĠF ir Type Ref , ĊĠĠĠĠĠĠĠ Ġbase Type Ref : ĠF ir Type Ref , ĊĠĠĠĠĠĠĠ Ġsubstit utor : ĠC one Subst it utor ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcandidate Type Ġ= Ġcandidate Type Ref . to Con e Kotlin Type Prob ably Flex ible ( session , Ġjava Type Parameter Stack ) ĊĠĠĠĠĠĠĠ Ġval Ġbase Type Ġ= Ġbase Type Ref . to Con e Kotlin Type Prob ably Flex ible ( session , Ġjava Type Parameter Stack ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( candidate Type . is Primitive In Java ( is ReturnType Ġ= Ġfalse ) Ġ!= Ġbase Type . is Primitive In Java ( is ReturnType Ġ= Ġfalse )) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġis Equal Types ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcandidate Type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase Type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubstit utor ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠIn Ġmost Ġcases Ġchecking Ġer asure Ġof Ġvalue Ġparameters Ġshould Ġbe Ġenough , Ġbut Ġin Ġsome Ġcases Ġthere Ġmight Ġbe Ġsemi - valid ĠJava Ġh ierarch ies ĊĠĠĠ Ġ// Ġwith Ġsame Ġvalue Ġparameters , Ġbut Ġdifferent Ġreturn Ġtype Ġkinds , Ġso Ġit 's Ġworth Ġdistinguish ing Ġthem Ġas Ġdifferent Ġnon - over rid able Ġmembers ĊĠĠĠ Ġprivate Ġfun Ġdoes Return Types Have Same Kind ( ĊĠĠĠĠĠĠĠ Ġcandidate : ĠF ir Simple Function , ĊĠĠĠĠĠĠĠ Ġbase : ĠF ir Simple Function , ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcandidate Type Ref Ġ= Ġcandidate . returnType Ref ĊĠĠĠĠĠĠĠ Ġval Ġbase Type Ref Ġ= Ġbase . returnType Ref ĊĊĠĠĠĠĠĠĠ Ġval Ġcandidate Type Ġ= Ġcandidate Type Ref . to Con e Kotlin Type Prob ably Flex ible ( session , Ġjava Type Parameter Stack ) ĊĠĠĠĠĠĠĠ Ġval Ġbase Type Ġ= Ġbase Type Ref . to Con e Kotlin Type Prob ably Flex ible ( session , Ġjava Type Parameter Stack ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcandidate Has Primitive ReturnType Ġ= Ġcandidate . has Primitive ReturnType In Jvm ( candidate Type ) ĊĠĠĠĠĠĠĠ Ġif Ġ( candidate Has Primitive ReturnType Ġ!= Ġbase . has Primitive ReturnType In Jvm ( base Type )) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ// ĠBoth Ġcandidate Ġand Ġbase Ġare Ġnot Ġprimitive ĊĠĠĠĠĠĠĠ Ġif Ġ(! candidate Has Primitive ReturnType ) Ġreturn Ġtrue ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ( candidate Type Ġas ? ĠC one Class Like Type )?. lookup Tag Ġ== Ġ( base Type Ġas ? ĠC one Class Like Type )?. lookup Tag ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠC one Kotlin Type . is Primitive In Java ( is ReturnType : ĠBoolean ): ĠBoolean Ġ= Ġwith ( context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Nullable Type () Ġ|| ĠCompiler Con e Attributes . Enhanced Null ability Ġin Ġattributes ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġis Void Ġ= Ġis ReturnType Ġ&& Ġis Unit ĊĠĠĠĠĠĠĠ Ġreturn Ġis Primitive Or Nullable Primitive Ġ|| Ġis Void ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠF ir Simple Function . has Primitive ReturnType In Jvm ( returnType : ĠC one Kotlin Type ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! returnType . is Primitive In Java ( is ReturnType Ġ= Ġtrue )) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġvar Ġfound Non Primitive Over ridden Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġbase Scope ?. process Over ridden Functions ( symbol ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġit . fir . returnType Ref . to Con e Kotlin Type Prob ably Flex ible ( session , Ġjava Type Parameter Stack ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! type . is Primitive In Java ( is ReturnType Ġ= Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfound Non Primitive Over ridden Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProcessor Action . STOP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProcessor Action . NEXT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ! found Non Primitive Over ridden ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Equal Array ElementType Projection s ( ĊĠĠĠĠĠĠĠ Ġcandidate Type Projection : ĠC one Type Projection , ĊĠĠĠĠĠĠĠ Ġbase Type Projection : ĠC one Type Projection , ĊĠĠĠĠĠĠĠ Ġsubstit utor : ĠC one Subst it utor ĊĠĠĠ Ġ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcandidate Type Projection Ġis ĠC one Kotlin Type Projection Ġ&& Ġbase Type Projection Ġis ĠC one Kotlin Type Projection Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Equal Types ( candidate Type Projection . type , Ġbase Type Projection . type , Ġsubstit utor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcandidate Type Projection Ġis ĠC one Star Projection Ġ&& Ġbase Type Projection Ġis ĠC one Star Projection Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠCollection < F ir Type Parameter Ref >. build Er asure () Ġ= Ġassociate Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsymbol Ġ= Ġit . symbol ĊĠĠĠĠĠĠĠ Ġval Ġfirst Bound Ġ= Ġsymbol . fir . bounds . first () Ġ// ĠNote Ġthat Ġin ĠJava Ġtype Ġparameter Ġtyped Ġarguments Ġalways Ġer ased Ġto Ġfirst Ġbound ĊĠĠĠĠĠĠĠ Ġsymbol Ġto Ġfirst Bound . to Con e Kotlin Type Prob ably Flex ible ( session , Ġjava Type Parameter Stack ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠF ir Type Ref ?. is Type Parameter Dependent (): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġthis Ġis ĠF ir Resolved Type Ref Ġ&& Ġtype . lower Bound If Flex ible (). is Type Parameter Dependent () ĊĊĠĠĠ Ġprivate Ġfun ĠC one Kotlin Type . is Type Parameter Dependent (): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġthis Ġis ĠC one Type ParameterType Ġ|| Ġthis Ġis ĠC one Class Like Type Ġ&& Ġtype Arguments . any Ġ{ Ġargument Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġargument Ġis ĠC one Kotlin Type Projection Ġ&& Ġargument . type . is Type Parameter Dependent () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠF ir Callable Declaration . is Type Parameter Dependent (): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġtype Parameters . isNotEmpty () Ġ|| ĠreturnType Ref . is Type Parameter Dependent () Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceiver Type Ref . is Type Parameter Dependent () Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ġis ĠF ir Simple Function Ġ&& Ġvalue Parameters . any Ġ{ Ġit . returnType Ref . is Type Parameter Dependent () Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠF ir Type Ref . extract Type Parameters To ( result : ĠMutable Collection < F ir Type Parameter Ref >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġis ĠF ir Resolved Type Ref ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . lower Bound If Flex ible (). extract Type Parameters To ( result ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠC one Kotlin Type . extract Type Parameters To ( result : ĠMutable Collection < F ir Type Parameter Ref >) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠC one Type ParameterType Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ+= Ġlookup Tag . type Parameter Symbol . fir ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠC one Class Like Type Ġ-> Ġtype Arguments . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠC one Kotlin Type Projection ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . type . extract Type Parameters To ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠF ir Callable Declaration . extract Type Parameters To ( result : ĠMutable Collection < F ir Type Parameter Ref >) Ġ{ ĊĠĠĠĠĠĠĠ Ġresult Ġ+= Ġtype Parameters ĊĠĠĠĠĠĠĠ ĠreturnType Ref . extract Type Parameters To ( result ) ĊĠĠĠĠĠĠĠ Ġreceiver Type Ref ?. extract Type Parameters To ( result ) ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġis ĠF ir Simple Function ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . value Parameters . forEach Ġ{ Ġit . returnType Ref . extract Type Parameters To ( result ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbuild Type Parameters Subst it utor If Compatible ( ĊĠĠĠĠĠĠĠ Ġoverride Candidate : ĠF ir Callable Declaration , ĊĠĠĠĠĠĠĠ Ġbase Declaration : ĠF ir Callable Declaration ĊĠĠĠ Ġ): ĠC one Subst it utor Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Candidate . ensure Resolved ( F ir Resolve Phase . TYPES ) ĊĠĠĠĠĠĠĠ Ġbase Declaration . ensure Resolved ( F ir Resolve Phase . TYPES ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! override Candidate . is Type Parameter Dependent () Ġ&& Ġ! base Declaration . is Type Parameter Dependent ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠC one Subst it utor . Empty ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtype Parameters Ġ= Ġlinked Set Of < F ir Type Parameter Ref >() ĊĠĠĠĠĠĠĠ Ġoverride Candidate . extract Type Parameters To ( type Parameters ) ĊĠĠĠĠĠĠĠ Ġbase Declaration . extract Type Parameters To ( type Parameters ) ĊĠĠĠĠĠĠĠ Ġreturn Ġsubstit utor By Map ( type Parameters . build Er asure (), Ġsession ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Over ridden Function ( override Candidate : ĠF ir Simple Function , Ġbase Declaration : ĠF ir Simple Function ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( override Candidate . is Static Ġ!= Ġbase Declaration . is Static ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġoverride Candidate . ensure Resolved ( F ir Resolve Phase . TYPES ) ĊĠĠĠĠĠĠĠ Ġbase Declaration . ensure Resolved ( F ir Resolve Phase . TYPES ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠNB : Ġoverride Candidate Ġis Ġfrom ĠJava Ġand Ġhas Ġno Ġreceiver ĊĠĠĠĠĠĠĠ Ġval Ġreceiver Type Ref Ġ= Ġbase Declaration . receiver Type Ref ĊĠĠĠĠĠĠĠ Ġval Ġbase Parameter Types Ġ= ĠlistOf NotNull ( receiver Type Ref ) Ġ+ Ġbase Declaration . value Parameters . map Ġ{ Ġit . returnType Ref Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( override Candidate . value Parameters . size Ġ!= Ġbase Parameter Types . size ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġsubstit utor Ġ= Ġbuild Type Parameters Subst it utor If Compatible ( override Candidate , Ġbase Declaration ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! override Candidate . value Parameters . zip ( base Parameter Types ). all Ġ{ Ġ( param From Java , Ġbase Type ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Equal Types ( param From Java . returnType Ref , Ġbase Type , Ġsubstit utor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( consider ReturnType Kinds Ġ&& Ġ! does Return Types Have Same Kind ( override Candidate , Ġbase Declaration )) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Over ridden Property ( override Candidate : ĠF ir Callable Declaration , Ġbase Declaration : ĠF ir Property ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( base Declaration . modal ity Ġ== ĠMod ality . FINAL ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġoverride Candidate . ensure Resolved ( F ir Resolve Phase . TYPES ) ĊĠĠĠĠĠĠĠ Ġbase Declaration . ensure Resolved ( F ir Resolve Phase . TYPES ) ĊĊĠĠĠĠĠĠĠ Ġval Ġreceiver Type Ref Ġ= Ġbase Declaration . receiver Type Ref ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( override Candidate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠF ir Simple Function Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( receiver Type Ref Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġset ters ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġoverride Candidate . value Parameters . isEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( override Candidate . value Parameters . size Ġ!= Ġ 1 ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġis Equal Types ( receiver Type Ref , Ġoverride Candidate . value Parameters . single (). returnType Ref , ĠC one Subst it utor . Empty ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠF ir Property Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoverride Receiver Type Ref Ġ= Ġoverride Candidate . receiver Type Ref ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceiver Type Ref Ġ== Ġnull Ġ-> Ġoverride Receiver Type Ref Ġ== Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Receiver Type Ref Ġ== Ġnull Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġis Equal Types ( receiver Type Ref , Ġoverride Receiver Type Ref , ĠC one Subst it utor . Empty ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ