/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 9 ĠJetBrains Ġs . r . o . Ġ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 . backend . jvm . lower Ċ Ċ import Ġorg . jetbrains . kotlin . backend . common . Class Lower ing Pass Ċ import Ġorg . jetbrains . kotlin . backend . common . lower . create Ir Builder Ċ import Ġorg . jetbrains . kotlin . backend . common . lower . ir Throw Ċ import Ġorg . jetbrains . kotlin . backend . common . ph aser . make Ir File Phase Ċ import Ġorg . jetbrains . kotlin . backend . jvm . Jvm Backend Context Ċ import Ġorg . jetbrains . kotlin . descriptors . Modal ity Ċ import Ġorg . jetbrains . kotlin . ir . UNDEFINED _ OFFSET Ċ import Ġorg . jetbrains . kotlin . ir . builders . declarations . build Fun Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir Block Body Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir Call Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir String Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Class Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Declaration Origin Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Simple Function Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Value Parameter Ċ import Ġorg . jetbrains . kotlin . ir . declarations . impl . Ir Value Parameter Impl Ċ import Ġorg . jetbrains . kotlin . ir . descriptors . Wrapped Value Parameter Descriptor Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Class Symbol Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Type Parameter Symbol Ċ import Ġorg . jetbrains . kotlin . ir . symbols . impl . Ir Value Parameter Symbol Impl Ċ import Ġorg . jetbrains . kotlin . ir . types .* Ċ import Ġorg . jetbrains . kotlin . ir . util .* Ċ Ċ internal Ġval Ġcollection Stub Method Lower ing Ġ= Ġmake Ir File Phase ( ĊĠĠĠ Ġ:: Collection Stub Method Lower ing , ĊĠĠĠ Ġname Ġ= Ġ" Collection Stub Method ", ĊĠĠĠ Ġdescription Ġ= Ġ" Generate ĠCollection Ġstub Ġmethods " Ċ ) Ċ Ċ private Ġclass ĠCollection Stub Method Lower ing ( val Ġcontext : ĠJ vm Backend Context ) Ġ: ĠClass Lower ing Pass Ġ{ ĊĠĠĠ Ġprivate Ġval Ġmethod Signature Mapper Ġ= Ġcontext . method Signature Mapper ĊĊĠĠĠ Ġoverride Ġfun Ġlower ( ir Class : ĠIr Class ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ir Class . is Interface ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmethod Stub sTo Generate Ġ= Ġgenerate Re levant Stub Methods ( ir Class ) ĊĠĠĠĠĠĠĠ Ġif Ġ( method Stub sTo Generate . isEmpty ()) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġdon 't Ġneed Ġto Ġgenerate Ġstub Ġfor Ġexisting Ġmethods , Ġbut Ġfor ĠFA KE _ OVERRIDE Ġmethods Ġwith ĠAB STR ACT Ġmod ality , ĊĠĠĠĠĠĠĠ Ġ// Ġit Ġmeans Ġan Ġabstract Ġfunction Ġin Ġsuperclass Ġthat Ġis Ġnot Ġimplemented Ġyet , ĊĠĠĠĠĠĠĠ Ġ// Ġstub Ġgeneration Ġis Ġstill Ġneeded Ġto Ġavoid Ġinvocation Ġerror . ĊĠĠĠĠĠĠĠ Ġval Ġexisting Method Signatures Ġ= Ġir Class . functions . filter Not Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . modal ity Ġ== ĠMod ality . AB STR ACT Ġ&& Ġit . origin Ġ== ĠIr Declaration Origin . FA KE _ OVERRIDE ĊĠĠĠĠĠĠĠ Ġ}. associate By Ġ{ Ġit . to Signature () Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( member Ġin Ġmethod Stub sTo Generate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexisting Method Ġ= Ġexisting Method Signatures [ member . to Signature ()] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( existing Method Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn Ġthe Ġcase Ġthat Ġwe Ġfind Ġa Ġdefined Ġmethod Ġthat Ġmatches Ġthe Ġstub Ġsignature , Ġwe Ġadd Ġthe Ġoverridden Ġsymbols Ġto Ġthat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdefined Ġmethod , Ġso Ġthat Ġbridge Ġlower ing Ġcan Ġstill Ġgenerate Ġcorrect Ġbridge Ġfor Ġthat Ġmethod ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexisting Method . over ridden Symbols . addAll ( member . over ridden Symbols ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Class . declarations . add ( member ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠIr Simple Function . to Signature (): ĠString Ġ= Ġmethod Signature Mapper . map Asm Method ( this ). toString () ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Stub Method ( ĊĠĠĠĠĠĠĠ Ġfunction : ĠIr Simple Function , Ġir Class : ĠIr Class , Ġsubstitution Map : ĠMap < Ir Type Parameter Symbol , ĠIr Type > ĊĠĠĠ Ġ): ĠIr Simple Function Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbuild Fun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġfunction . name ĊĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Ġ= Ġfunction . returnType . substitute ( subst itution Map ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= Ġfunction . visibility ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Ġ= ĠIr Declaration Origin . IR _ BUIL T INS _ ST UB ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmod ality Ġ= ĠMod ality . OPEN ĊĠĠĠĠĠĠĠ Ġ}. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠReplace ĠFunction Ġmetadata Ġwith Ġthe Ġdata Ġfrom Ġclass ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġthe Ġabstract Ġfunction Ġsymbol Ġto Ġstub Ġfunction Ġfor Ġbridge Ġlower ing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverridden Symbols . add ( function . symbol ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Ġ= Ġir Class ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Parameter Ġ= Ġfunction . dispatch Receiver Parameter ?. copy With Substitution ( this , Ġsubstitution Map ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextension Receiver Parameter Ġ= Ġfunction . extension Receiver Parameter ?. copy With Substitution ( this , Ġsubstitution Map ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( parameter Ġin Ġfunction . value Parameters ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Parameters . add ( parameter . copy With Substitution ( this , Ġsubstitution Map )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFunction Ġbody Ġconsist Ġonly Ġof Ġthrowing ĠUnsupportedOperationException Ġstatement ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= Ġcontext . create Ir Builder ( function . symbol ). ir Block Body Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Throw ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Call ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Collection Stub Method Lower ing . context . ir . symbols . unsupported OperationException Class . owner . construct ors . single Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . value Parameters . size Ġ== Ġ 1 Ġ&& Ġit . value Parameters . single (). type . is Nullable String () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( 0 , Ġir String (" Operation Ġis Ġnot Ġsupported Ġfor Ġread - only Ġcollection ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠCopy Ġvalue Ġparameter Ġwith Ġtype Ġsubstitution ĊĠĠĠ Ġprivate Ġfun ĠIr Value Parameter . copy With Substitution ( target : ĠIr Simple Function , Ġsubstitution Map : ĠMap < Ir Type Parameter Symbol , ĠIr Type >) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ: ĠIr Value Parameter Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= ĠWr apped Value Parameter Descriptor ( this . descriptor . annotations ) ĊĠĠĠĠĠĠĠ Ġreturn ĠIr Value Parameter Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUN DEFINED _ OFFSET , ĠUN DEFINED _ OFFSET , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Declaration Origin . IR _ BUIL T INS _ ST UB , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Value Parameter Symbol Impl ( descriptor ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . substitute ( subst itution Map ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar arg ElementType ?. substitute ( subst itution Map ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Cross inline , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis N oin line ĊĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . bind ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Ġ= Ġtarget ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠCompute Ġa Ġsubstitution Ġmap Ġfor Ġtype Ġparameters Ġbetween Ġsource Ġclass Ġ( Mutable ĠCollection Ġclasses ) Ġto ĊĠĠĠ Ġ// Ġtarget Ġclass Ġ( class Ġcurrently Ġin Ġlower ing Ġphase ), Ġthis Ġmap Ġis Ġlater Ġused Ġfor Ġsubstit uting Ġtype Ġparameters Ġin Ġgenerated Ġfunctions ĊĠĠĠ Ġprivate Ġfun Ġcompute Substitution Map ( readOnly Class : ĠIr Class , Ġmutable Class : ĠIr Class , Ġtarget Class : ĠIr Class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ: ĠMap < Ir Type Parameter Symbol , ĠIr Type > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġfind Ġthe Ġmost Ġspecific Ġtype Ġfor Ġthe Ġimmutable Ġcollection Ġclass Ġfrom Ġthe Ġinheritance Ġchain Ġof Ġtarget Ġclass ĊĠĠĠĠĠĠĠ Ġ// ĠPerform Ġtype Ġsubstitution Ġalong Ġsearching , Ġthen Ġuse Ġthe Ġtype Ġarguments Ġobtained Ġfrom Ġthe Ġmost Ġspecific Ġtype ĊĠĠĠĠĠĠĠ Ġ// Ġfor Ġtype Ġsubstitution . ĊĠĠĠĠĠĠĠ Ġval ĠreadOnly ClassType Ġ= ĠgetAll Sup ert ypes ( target Class ). find Most Specific Type For Class ( readOnly Class . symbol ) ĊĠĠĠĠĠĠĠ Ġval ĠreadOnly ClassType Arguments Ġ= Ġ( readOnly ClassType Ġas ĠIr Simple Type ). arguments . map NotNull Ġ{ Ġ( it Ġas ? ĠIr Type Projection )?. type Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( readOnly ClassType Arguments . isEmpty () Ġ|| ĠreadOnly ClassType Arguments . size Ġ!= Ġmutable Class . type Parameters . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Type Ġargument Ġmismatch Ġbetween Ġimmutable Ġclass Ġ${ readOnly Class . fq Name When Available }" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġand Ġmutable Ġclass Ġ${ mutable Class . fq Name When Available }, Ġwhen Ġprocessing " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" class Ġ${ target Class . fq Name When Available }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmutable Class . type Parameters . map Ġ{ Ġit . symbol Ġ}. zip ( readOnly ClassType Arguments ). toMap () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠStub s For Collection Class ( ĊĠĠĠĠĠĠĠ Ġval ĠreadOnly Class : ĠIr Class Symbol , ĊĠĠĠĠĠĠĠ Ġval Ġmutable Class : ĠIr Class Symbol ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmutable Only Methods : ĠCollection < Ir Simple Function > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠreadOnly Method Signatures Ġ= ĠreadOnly Class . functions . map Ġ{ Ġit . owner . to Signature () Ġ}. to HashSet () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutable Class . functions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . owner Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . to Signature () Ġ! in ĠreadOnly Method Signatures Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to HashSet () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġcomponent 1 () Ġ= ĠreadOnly Class ĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġcomponent 2 () Ġ= Ġmutable Class ĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġcomponent 3 () Ġ= Ġmutable Only Methods ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġpre Computed Stub s : ĠCollection < Stub s For Collection Class > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( context . ir . symbols ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollection Ġto Ġmutable Collection , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Ġto Ġmutable Set , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Ġto Ġmutable List , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Ġto Ġmutable Map , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Entry Ġto Ġmutable Map Entry , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiterable Ġto Ġmutable Iterable , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiterator Ġto Ġmutable Iterator , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Iterator Ġto Ġmutable List Iterator ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). map Ġ{ Ġ( readOnly Class , Ġmutable Class ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStub s For Collection Class ( readOnly Class , Ġmutable Class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠCompute Ġstub s Ġthat Ġshould Ġbe Ġgenerated , Ġcompare Ġbased Ġon Ġsignature ĊĠĠĠ Ġprivate Ġfun Ġgenerate Re levant Stub Methods ( ir Class : ĠIr Class ): ĠSet < Ir Simple Function > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġour Stub s For Collection Classes Ġ= Ġpre Computed Stub s . filter Ġ{ Ġ( readOnly Class , Ġmutable Class ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir Class . super Types . any Ġ{ Ġsup ertype Symbol Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsup ertype Ġ= Ġsup ertype Symbol . class OrNull ?. owner ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġneed Ġto Ġgenerate Ġstub Ġmethods Ġfor Ġfollowing Ġ 2 Ġcases : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcurrent Ġclass 's Ġdirect Ġsuper Ġtype Ġis Ġa Ġjava Ġclass Ġor Ġkotlin Ġinterface , Ġand Ġis Ġan Ġsubtype Ġof Ġan Ġimmutable Ġcollection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsup ertype Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ( sup ertype . come s From Java () Ġ|| Ġsup ertype . is Interface ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġsup ertype Symbol . is Subtype Of Class ( readOnly Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ! ir Class . symbol . is Subtype Of Class ( mutable Class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġdo Ġa Ġsecond Ġfiltering Ġto Ġensure Ġonly Ġmost Ġrelevant Ġclasses Ġare Ġincluded . ĊĠĠĠĠĠĠĠ Ġval Ġredundant Classes Ġ= Ġour Stub s For Collection Classes . filter Ġ{ Ġ( readOnly Class ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġour Stub s For Collection Classes . any Ġ{ ĠreadOnly Class Ġ!= Ġit . readOnly Class Ġ&& Ġit . readOnly Class . is Subtype Of Class ( readOnly Class ) Ġ} ĊĠĠĠĠĠĠĠ Ġ}. map Ġ{ Ġit . readOnly Class Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġperform Ġtype Ġsubstitution Ġand Ġtype Ġer asure Ġhere ĊĠĠĠĠĠĠĠ Ġreturn Ġour Stub s For Collection Classes . filter Ġ{ Ġ( readOnly Class ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠreadOnly Class Ġ! in Ġredundant Classes ĊĠĠĠĠĠĠĠ Ġ}. flatMap Ġ{ Ġ( readOnly Class , Ġmutable Class , Ġmutable Only Methods ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsubstitution Map Ġ= Ġcompute Substitution Map ( readOnly Class . owner , Ġmutable Class . owner , Ġir Class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutable Only Methods . map Ġ{ Ġfunction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Stub Method ( function , Ġir Class , Ġsubstitution Map ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. to HashSet () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠIr Class . come s From Java () Ġ= Ġorigin Ġ== ĠIr Declaration Origin . IR _ EXTERNAL _ JAVA _ DECL AR ATION _ ST UB ĊĊĠĠĠ Ġprivate Ġfun ĠCollection < Ir Type >. find Most Specific Type For Class ( classifier : ĠIr Class Symbol ): ĠIr Type Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtypes Ġ= Ġthis . filter Ġ{ Ġit . classifier OrNull Ġ== Ġclassifier Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( types . isEmpty ()) Ġerror (" No Ġsup ertype Ġof Ġ$ classifier Ġin Ġ$ this ") ĊĠĠĠĠĠĠĠ Ġif Ġ( types . size Ġ== Ġ 1 ) Ġreturn Ġtypes . first () ĊĠĠĠĠĠĠĠ Ġ// ĠFind Ġthe Ġfirst Ġtype Ġin Ġthe Ġlist Ġsuch Ġthat Ġit 's Ġa Ġsubtype Ġof Ġevery Ġother Ġtype Ġin Ġthat Ġlist ĊĠĠĠĠĠĠĠ Ġreturn Ġtypes . first Ġ{ Ġtype Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtypes . all Ġ{ Ġother Ġ-> Ġtype . is Subtype Of Class ( other . class OrNull !! ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }