/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 5 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . types . subst itution s Ċ Ċ import Ġorg . jetbrains . kotlin . descriptors . Callable Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Class Descriptor Ċ import Ġorg . jetbrains . kotlin . types .* Ċ import Ġorg . jetbrains . kotlin . types . checker . Type Checking Procedure Ċ import Ġjava . util . Linked HashMap Ċ Ċ public Ġfun ĠgetType Substitution ( base Type : ĠKotlin Type , Ġderived Type : ĠKotlin Type ): ĠLinkedHashMap < Type Constructor , ĠType Projection >? Ġ{ ĊĠĠĠ Ġval Ġsubstit uted Type Ġ= ĠType Checking Procedure . find Corre sponding Sup ertype ( derived Type , Ġbase Type ) Ġ?: Ġreturn Ġnull ĊĊĠĠĠ Ġval Ġsubstitution Ġ= ĠLinkedHashMap < Type Constructor , ĠType Projection >( subst it uted Type . get Arguments (). size ()) ĊĠĠĠ Ġfor Ġ(( param , Ġarg ) Ġin Ġbase Type . get Constructor (). getParameters () Ġzip Ġsubstit uted Type . get Arguments ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġsubstitution [ param . getType Constructor ()] Ġ= Ġarg ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġsubstitution Ċ } Ċ Ċ public Ġfun Ġget Callable Substitution ( ĊĠĠĠĠĠĠĠ Ġbase Callable : ĠCallable Descriptor , ĊĠĠĠĠĠĠĠ Ġderived Callable : ĠCallable Descriptor Ċ ): ĠMutable Map < Type Constructor , ĠType Projection >? Ġ{ ĊĠĠĠ Ġval Ġbase Class Ġ= Ġbase Callable . get Containing Declaration () Ġas ? ĠClass Descriptor Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġval Ġderived Class Ġ= Ġderived Callable . get Containing Declaration () Ġas ? ĠClass Descriptor Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġval Ġsubstitution Ġ= ĠgetType Substitution ( base Class . getDefault Type (), Ġderived Class . getDefault Type ()) Ġ?: Ġreturn Ġnull ĊĊĠĠĠ Ġfor Ġ(( base Param , Ġderived Param ) Ġin Ġbase Callable . getType Parameters () Ġzip Ġderived Callable . getType Parameters ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġsubstitution [ base Param . getType Constructor ()] Ġ= ĠType Projection Impl ( derived Param . getDefault Type ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġsubstitution Ċ } Ċ Ċ public Ġfun Ġget Callable Subst it utor ( ĊĠĠĠĠĠĠĠ Ġbase Callable : ĠCallable Descriptor , ĊĠĠĠĠĠĠĠ Ġderived Callable : ĠCallable Descriptor Ċ ): ĠType Subst it utor ? Ġ{ ĊĠĠĠ Ġreturn Ġget Callable Substitution ( base Callable , Ġderived Callable )?. let Ġ{ ĠType Subst it utor . create ( it ) Ġ} Ċ } Ċ Ċ public Ġfun ĠgetType Subst it utor ( base Type : ĠKotlin Type , Ġderived Type : ĠKotlin Type ): ĠType Subst it utor ? Ġ{ ĊĠĠĠ Ġreturn ĠgetType Substitution ( base Type , Ġderived Type )?. let Ġ{ ĠType Subst it utor . create ( it ) Ġ} Ċ } Ċ