/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 7 Ġ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 . backend . kon an . objc export Ċ Ċ import Ġorg . jetbrains . kotlin . backend . kon an .* Ċ import Ġorg . jetbrains . kotlin . backend . kon an . descriptors .* Ċ import Ġorg . jetbrains . kotlin . builtins . get Receiver Type From FunctionType Ċ import Ġorg . jetbrains . kotlin . builtins . get ReturnType From FunctionType Ċ import Ġorg . jetbrains . kotlin . builtins . getValue Parameter Types From FunctionType Ċ import Ġorg . jetbrains . kotlin . descriptors .* Ċ import Ġorg . jetbrains . kotlin . incremental . components . No Lookup Location Ċ import Ġorg . jetbrains . kotlin . ir . util . report Ċ import Ġorg . jetbrains . kotlin . name . Fq Name Ċ import Ġorg . jetbrains . kotlin . name . Name Ċ import Ġorg . jetbrains . kotlin . resolve . constants . Array Value Ċ import Ġorg . jetbrains . kotlin . resolve . constants . K Class Value Ċ import Ġorg . jetbrains . kotlin . resolve . descriptor Util .* Ċ import Ġorg . jetbrains . kotlin . resolve . scopes . Member Scope Ċ import Ġorg . jetbrains . kotlin . types . Kotlin Type Ċ import Ġorg . jetbrains . kotlin . types . Type Utils Ċ import Ġorg . jetbrains . kotlin . types . type Util . sup ert ypes Ċ import Ġorg . jetbrains . kotlin . utils . add If NotNull Ċ Ċ internal Ġclass ĠObj C Export Header Generator ( val Ġcontext : ĠContext ) Ġ{ ĊĠĠĠ Ġval Ġmapper : ĠObj C Export Mapper Ġ= Ġobject Ġ: ĠObj C Export Mapper () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Category Members For ( descriptor : ĠClass Descriptor ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextensions [ descriptor ]. or Empty () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġis Special Mapped ( descriptor : ĠClass Descriptor ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġthis Ġmethod Ġduplicates Ġsome Ġof Ġthe Ġ[ map Reference Type ] Ġlogic . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdescriptor Ġ== Ġcontext . built Ins . any Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . getAll Super Class ifiers (). any Ġ{ Ġit Ġin Ġcustom TypeMap pers Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġn amer Ġ= ĠObj C Export N amer ( context , Ġmapper ) ĊĊĠĠĠ Ġval Ġgenerated Classes Ġ= Ġmutable Set Of < Class Descriptor >() ĊĠĠĠ Ġval Ġtop Level Ġ= Ġmutable Map Of < Fq Name , ĠMutable List < Callable Member Descriptor >>() ĊĊĠĠĠ Ġval Ġcustom TypeMap pers : ĠMap < Class Descriptor , ĠCustom Type Mapper > Ġ= Ġwith Ġ( context . built Ins ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable ListOf < Custom Type Mapper >() ĊĊĠĠĠĠĠĠĠ Ġval Ġgenerator Ġ= Ġthis @ Obj C Export Header Generator ĊĊĠĠĠĠĠĠĠ Ġresult Ġ+= ĠCustom Type Mapper . Collection ( generator , Ġlist , Ġ" NSArray ") ĊĠĠĠĠĠĠĠ Ġresult Ġ+= ĠCustom Type Mapper . Collection ( generator , Ġmutable List , Ġ" NS Mutable Array ") ĊĠĠĠĠĠĠĠ Ġresult Ġ+= ĠCustom Type Mapper . Collection ( generator , Ġset , Ġ" NS Set ") ĊĠĠĠĠĠĠĠ Ġresult Ġ+= ĠCustom Type Mapper . Collection ( generator , Ġmutable Set , Ġn amer . mutable SetName ) ĊĠĠĠĠĠĠĠ Ġresult Ġ+= ĠCustom Type Mapper . Collection ( generator , Ġmap , Ġ" NSDictionary ") ĊĠĠĠĠĠĠĠ Ġresult Ġ+= ĠCustom Type Mapper . Collection ( generator , Ġmutable Map , Ġn amer . mutable Map Name ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( descriptor Ġin ĠlistOf ( boolean , Ġchar , Ġbyte , Ġshort , Ġint , Ġlong , Ġfloat , Ġdouble )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠKotlin Ġcode Ġdoesn 't Ġhave Ġany Ġcheck casts Ġon Ġun box ing , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġso Ġit Ġis Ġpossible Ġthat Ġit Ġexpects Ġbox ed Ġnumber Ġof Ġother Ġtype Ġand Ġun boxes Ġit Ġincorrectly . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠNS Number Ġseem Ġto Ġhave Ġdifferent Ġequality Ġsemantics . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ+= ĠCustom Type Mapper . Simple ( descriptor , Ġ" NS Number ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġresult Ġ+= ĠCustom Type Mapper . Simple ( string , Ġ" NSString ") ĊĊĠĠĠĠĠĠĠ Ġ( 0 Ġ.. Ġmapper . max FunctionType Parameter Count ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ+= ĠCustom Type Mapper . Function ( generator , Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġresult . associate By Ġ{ Ġit . mapped Class Descriptor Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġhidden Types : ĠSet < Class Descriptor > Ġ= Ġrun Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcustom Mapped Types Ġ= Ġcustom TypeMap pers . keys ĊĊĠĠĠĠĠĠĠ Ġcustom Mapped Types ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġit . getAll Super Class ifiers (). toList () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit Ġas ĠClass Descriptor Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toSet () Ġ- Ġcustom Mapped Types ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġkotlin Any Name Ġ= Ġn amer . kotlin Any Name ĊĊĠĠĠ Ġprivate Ġval Ġstub s Ġ= Ġmutable ListOf < Stub >() ĊĠĠĠ Ġprivate Ġval Ġclass Or Interface To Name Ġ= Ġmutable Map Of < Class Descriptor , ĠString >() ĊĊĠĠĠ Ġinternal Ġval Ġclass Forward Declarations Ġ= Ġmutable Set Of < String >() ĊĠĠĠ Ġinternal Ġval Ġprotocol Forward Declarations Ġ= Ġmutable Set Of < String >() ĊĊĠĠĠ Ġprivate Ġval Ġextensions Ġ= Ġmutable Map Of < Class Descriptor , ĠMutable List < Callable Member Descriptor >>() ĊĠĠĠ Ġval Ġextra Classes To Translate Ġ= Ġmutable Set Of < Class Descriptor >() ĊĊĠĠĠ Ġfun Ġtranslate Module () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġmake Ġthe Ġtranslation Ġorder Ġstable ĊĠĠĠĠĠĠĠ Ġ// Ġto Ġstabil ize Ġname Ġm angling . ĊĊĠĠĠĠĠĠĠ Ġval Ġpackage Fragments Ġ= Ġcontext . module Descriptor . get Package Fragments () ĊĊĠĠĠĠĠĠĠ Ġpackage Fragments . forEach Ġ{ Ġpackage Fragment Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Fragment . get Member Scope (). get Cont ributed Descriptors () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Is Instance < Callable Member Descriptor >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġmapper . shouldBe Ex posed ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclass Descriptor Ġ= Ġmapper . getClass If Category ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( class Descriptor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextensions . get Or Put ( class Descriptor , Ġ{ Ġmutable ListOf () Ġ}) Ġ+= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Level . get Or Put ( package Fragment . fq Name , Ġ{ Ġmutable ListOf () Ġ}) Ġ+= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠMember Scope . translate Classes (): ĠUnit Ġ= Ġthis . get Cont ributed Descriptors () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Is Instance < Class Descriptor >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġmapper . shouldBe Ex posed ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . is Interface ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtranslate Interface ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtranslate Class ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . un subst it uted Member Scope . translate Classes () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpackage Fragments . forEach Ġ{ Ġpackage Fragment Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Fragment . get Member Scope (). translate Classes () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġextensions . forEach Ġ{ Ġclass Descriptor , Ġdeclarations Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtranslate Extensions ( class Descriptor , Ġdeclarations ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtop Level . forEach Ġ{ Ġpackage Fq Name , Ġdeclarations Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtranslate TopLevel ( package Fq Name , Ġdeclarations ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( extra Classes To Translate . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġextra Classes To Translate . first () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextra Classes To Translate Ġ-= Ġdescriptor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( descriptor . is Interface ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtranslate Interface ( descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtranslate Class ( descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtranslate ClassName ( descriptor : ĠClass Descriptor ): ĠString Ġ= Ġclass Or Interface To Name . get Or Put ( descriptor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġassert ( mapper . shouldBe Ex posed ( descriptor )) ĊĠĠĠĠĠĠĠ Ġval Ġforward Declarations Ġ= Ġif Ġ( descriptor . is Interface ) Ġprotocol Forward Declarations Ġelse Ġclass Forward Declarations ĊĊĠĠĠĠĠĠĠ Ġn amer . getClass Or Protocol Name ( descriptor ). also Ġ{ Ġforward Declarations Ġ+= Ġit Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtranslate Interface ( descriptor : ĠClass Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! generated Classes . add ( descriptor )) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġtranslate ClassName ( descriptor ) ĊĊĠĠĠĠĠĠĠ Ġstub s . add Built By Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+" @ protocol Ġ$ name ${ descriptor . super Protocols Clause }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+" @ required " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtranslate Class Or Interface Members ( descriptor ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+" @ end ;" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠClass Descriptor . super Protocols Clause : ĠString Ġget () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinterfaces Ġ= Ġthis . get Super Interfaces (). filter Ġ{ Ġmapper . shouldBe Ex posed ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( interfaces . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" Ġ< ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterfaces . join To ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtranslate Interface ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtranslate ClassName ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ("> ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtranslate Extensions ( class Descriptor : ĠClass Descriptor , Ġdeclarations : ĠList < Callable Member Descriptor >) Ġ{ ĊĠĠĠĠĠĠĠ Ġtranslate Class ( class Descriptor ) ĊĊĠĠĠĠĠĠĠ Ġstub s . add Built By Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+" @ interface Ġ${ translate ClassName ( class Descriptor )} Ġ( Extensions )" ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtranslate Members ( declarations ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+" @ end ;" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtranslate TopLevel ( package Fq Name : ĠF q Name , Ġdeclarations : ĠList < Callable Member Descriptor >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġn amer . get PackageName ( package Fq Name ) ĊĠĠĠĠĠĠĠ Ġstub s . add Built By Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+" __ attribute __(( objc _ subclass ing _ restricted )) " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+" @ interface Ġ$ name Ġ: Ġ${ nam er . kotlin Any Name }" Ġ// ĠTODO : Ġstop Ġinherit ing ĠKotlin Base . ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtranslate Members ( declarations ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+" @ end ;" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtranslate Class ( descriptor : ĠClass Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! generated Classes . add ( descriptor )) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġtranslate ClassName ( descriptor ) ĊĠĠĠĠĠĠĠ Ġval ĠsuperClass Ġ= Ġdescriptor . get Super Class Not Any () ĊĊĠĠĠĠĠĠĠ Ġval Ġsuper Name Ġ= Ġif Ġ( super Class Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin Any Name ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtranslate Class ( super Class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtranslate ClassName ( super Class ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġstub s . add Built By Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( descriptor . is Final Or Enum ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+" __ attribute __(( objc _ subclass ing _ restricted )) " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+" @ interface Ġ$ name Ġ: Ġ$ super Name ${ descriptor . super Protocols Clause }" ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpresent Construct ors Ġ= Ġmutable Set Of < String >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . construct ors . filter Ġ{ Ġmapper . shouldBe Ex posed ( it ) Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselector Ġ= Ġget Selector ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! descriptor . isArray ) Ġpresent Construct ors Ġ+= Ġselector ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+" ${ get Signature ( it , Ġit )}; " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selector Ġ== Ġ" init ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ "+ Ġ( instancetype ) new ĠOB JC _ SW IFT _ UN AVAILABLE (\" use Ġobject Ġinitial izers Ġinstead \ "); " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ "" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( descriptor . isArray Ġ|| Ġdescriptor . kind Ġ== ĠClass Kind . OBJECT Ġ|| Ġdescriptor . kind Ġ== ĠClass Kind . ENUM _ CLASS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ "+ ( instancetype ) alloc Ġ__ attribute __(( un available )); " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ "+ ( instancetype ) alloc With Zone :( struct Ġ_ NS Zone Ġ*) zone Ġ__ attribute __(( un available )); " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ "" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġconsider Ġadding Ġexception - throw ing Ġimp ls Ġfor Ġthese . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( descriptor . kind ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass Kind . OBJECT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ "+ ( instancetype ) ${ nam er . getObject Instance Selector ( descriptor )} ĠNS _ SW IFT _ NAME ( init ()); " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ "" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass Kind . ENUM _ CLASS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġmap Type ( descriptor . default Type , ĠReference Bridge ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . enum Entries . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Name Ġ= Ġn amer . get Enum Entry Selector ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+" @ property Ġ( class , Ġreadonly ) Ġ${ type . render ( entry Name )}; " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ "" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNothing Ġspecial . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHide Ġ" un implemented " Ġsuper Ġconstructors : ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsuperClass ?. construct ors ?. filter Ġ{ Ġmapper . shouldBe Ex posed ( it ) Ġ} ?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselector Ġ= Ġget Selector ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selector Ġ! in Ġpresent Construct ors ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+" ${ get Signature ( it , Ġit )} Ġ__ attribute __(( un available )); " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selector Ġ== Ġ" init ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ "+ ( instancetype ) Ġnew Ġ__ attribute __(( un available )); " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ "" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġconsider Ġadding Ġexception - throw ing Ġimp ls Ġfor Ġthese . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtranslate Class Or Interface Members ( descriptor ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+" @ end ;" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠStub Builder . translate Class Or Interface Members ( descriptor : ĠClass Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmembers Ġ= Ġdescriptor . un subst it uted Member Scope . get Cont ributed Descriptors () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Is Instance < Callable Member Descriptor >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġmapper . shouldBe Ex posed ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġtranslate Members ( members ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠStub Builder . translate Members ( members : ĠList < Callable Member Descriptor >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġadd Ġsome Ġmarks Ġabout Ġmod ality . ĊĊĠĠĠĠĠĠĠ Ġval Ġmethods Ġ= Ġmutable ListOf < Function Descriptor >() ĊĠĠĠĠĠĠĠ Ġval Ġproperties Ġ= Ġmutable ListOf < Property Descriptor >() ĊĊĠĠĠĠĠĠĠ Ġmembers . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFunction Descriptor Ġ-> Ġmethods Ġ+= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠProperty Descriptor Ġ-> Ġif Ġ( mapper . is Obj C Property ( it )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperties Ġ+= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethods . add If NotNull ( it . getter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethods . add If NotNull ( it . setter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmethods . forEach Ġ{ Ġmethod Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuper Signatures Ġ= Ġmethod . over ridden Descriptors ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġmapper . shouldBe Ex posed ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġget Signatures ( it . original ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toSet () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( get Signatures ( method ) Ġ- Ġsuper Signatures ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ "$ it ;" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġproperties . forEach Ġ{ Ġproperty Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuper Signatures Ġ= Ġproperty . over ridden Descriptors ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġmapper . shouldBe Ex posed ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġget Signatures ( it . original ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toSet () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Signatures ( property ). filter Ġ{ Ġit Ġ! in Ġsuper Signatures Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ "$ it ;" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġmethod To Signatures Ġ= Ġmutable Map Of < Function Descriptor , ĠSet < String >>() ĊĊĠĠĠ Ġprivate Ġfun Ġget Signatures ( method : ĠFunction Descriptor ) Ġ= Ġmethod To Signatures . get Or Put ( method ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmapper . getBase Methods ( method ). distinct By Ġ{ Ġn amer . get Selector ( it ) Ġ}. map Ġ{ Ġbase Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Signature ( method , Ġbase ) ĊĠĠĠĠĠĠĠ Ġ}. toSet () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġproperty To Signatures Ġ= Ġmutable Map Of < Property Descriptor , ĠSet < String >>() ĊĊĠĠĠ Ġprivate Ġfun Ġget Signatures ( property : ĠProperty Descriptor ) Ġ= Ġproperty To Signatures . get Or Put ( property ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmapper . getBase Properties ( property ). distinct By Ġ{ Ġn amer . getName ( it ) Ġ}. map Ġ{ Ġbase Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Signature ( property , Ġbase ) ĊĠĠĠĠĠĠĠ Ġ}. toSet () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO : Ġconsider Ġchecking Ġthat Ġsignatures Ġfor Ġbases Ġwith Ġsame Ġselector / name Ġare Ġequal . ĊĊĠĠĠ Ġfun Ġget Selector ( method : ĠFunction Descriptor ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġn amer . get Selector ( method ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Signature ( property : ĠProperty Descriptor , Ġbase Property : ĠProperty Descriptor ) Ġ= Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠ Ġassert ( mapper . is Base Property ( base Property )) ĊĠĠĠĠĠĠĠ Ġassert ( mapper . is Obj C Property ( base Property )) ĊĊĠĠĠĠĠĠĠ Ġval Ġgetter Bridge Ġ= Ġmapper . bridge Method ( base Property . getter !! ) ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġmap ReturnType ( getter Bridge . return Bridge , Ġproperty . getter !! ) ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġn amer . getName ( base Property ) ĊĊĠĠĠĠĠĠĠ Ġappend ("@ property Ġ") ĊĊĠĠĠĠĠĠĠ Ġval Ġattributes Ġ= Ġmutable ListOf < String >() ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! getter Bridge . is Instance ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattributes Ġ+= Ġ" class " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġgetter Selector Ġ= Ġget Selector ( base Property . getter !! ) ĊĠĠĠĠĠĠĠ Ġif Ġ( getter Selector Ġ!= Ġname ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattributes Ġ+= Ġ" getter =$ getter Selector " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġproperty Setter Ġ= Ġproperty . setter ĊĠĠĠĠĠĠĠ Ġif Ġ( property Setter Ġ!= Ġnull Ġ&& Ġmapper . shouldBe Ex posed ( property Setter )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsetter Selector Ġ= Ġmapper . getBase Methods ( property Setter ). map Ġ{ Ġn amer . get Selector ( it ) Ġ}. distinct (). single () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( setter Selector Ġ!= Ġ" set " Ġ+ Ġname . capitalize () Ġ+ Ġ": ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattributes Ġ+= Ġ" setter =$ setter Selector " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattributes Ġ+= Ġ" readonly " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( attributes . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattributes . join To ( this , Ġprefix Ġ= Ġ" (", Ġpostfix Ġ= Ġ") Ġ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġappend ( type . render ( name )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Signature ( method : ĠFunction Descriptor , Ġbase Method : ĠFunction Descriptor ) Ġ= Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠ Ġassert ( mapper . is Base Method ( base Method )) ĊĠĠĠĠĠĠĠ Ġval Ġmethod Bridge Ġ= Ġmapper . bridge Method ( base Method ) ĊĊĠĠĠĠĠĠĠ Ġexport Thrown From This And Over ridden ( method ) ĊĊĠĠĠĠĠĠĠ Ġval Ġselector Parts Ġ= Ġget Selector ( base Method ). split (': ') ĊĊĠĠĠĠĠĠĠ Ġif Ġ( method Bridge . is Instance ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ("- ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ("+ ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġappend (" (" ) ĊĠĠĠĠĠĠĠ Ġappend ( map ReturnType ( method Bridge . return Bridge , Ġmethod ). render ()) ĊĠĠĠĠĠĠĠ Ġappend (" )") ĊĊĠĠĠĠĠĠĠ Ġval Ġvalue Parameters Associated Ġ= Ġmethod Bridge . value Parameters Associated ( method ) ĊĊĠĠĠĠĠĠĠ Ġval Ġvalue Parameter Names Ġ= Ġmutable ListOf < String >() ĊĊĠĠĠĠĠĠĠ Ġvalue Parameters Associated . forEach Ġ{ Ġ( bridge , Ġp ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcandidate Ġ= Ġwhen Ġ( bridge ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMethod Bridge Value Parameter . Mapped Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp Ġis ĠReceiver Parameter Descriptor Ġ-> Ġ" receiver " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Ġis ĠProperty Setter Descriptor Ġ-> Ġ" value " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġp . name . asString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Bridge Value Parameter . Error Out Parameter Ġ-> Ġ" error " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMethod Bridge Value Parameter . Kotlin Result Out Parameter Ġ-> Ġ" result " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( candidate Ġin Ġvalue Parameter Names ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcandidate Ġ+= Ġ"_" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Parameter Names Ġ+= Ġcandidate ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġappend ( selector Parts [ 0 ]) ĊĊĠĠĠĠĠĠĠ Ġvalue Parameters Associated . forEach Indexed Ġ{ Ġindex , Ġ( bridge , Ġp ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġvalue Parameter Names [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġwhen Ġ( bridge ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMethod Bridge Value Parameter . Mapped Ġ-> Ġmap Type ( p !!. type , Ġbridge . bridge ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Bridge Value Parameter . Error Out Parameter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObj CP o inter Type ( Obj C Nullable Reference Type ( Obj C ClassType (" N SError ")), Ġnullable Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMethod Bridge Value Parameter . Kotlin Result Out Parameter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObj CP o inter Type ( map Type ( method . returnType !! , Ġbridge . bridge ), Ġnullable Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (' Ġ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( selector Parts [ index ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (": ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" (" ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( type . render ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġswift Name Ġ= Ġn amer . get Swift Name ( base Method ) ĊĊĠĠĠĠĠĠĠ Ġappend (" ĠNS _ SW IFT _ NAME ($ swift Name )") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( method Ġis ĠConstructor Descriptor Ġ&& Ġ! method . construct ed Class . isArray ) Ġ{ Ġ// ĠTODO : Ġcheck Ġmethod Bridge Ġinstead . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" ĠNS _ DE SIGN ATED _ INITIAL IZER ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġconsider Ġadding Ġswift _ error Ġattribute . ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġmethods With Throw Annotation Consider ed Ġ= Ġmutable Set Of < Function Descriptor >() ĊĊĠĠĠ Ġprivate Ġval Ġunchecked Exception Classes Ġ= ĠlistOf (" Error ", Ġ" RuntimeException "). map Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . built Ins . built Ins Package Scope ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Cont ributed Classifier ( Name . identifier ( it ), ĠNo Lookup Location . FROM _ BACKEND ) Ġas ĠClass Descriptor ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexport Thrown ( method : ĠFunction Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! method . kind . is Real ) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġthrows Annotation Ġ= Ġmethod . annotations . find Annotation ( Kon an Built Ins . Fq Names . throws ) Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! mapper . does Throw ( method )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . report ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . ir . get ( method ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"@ ${ Kon an Built Ins . Fq Names . throws . short Name ()} Ġannotation Ġshould Ġalso Ġbe Ġadded Ġto Ġa Ġbase Ġmethod ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Error Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( method Ġin Ġmethods With Throw Annotation Consider ed ) Ġreturn ĊĠĠĠĠĠĠĠ Ġmethods With Throw Annotation Consider ed Ġ+= Ġmethod ĊĊĠĠĠĠĠĠĠ Ġval Ġarguments Ġ= Ġ( throws Annotation . all Value Arguments . values . single () Ġas ĠArray Value ). value ĊĠĠĠĠĠĠĠ Ġfor Ġ( argument Ġin Ġarguments ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclass Descriptor Ġ= ĠType Utils . getClass Descriptor (( argument Ġas ĠK Class Value ). value ) Ġ?: Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġunchecked Exception Classes . first OrNull Ġ{ Ġclass Descriptor . is Subclass Of ( it ) Ġ} ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . report ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . ir . get ( method ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Method Ġis Ġdeclared Ġto Ġthrow Ġ${ class Descriptor . fq Name Safe }, Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" but Ġinstances Ġof Ġ${ it . fq Name Safe } Ġand Ġits Ġsubclasses Ġaren 't Ġpropag ated Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" from ĠKotlin Ġto ĠObjective - C / Swift ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Error Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġschedule Class ToBe Generated ( class Descriptor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexport Thrown From This And Over ridden ( method : ĠFunction Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmethod . all Over ridden Descriptors . forEach Ġ{ Ġexport Thrown ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmap ReturnType ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Bridge : ĠMethod Bridge . ReturnValue , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod : ĠFunction Descriptor ĊĠĠĠ Ġ): ĠObj C Type Ġ= Ġwhen Ġ( return Bridge ) Ġ{ ĊĠĠĠĠĠĠĠ ĠMethod Bridge . ReturnValue . Void Ġ-> ĠObj CV oid Type ĊĠĠĠĠĠĠĠ ĠMethod Bridge . ReturnValue . HashCode Ġ-> ĠObj CP ri mitive Type (" NS U Integer ") ĊĠĠĠĠĠĠĠ Ġis ĠMethod Bridge . ReturnValue . Mapped Ġ-> Ġmap Type ( method . returnType !! , Ġreturn Bridge . bridge ) ĊĠĠĠĠĠĠĠ ĠMethod Bridge . ReturnValue . WithError . Success Ġ-> ĠObj CP ri mitive Type (" BOOL ") ĊĠĠĠĠĠĠĠ Ġis ĠMethod Bridge . ReturnValue . WithError . Ref OrNull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuccess ReturnType Ġ= Ġmap ReturnType ( return Bridge . success Bridge , Ġmethod ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( success ReturnType Ġ! is ĠObj C NonNull Reference Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Function Ġis Ġexpected Ġto Ġhave Ġnon - null Ġreturn Ġtype : Ġ$ method ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠObj C Nullable Reference Type ( success ReturnType ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠMethod Bridge . ReturnValue . Instance . Init Result , ĊĠĠĠĠĠĠĠ ĠMethod Bridge . ReturnValue . Instance . Factory Result Ġ-> ĠObj C Instance Type ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild (): ĠList < String > Ġ= Ġmutable ListOf < String >(). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġadd ("# import Ġ< Foundation / Foundation . h >") ĊĠĠĠĠĠĠĠ Ġadd ("") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( class Forward Declarations . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ("@ class Ġ${ class Forward Declarations . join ToString ()}; ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ("") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( protocol Forward Declarations . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ("@ protocol Ġ${ protocol Forward Declarations . join ToString ()}; ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ("") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġadd (" NS _ ASSUME _ NONNULL _ BEGIN ") ĊĠĠĠĠĠĠĠ Ġadd ("") ĊĊĠĠĠĠĠĠĠ Ġadd ("@ interface Ġ$ kotlin Any Name Ġ: ĠNSObject ") ĊĠĠĠĠĠĠĠ Ġadd (" -( instancetype ) Ġinit Ġ__ attribute __(( un available )); ") ĊĠĠĠĠĠĠĠ Ġadd (" +( instancetype ) Ġnew Ġ__ attribute __(( un available )); ") ĊĠĠĠĠĠĠĠ Ġadd (" +( void ) initialize Ġ__ attribute __(( objc _ requires _ super )); ") ĊĠĠĠĠĠĠĠ Ġadd ("@ end ; ") ĊĠĠĠĠĠĠĠ Ġadd ("") ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġadd Ġcomment Ġto Ġthe Ġheader . ĊĠĠĠĠĠĠĠ Ġadd ("@ interface Ġ$ kotlin Any Name Ġ(${ kotlin Any Name } Copy ing ) Ġ< N SC opy ing >") ĊĠĠĠĠĠĠĠ Ġadd ("@ end ; ") ĊĠĠĠĠĠĠĠ Ġadd ("") ĊĊĠĠĠĠĠĠĠ Ġadd ("__ attribute __(( objc _ runtime _ name (\" Kotlin Mutable Set \" ))) ") ĊĠĠĠĠĠĠĠ Ġadd ("@ interface Ġ${ nam er . mutable SetName } < ObjectType > Ġ: ĠNSMutable Set < ObjectType >") Ġ// ĠTODO : Ġonly Ġif Ġappears ĊĠĠĠĠĠĠĠ Ġadd ("@ end ; ") ĊĠĠĠĠĠĠĠ Ġadd ("") ĊĊĠĠĠĠĠĠĠ Ġadd ("__ attribute __(( objc _ runtime _ name (\" Kotlin Mutable Dictionary \" ))) ") ĊĠĠĠĠĠĠĠ Ġadd ("@ interface Ġ${ nam er . mutable Map Name } < KeyType , ĠObjectType > Ġ: ĠNSMutable Dictionary < KeyType , ĠObjectType >") Ġ// ĠTODO : Ġonly Ġif Ġappears ĊĠĠĠĠĠĠĠ Ġadd ("@ end ; ") ĊĠĠĠĠĠĠĠ Ġadd ("") ĊĊĠĠĠĠĠĠĠ Ġadd ("@ interface ĠN SError Ġ( N SError Kotlin Exception )") ĊĠĠĠĠĠĠĠ Ġadd ("@ property Ġ( readonly ) Ġid Ġ_ Nullable Ġkotlin Exception ; ") ĊĠĠĠĠĠĠĠ Ġadd ("@ end ; ") ĊĠĠĠĠĠĠĠ Ġadd ("") ĊĊĠĠĠĠĠĠĠ Ġstub s . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd All ( it . lines ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ("") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġadd (" NS _ ASSUME _ NONNULL _ END ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġsealed Ġclass ĠObj C Type Ġ{ ĊĠĠĠ Ġfinal Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġthis . render () ĊĊĠĠĠ Ġabstract Ġfun Ġrender ( attrs And Name : ĠString ): ĠString ĊĊĠĠĠ Ġfun Ġrender () Ġ= Ġrender ("") ĊĊĠĠĠ Ġprotected Ġfun ĠString . with Attrs And Name ( attrs And Name : ĠString ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( attrs And Name . isEmpty ()) Ġthis Ġelse Ġ"$ this Ġ${ attrs And Name . trim Start () }" Ċ } Ċ Ċ internal Ġsealed Ġclass ĠObj C Reference Type Ġ: ĠObj C Type () Ċ Ċ internal Ġsealed Ġclass ĠObj C NonNull Reference Type Ġ: ĠObj C Reference Type () Ċ Ċ internal Ġdata Ġclass ĠObj C Nullable Reference Type ( val Ġnon Null Type : ĠObj C NonNull Reference Type ) Ġ: ĠObj C Reference Type () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġrender ( attrs And Name : ĠString ) Ġ= Ġnon Null Type . render (" Ġ_ Nullable ". with Attrs And Name ( attrs And Name )) Ċ } Ċ Ċ private Ġclass ĠObj C ClassType ( ĊĠĠĠĠĠĠĠ Ġval ĠclassName : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġtype Arguments : ĠList < Obj C NonNull Reference Type > Ġ= Ġempty List () Ċ ) Ġ: ĠObj C NonNull Reference Type () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġrender ( attrs And Name : ĠString ) Ġ= Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠ Ġappend ( className ) ĊĠĠĠĠĠĠĠ Ġif Ġ( type Arguments . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ("< ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Arguments . join To ( this ) Ġ{ Ġit . render () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ("> ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġappend (" Ġ* ") ĊĠĠĠĠĠĠĠ Ġappend ( attrs And Name ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠObj C Protocol Type ( val Ġprotocol Name : ĠString ) Ġ: ĠObj C NonNull Reference Type () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġrender ( attrs And Name : ĠString ) Ġ= Ġ" id <$ protocol Name >". with Attrs And Name ( attrs And Name ) Ċ } Ċ Ċ private Ġobject ĠObj C IdType Ġ: ĠObj C NonNull Reference Type () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġrender ( attrs And Name : ĠString ) Ġ= Ġ" id ". with Attrs And Name ( attrs And Name ) Ċ } Ċ Ċ private Ġobject ĠObj C Instance Type Ġ: ĠObj C NonNull Reference Type () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġrender ( attrs And Name : ĠString ): ĠString Ġ= Ġ" instancetype ". with Attrs And Name ( attrs And Name ) Ċ } Ċ Ċ private Ġclass ĠObj C Block Pointer Type ( ĊĠĠĠĠĠĠĠ Ġval ĠreturnType : ĠObj C Reference Type , Ġval Ġparameter Types : ĠList < Obj C Reference Type > Ċ ) Ġ: ĠObj C NonNull Reference Type () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġrender ( attrs And Name : ĠString ) Ġ= ĠreturnType . render ( build String Ġ{ ĊĠĠĠĠĠĠĠ Ġappend ("( ^ ") ĊĠĠĠĠĠĠĠ Ġappend ( attrs And Name ) ĊĠĠĠĠĠĠĠ Ġappend (" )(" ) ĊĠĠĠĠĠĠĠ Ġif Ġ( parameter Types . isEmpty ()) Ġappend (" void ") ĊĠĠĠĠĠĠĠ Ġparameter Types . join To ( this ) Ġ{ Ġit . render () Ġ} ĊĠĠĠĠĠĠĠ Ġappend (' )') ĊĠĠĠ Ġ}) Ċ } Ċ Ċ private Ġclass ĠObj CP ri mitive Type ( val Ġc Name : ĠString ) Ġ: ĠObj C Type () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġrender ( attrs And Name : ĠString ) Ġ= Ġc Name . with Attrs And Name ( attrs And Name ) Ċ } Ċ Ċ private Ġclass ĠObj CP o inter Type ( val Ġpoint ee : ĠObj C Type , Ġval Ġnullable : ĠBoolean Ġ= Ġfalse ) Ġ: ĠObj C Type () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġrender ( attrs And Name : ĠString ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpoint ee . render ("* ${ if Ġ( nullable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġ_ Nullable ". with Attrs And Name ( attrs And Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattrs And Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}} ") Ċ } Ċ Ċ private Ġobject ĠObj CV oid Type Ġ: ĠObj C Type () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġrender ( attrs And Name : ĠString ) Ġ= Ġ" void ". with Attrs And Name ( attrs And Name ) Ċ } Ċ Ċ internal Ġinterface ĠCustom Type Mapper Ġ{ ĊĠĠĠ Ġval Ġmapped Class Descriptor : ĠClass Descriptor ĊĠĠĠ Ġfun Ġmap Type ( mapped Super Type : ĠKotlin Type ): ĠObj C NonNull Reference Type ĊĊĠĠĠ Ġclass ĠSimple ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġmapped Class Descriptor : ĠClass Descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġobj C ClassName : ĠString ĊĠĠĠ Ġ) Ġ: ĠCustom Type Mapper Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmap Type ( mapped Super Type : ĠKotlin Type ): ĠObj C NonNull Reference Type Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObj C ClassType ( obj C ClassName ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠCollection ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġgenerator : ĠObj C Export Header Generator , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġmapped Class Descriptor : ĠClass Descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġobj C ClassName : ĠString ĊĠĠĠ Ġ) Ġ: ĠCustom Type Mapper Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmap Type ( mapped Super Type : ĠKotlin Type ): ĠObj C NonNull Reference Type Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Arguments Ġ= Ġmapped Super Type . arguments . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargument Ġ= Ġit . type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Type Utils . is Nullable Type ( argument )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠKotlin Ġ` null ` Ġkeys Ġand Ġvalues Ġare Ġrepresented Ġas Ġ` NS Null ` Ġsingleton . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObj C IdType ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerator . map Reference Type Ign oring Null ability ( argument ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠObj C ClassType ( obj C ClassName , Ġtype Arguments ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠFunction ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġgenerator : ĠObj C Export Header Generator , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Count : ĠInt ĊĠĠĠ Ġ) Ġ: ĠCustom Type Mapper Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġmapped Class Descriptor Ġ= Ġgenerator . context . built Ins . get Function ( parameter Count ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmap Type ( mapped Super Type : ĠKotlin Type ): ĠObj C NonNull Reference Type Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunction Type Ġ= Ġmapped Super Type ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠreturnType Ġ= Ġfunction Type . get ReturnType From FunctionType () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameter Types Ġ= ĠlistOf NotNull ( function Type . get Receiver Type From FunctionType ()) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Type . getValue Parameter Types From FunctionType (). map Ġ{ Ġit . type Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠObj C Block Pointer Type ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerator . map Reference Type ( returnType ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Types . map Ġ{ Ġgenerator . map Reference Type ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠObj C Export Header Generator . map Reference Type ( kotlin Type : ĠKotlin Type ): ĠObj C Reference Type Ġ= ĊĠĠĠĠĠĠĠ Ġmap Reference Type Ign oring Null ability ( kotlin Type ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Type Utils . is Nullable Type ( kotlin Type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObj C Nullable Reference Type ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ Ċ private Ġfun ĠObj C Export Header Generator . map Reference Type Ign oring Null ability ( ĊĠĠĠĠĠĠĠ Ġkotlin Type : ĠKotlin Type Ċ ): ĠObj C NonNull Reference Type Ġ{ ĊĠĠĠ Ġval Ġtype To Mapper Ġ= Ġ( listOf ( kotlin Type ) Ġ+ Ġkotlin Type . sup ert ypes ()). map NotNull Ġ{ Ġtype Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġmapper Ġ= Ġcustom TypeMap pers [ type . constructor . declaration Descriptor ] ĊĠĠĠĠĠĠĠ Ġif Ġ( mapper Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġto Ġmapper ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. toMap () ĊĊĠĠĠ Ġval Ġmost Specific Type To Mapper Ġ= Ġtype To Mapper . filter Ġ{ Ġ(_, Ġmapper ) Ġ-> ĊĠĠĠĠĠĠĠ Ġtype To Mapper . values . all Ġ{ Ġit . mapped Class Descriptor Ġ== Ġmapper . mapped Class Descriptor Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! it . mapped Class Descriptor . is Subclass Of ( mapper . mapped Class Descriptor ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠE . g . Ġif Ġboth ĠList Ġand ĠMutable List Ġare Ġpresent , Ġthen Ġretain Ġonly ĠMutable List . ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( most Specific Type To Mapper . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtypes Ġ= Ġmost Specific Type To Mapper . keys . toList () ĊĠĠĠĠĠĠĠ Ġval Ġfirst Type Ġ= Ġtypes [ 0 ] ĊĠĠĠĠĠĠĠ Ġval Ġsecond Type Ġ= Ġtypes [ 1 ] ĊĊĠĠĠĠĠĠĠ Ġcontext . report Compilation Warning ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ex posed Ġtype Ġ'$ kotlin Type ' Ġis Ġ'$ first Type ' Ġand Ġ'$ second Type ' Ġat Ġthe Ġsame Ġtime . Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" This Ġmost Ġlikely Ġwouldn 't Ġwork Ġas Ġexpected .") ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġthe Ġsame Ġwarning Ġfor Ġsuch Ġclasses . ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġmost Specific Type To Mapper . entries . first OrNull ()?. let Ġ{ Ġ( type , Ġmapper ) Ġ-> ĊĠĠĠĠĠĠĠ Ġreturn Ġmapper . map Type ( type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġclass Descriptor Ġ= Ġkotlin Type . get Erase d Type Class () ĊĊĠĠĠ Ġ// ĠTODO : Ġtranslate Ġ` where ĠT Ġ: ĠBaseClass , ĠT Ġ: ĠSome Interface ` Ġto Ġ` Base Class * Ġ< Some Interface >` ĊĊĠĠĠ Ġif Ġ( class Descriptor Ġ== Ġcontext . built Ins . any Ġ|| Ġclass Descriptor Ġin Ġhidden Types ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠObj C IdType ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( class Descriptor . default Type . is Obj C ObjectType ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmap Obj C Object Reference Type Ign oring Null ability ( class Descriptor ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġschedule Class ToBe Generated ( class Descriptor ) ĊĊĠĠĠ Ġreturn Ġif Ġ( class Descriptor . is Interface ) Ġ{ ĊĠĠĠĠĠĠĠ ĠObj C Protocol Type ( translate ClassName ( class Descriptor )) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠObj C ClassType ( translate ClassName ( class Descriptor )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġtail rec Ġfun ĠObj C Export Header Generator . map Obj C Object Reference Type Ign oring Null ability ( ĊĠĠĠĠĠĠĠ Ġdescriptor : ĠClass Descriptor Ċ ): ĠObj C NonNull Reference Type Ġ{ ĊĠĠĠ Ġ// ĠTODO : Ġmore Ġprecise Ġtypes Ġcan Ġbe Ġused . ĊĊĠĠĠ Ġif Ġ( descriptor . is Obj CM eta Class ()) Ġreturn ĠObj C IdType ĊĊĠĠĠ Ġif Ġ( descriptor . is External Obj C Class ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( descriptor . is Interface ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġdescriptor . name . asString (). remove Suffix (" Protocol ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprotocol Forward Declarations Ġ+= Ġname ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObj C Protocol Type ( name ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġdescriptor . name . asString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Forward Declarations Ġ+= Ġname ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObj C ClassType ( name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( descriptor . is Kotlin Obj C Class ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmap Obj C Object Reference Type Ign oring Null ability ( descriptor . get Super Class Or Any ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠObj C IdType Ċ } Ċ Ċ private Ġfun ĠObj C Export Header Generator . schedule Class ToBe Generated ( class Descriptor : ĠClass Descriptor ) Ġ{ ĊĠĠĠ Ġif Ġ( class Descriptor Ġ! in Ġgenerated Classes ) Ġ{ ĊĠĠĠĠĠĠĠ Ġextra Classes To Translate Ġ+= Ġclass Descriptor ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠObj C Export Header Generator . map Type ( ĊĠĠĠĠĠĠĠ Ġkotlin Type : ĠKotlin Type , ĊĠĠĠĠĠĠĠ Ġtype Bridge : ĠType Bridge Ċ ): ĠObj C Type Ġ= Ġwhen Ġ( type Bridge ) Ġ{ ĊĠĠĠ ĠReference Bridge Ġ-> Ġmap Reference Type ( kotlin Type ) ĊĠĠĠ Ġis ĠValueType Bridge Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġc Name Ġ= Ġwhen Ġ( type Bridge . obj C ValueType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObj C ValueType . BOOL Ġ-> Ġ" BOOL " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObj C ValueType . CHAR Ġ-> Ġ" int 8 _ t " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObj C ValueType . UNSIGNED _ SHORT Ġ-> Ġ" un ich ar " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObj C ValueType . SHORT Ġ-> Ġ" int 1 6 _ t " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObj C ValueType . INT Ġ-> Ġ" int 3 2 _ t " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObj C ValueType . LONG _ LONG Ġ-> Ġ" int 6 4 _ t " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObj C ValueType . FLOAT Ġ-> Ġ" float " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObj C ValueType . DOUBLE Ġ-> Ġ" double " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġconsider Ġother Ġnam ings . ĊĠĠĠĠĠĠĠ ĠObj CP ri mitive Type ( c Name ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġdata Ġclass ĠStub ( val Ġlines : ĠList < String >) Ċ Ċ private Ġclass ĠStub Builder Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlines Ġ= Ġmutable ListOf < String >() ĊĊĠĠĠ Ġoperator Ġfun ĠString . unary Plus () Ġ{ ĊĠĠĠĠĠĠĠ Ġlines . add ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun ĠStub . unary Plus () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis @ Stub Builder . lines . addAll ( this . lines ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild () Ġ= ĠStub ( lines ) Ċ } Ċ Ċ private Ġinline Ġfun Ġbuild Stub ( block : ĠStub Builder . () Ġ-> ĠUnit ) Ġ= ĠStub Builder (). let Ġ{ ĊĠĠĠ Ġit . block () ĊĠĠĠ Ġit . build () Ċ } Ċ Ċ private Ġinline Ġfun ĠMutable Collection < Stub >. add Built By ( block : ĠStub Builder . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġthis . add ( build Stub ( block )) Ċ } Ċ