/* Ċ Ġ* Ġ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 Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . backend . kon an . objc export Ċ Ċ import Ġorg . jetbrains . kotlin . backend . kon an . descriptors . contribut ed Methods Ċ import Ġorg . jetbrains . kotlin . backend . kon an . descriptors . enum Entries Ċ import Ġorg . jetbrains . kotlin . backend . kon an . descriptors . isArray Ċ import Ġorg . jetbrains . kotlin . backend . kon an . descriptors . is Interface Ċ import Ġorg . jetbrains . kotlin . builtins . Kotlin Built Ins Ċ import Ġorg . jetbrains . kotlin . descriptors .* Ċ import Ġorg . jetbrains . kotlin . ir . symbols .* Ċ import Ġorg . jetbrains . kotlin . ir . util . Symbol Table Ċ import Ġorg . jetbrains . kotlin . resolve . descriptor Util . get Super Class Not Any Ċ Ċ internal Ġfun ĠObj C Exported Interface . create Code Spec ( symbol Table : ĠSymbol Table ): ĠObj C Export Code Spec Ġ{ ĊĊĠĠĠ Ġfun Ġcreate Obj C Methods ( methods : ĠList < Function Descriptor >) Ġ= Ġmethods . map Ġ{ ĊĠĠĠĠĠĠĠ ĠObj C Method For Kotlin Method ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Obj C Method Spec Base Method ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmapper , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn amer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol Table . reference Simple Function ( it ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠList < Callable Member Descriptor >. to Obj C Methods () Ġ= Ġcreate Obj C Methods ( this . flatMap Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠProperty Descriptor Ġ-> ĠlistOf NotNull ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . getter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . setter ?. take If ( mapper :: shouldBe Ex posed ) Ġ// ĠSimilar Ġto Ġ[ Obj C Export Translator Impl . build Property ]. ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFunction Descriptor Ġ-> ĠlistOf ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) ĊĊĠĠĠ Ġval Ġfiles Ġ= Ġtop Level . map Ġ{ Ġ( source File , Ġdeclarations ) Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġbinary Name Ġ= Ġn amer . getFile ClassName ( source File ). binary Name ĊĠĠĠĠĠĠĠ Ġval Ġmethods Ġ= Ġdeclarations . to Obj C Methods () ĊĠĠĠĠĠĠĠ ĠObj C Class For Kotlin File ( binary Name , Ġmethods ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġclass To Type Ġ= Ġmutable Map Of < Class Descriptor , ĠObj C Type For Kotlin Type >() ĊĠĠĠ Ġfun ĠgetType ( descriptor : ĠClass Descriptor ): ĠObj C Type For Kotlin Type Ġ= Ġclass To Type . get Or Put ( descriptor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmethods Ġ= Ġmutable ListOf < Obj C Method Spec >() ĊĊĠĠĠĠĠĠĠ Ġ// ĠNote : Ġcontributed Methods Ġincludes Ġfake Ġoverrides Ġtoo . ĊĠĠĠĠĠĠĠ Ġval Ġall Base Methods Ġ= Ġdescriptor . contribut ed Methods . filter Ġ{ Ġmapper . shouldBe Ex posed ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġmapper . getBase Methods ( it ) Ġ}. distinct () ĊĊĠĠĠĠĠĠĠ Ġmethods Ġ+= Ġcreate Obj C Methods ( all Base Methods ) ĊĊĠĠĠĠĠĠĠ Ġval Ġbinary Name Ġ= Ġn amer . getClass Or Protocol Name ( descriptor ). binary Name ĊĠĠĠĠĠĠĠ Ġval Ġir Class Symbol Ġ= Ġsymbol Table . reference Class ( descriptor ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( descriptor . is Interface ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObj C Protocol For Kotlin Interface ( binary Name , Ġir Class Symbol , Ġmethods ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . construct ors . filter Ġ{ Ġmapper . shouldBe Ex posed ( it ) Ġ}. map To ( methods ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġir Constructor Symbol Ġ= Ġsymbol Table . reference Constructor ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase Method Ġ= Ġcreate Obj C Method Spec Base Method ( mapper , Ġn amer , Ġir Constructor Symbol , Ġit ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( descriptor . isArray ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObj C Factory Method For Kotlin Array Constructor ( base Method ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObj C Init Method For Kotlin Constructor ( base Method ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( descriptor . kind Ġ== ĠClass Kind . OBJECT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethods Ġ+= ĠObj C Getter For Object Instance ( nam er . getObject Instance Selector ( descriptor )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( descriptor . kind Ġ== ĠClass Kind . ENUM _ CLASS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . enum Entries . map To ( methods ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObj C Getter For Kotlin Enum Entry ( symbol Table . reference Enum Entry ( it ), Ġn amer . get Enum Entry Selector ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . get Enum Values Function Descriptor ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethods Ġ+= ĠObj C Class Method For Kotlin Enum Values ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol Table . reference Simple Function ( it ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn amer . get Enum Values Selector ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Kotlin Built Ins . is Throwable ( descriptor )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethods Ġ+= ĠObj CK otlin Throwable As Error Method ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcategory Methods Ġ= Ġcategory Members [ descriptor ]. or Empty (). to Obj C Methods () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠsuperClass Not Any Ġ= Ġdescriptor . get Super Class Not Any () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĠgetType ( it ) Ġas ĠObj C Class For Kotlin Class Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠObj C Class For Kotlin Class ( binary Name , Ġir Class Symbol , Ġmethods , Ġcategory Methods , ĠsuperClass Not Any ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġtypes Ġ= Ġgenerated Classes . map Ġ{ ĠgetType ( it ) Ġ} ĊĊĠĠĠ Ġreturn ĠObj C Export Code Spec ( files , Ġtypes ) Ċ } Ċ Ċ internal Ġfun Ġ< S Ġ: ĠIr Function Symbol > Ġcreate Obj C Method Spec Base Method ( ĊĠĠĠĠĠĠĠ Ġmapper : ĠObj C Export Mapper , ĊĠĠĠĠĠĠĠ Ġn amer : ĠObj C Export N amer , ĊĠĠĠĠĠĠĠ Ġsymbol : ĠS , ĊĠĠĠĠĠĠĠ Ġdescriptor : ĠFunction Descriptor Ċ ): ĠObj C Method Spec . Base Method < S > Ġ{ ĊĠĠĠ Ġrequire ( mapper . is Base Method ( descriptor )) ĊĊĠĠĠ Ġval Ġselector Ġ= Ġn amer . get Selector ( descriptor ) ĊĠĠĠ Ġval Ġbridge Ġ= Ġmapper . bridge Method ( descriptor ) ĊĊĠĠĠ Ġreturn ĠObj C Method Spec . Base Method ( symbol , Ġbridge , Ġselector ) Ċ } Ċ Ċ internal Ġclass ĠObj C Export Code Spec ( ĊĠĠĠĠĠĠĠ Ġval Ġfiles : ĠList < Obj C Class For Kotlin File >, ĊĠĠĠĠĠĠĠ Ġval Ġtypes : ĠList < Obj C Type For Kotlin Type > Ċ ) Ċ Ċ internal Ġsealed Ġclass ĠObj C Method Spec Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAg greg ates Ġbase Ġmethod Ġ( as Ġdefined Ġby Ġ[ Obj C Export Mapper . is Base Method ]) ĊĠĠĠĠ Ġ* Ġand Ġdetails Ġrequired Ġto Ġgenerate Ġcode Ġfor Ġb rid ges Ġbetween ĠKotlin Ġand ĠObj - C Ġmethods . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠBase Method < out ĠS Ġ: ĠIr Function Symbol >( val Ġsymbol : ĠS , Ġval Ġbridge : ĠMethod Bridge , Ġval Ġselector : ĠString ) Ċ } Ċ Ċ internal Ġclass ĠObj C Method For Kotlin Method ( val Ġbase Method : ĠBase Method < Ir Simple Function Symbol >) Ġ: ĠObj C Method Spec () Ċ Ċ internal Ġclass ĠObj C Init Method For Kotlin Constructor ( val Ġbase Method : ĠBase Method < Ir Constructor Symbol >) Ġ: ĠObj C Method Spec () Ċ Ċ internal Ġclass ĠObj C Factory Method For Kotlin Array Constructor ( ĊĠĠĠĠĠĠĠ Ġval Ġbase Method : ĠBase Method < Ir Constructor Symbol > Ċ ) Ġ: ĠObj C Method Spec () Ċ Ċ internal Ġclass ĠObj C Getter For Kotlin Enum Entry ( ĊĠĠĠĠĠĠĠ Ġval Ġir Enum Entry Symbol : ĠIr Enum Entry Symbol , ĊĠĠĠĠĠĠĠ Ġval Ġselector : ĠString Ċ ) Ġ: ĠObj C Method Spec () Ċ Ċ internal Ġclass ĠObj C Class Method For Kotlin Enum Values ( ĊĠĠĠĠĠĠĠ Ġval Ġvalues Function Symbol : ĠIr Function Symbol , ĊĠĠĠĠĠĠĠ Ġval Ġselector : ĠString Ċ ) Ġ: ĠObj C Method Spec () Ċ Ċ internal Ġclass ĠObj C Getter For Object Instance ( val Ġselector : ĠString ) Ġ: ĠObj C Method Spec () Ċ Ċ internal Ġobject ĠObj CK otlin Throwable As Error Method Ġ: ĠObj C Method Spec () Ċ Ċ internal Ġsealed Ġclass ĠObj C Type Spec ( val Ġbinary Name : ĠString ) Ċ Ċ internal Ġsealed Ġclass ĠObj C Type For Kotlin Type ( ĊĠĠĠĠĠĠĠ Ġbinary Name : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġir Class Symbol : ĠIr Class Symbol , ĊĠĠĠĠĠĠĠ Ġval Ġmethods : ĠList < Obj C Method Spec > Ċ ) Ġ: ĠObj C Type Spec ( binary Name ) Ċ Ċ internal Ġclass ĠObj C Class For Kotlin Class ( ĊĠĠĠĠĠĠĠ Ġbinary Name : ĠString , ĊĠĠĠĠĠĠĠ Ġir Class Symbol : ĠIr Class Symbol , ĊĠĠĠĠĠĠĠ Ġmethods : ĠList < Obj C Method Spec >, ĊĠĠĠĠĠĠĠ Ġval Ġcategory Methods : ĠList < Obj C Method For Kotlin Method >, ĊĠĠĠĠĠĠĠ Ġval ĠsuperClass Not Any : ĠObj C Class For Kotlin Class ? Ċ ) Ġ: ĠObj C Type For Kotlin Type ( binary Name , Ġir Class Symbol , Ġmethods ) Ċ Ċ internal Ġclass ĠObj C Protocol For Kotlin Interface ( ĊĠĠĠĠĠĠĠ Ġbinary Name : ĠString , ĊĠĠĠĠĠĠĠ Ġir Class Symbol : ĠIr Class Symbol , ĊĠĠĠĠĠĠĠ Ġmethods : ĠList < Obj C Method Spec > Ċ ) Ġ: ĠObj C Type For Kotlin Type ( binary Name , Ġir Class Symbol , Ġmethods ) Ċ Ċ internal Ġclass ĠObj C Class For Kotlin File ( ĊĠĠĠĠĠĠĠ Ġbinary Name : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġmethods : ĠList < Obj C Method For Kotlin Method > Ċ ) Ġ: ĠObj C Type Spec ( binary Name )