/* Ċ Ġ* Ġ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 . native . interop . gen Ċ Ċ import Ġorg . jetbrains . kotlin . native . interop . gen . jvm . Kotlin Platform Ċ import Ġorg . jetbrains . kotlin . utils . addTo Std lib . if NotEmpty Ċ Ċ sealed Ġclass ĠStub Type Ġ{ ĊĠĠĠ Ġabstract Ġval Ġnullable : ĠBoolean ĊĠĠĠ Ġabstract Ġval Ġtype Arguments : ĠList < Type Argument > Ċ } Ċ Ċ /** Ċ Ġ* ĠWrapper Ġover Ġ[ Classifier ]. Ċ Ġ*/ Ċ class ĠClass ifier Stub Type ( ĊĠĠĠĠĠĠĠ Ġval Ġclassifier : ĠClass ifier , ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġtype Arguments : ĠList < Type Argument > Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġnullable : ĠBoolean Ġ= Ġfalse Ċ ) Ġ: ĠStub Type () Ġ{ ĊĊĠĠĠ Ġfun Ġnested ( name : ĠString ): ĠClass ifier Stub Type Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClass ifier Stub Type ( classifier . nested ( name )) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ classifier . top Level Name }${ type Arguments . if NotEmpty Ġ{ Ġjoin ToString ( prefix Ġ= Ġ"< ", Ġpostfix Ġ= Ġ"> ") Ġ} Ġ?: Ġ"" }" Ċ } Ċ Ċ class ĠA bb re vi ated Type ( ĊĠĠĠĠĠĠĠ Ġval Ġunderlying Type : ĠStub Type , ĊĠĠĠĠĠĠĠ Ġval Ġabbre vi ated Classifier : ĠClass ifier , ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġtype Arguments : ĠList < Type Argument >, ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġnullable : ĠBoolean Ġ= Ġfalse Ċ ) Ġ: ĠStub Type () Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ abbre vi ated Classifier . top Level Name }${ type Arguments . if NotEmpty Ġ{ Ġjoin ToString ( prefix Ġ= Ġ"< ", Ġpostfix Ġ= Ġ"> ") Ġ} Ġ?: Ġ"" }" Ċ } Ċ Ċ /** Ċ Ġ* Ġ@ return Ġtype Ġfrom Ġkotlinx . c interop Ġpackage Ċ Ġ*/ Ċ fun ĠKotlin Platform . get Runtime Type ( name : ĠString , Ġnullable : ĠBoolean Ġ= Ġfalse ): ĠStub Type Ġ{ ĊĠĠĠ Ġval Ġclassifier Ġ= ĠClass ifier . top Level ( c interop Package , Ġname ) ĊĠĠĠ ĠPre defined Types Handler . try Expand Platform Dependent Type alias ( classifier , Ġthis , Ġnullable )?. let Ġ{ Ġreturn Ġit Ġ} ĊĠĠĠ Ġreturn ĠClass ifier Stub Type ( classifier , Ġnullable Ġ= Ġnullable ) Ċ } Ċ Ċ /** Ċ Ġ* ĠFunctional Ġtype Ġfrom Ġkotlin Ġpackage : Ġ([ parameter Types ]) Ġ-> Ġ[ returnType ] Ċ Ġ*/ Ċ class ĠFunctional Type ( ĊĠĠĠĠĠ Ġval Ġparameter Types : ĠList < Stub Type >, Ġ// ĠTODO : ĠUse ĠType Arguments . ĊĠĠĠĠĠ Ġval ĠreturnType : ĠStub Type , ĊĠĠĠĠĠ Ġoverride Ġval Ġnullable : ĠBoolean Ġ= Ġfalse Ċ ) Ġ: ĠStub Type () Ġ{ ĊĠĠĠ Ġval Ġclassifier : ĠClass ifier Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClass ifier . top Level (" kotlin ", Ġ" Function ${ parameter Types . size }") ĊĊĠĠĠ Ġoverride Ġval Ġtype Arguments : ĠList < Type Argument > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠlistOf (* parameter Types . to Typed Array (), ĠreturnType ). map Ġ{ ĠType Argument Stub ( it ) Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠType ParameterType ( ĊĠĠĠĠĠĠĠ Ġval Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġnullable : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġval Ġtype Parameter Declaration : ĠType Parameter Stub Ċ ) Ġ: ĠStub Type () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġtype Arguments : ĠList < Type Argument > Ġ= Ġempty List () Ċ } Ċ Ċ fun ĠKotlin Type . to Stub Ir Type (): ĠStub Type Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠ Ġis ĠKotlin FunctionType Ġ-> Ġthis . to Stub Ir Type () ĊĠĠĠ Ġis ĠKotlin Classifier Type Ġ-> Ġthis . to Stub Ir Type () ĊĠĠĠ Ġelse Ġ-> Ġerror (" Unexpected ĠKotlin Type : Ġ$ this ") Ċ } Ċ Ċ private Ġfun ĠKotlin FunctionType . to Stub Ir Type (): ĠStub Type Ġ= ĊĠĠĠĠĠĠĠ ĠFunctional Type ( parameter Types . map ( Kotlin Type :: to Stub Ir Type ), ĠreturnType . to Stub Ir Type (), Ġnullable ) Ċ Ċ private Ġfun ĠKotlin Classifier Type . to Stub Ir Type (): ĠStub Type Ġ{ ĊĠĠĠ Ġval Ġtype Arguments Ġ= Ġarguments . map ( Kotlin Type Argument :: to Stub Ir Type ) ĊĠĠĠ ĠPre defined Types Handler . try Expand Pre defined Type alias ( classifier , Ġnullable , Ġtype Arguments )?. let Ġ{ Ġreturn Ġit Ġ} ĊĠĠĠ Ġreturn Ġif Ġ( underlying Type Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ ĠClass ifier Stub Type ( classifier , Ġtype Arguments , Ġnullable ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠA bb re vi ated Type ( underlying Type . to Stub Ir Type (), Ġclassifier , Ġtype Arguments , Ġnullable ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠKotlin Type Argument . to Stub Ir Type (): ĠType Argument Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠ Ġis ĠKotlin Type Ġ-> ĠType Argument Stub ( this . to Stub Ir Type ()) ĊĠĠĠ ĠStar Projection Ġ-> ĠType Argument . Star Projection ĊĠĠĠ Ġelse Ġ-> Ġerror (" Unexpected ĠKotlin Type Argument : Ġ$ this ") Ċ } Ċ Ċ /** Ċ Ġ* ĠTypes Ġthat Ġcome Ġfrom Ġkotlinx . c interop Ġrequire Ġspecial Ġhandling Ġbecause Ġwe Ċ Ġ* Ġdon 't Ġhave Ġexplicit Ġinformation Ġabout Ġtheir Ġstructure . Ċ Ġ* ĠFor Ġexample , Ġto Ġbe Ġable Ġto Ġproduce Ġmetadata - based Ġinter op Ġlibrary Ġwe Ġneed Ġto Ġknow Ċ Ġ* Ġthat ĠByte Var Ġis Ġa Ġtype alias Ġto ĠByte Var Of < Byte >. Ċ Ġ*/ Ċ private Ġobject ĠPre defined Types Handler Ġ{ ĊĠĠĠ Ġprivate Ġconst Ġval Ġc Interop Package Ġ= Ġ" kotlin x . c interop " ĊĊĠĠĠ Ġprivate Ġval Ġnative Ptr Classifier Ġ= ĠClass ifier . top Level ( c Interop Package , Ġ" Native Ptr ") ĊĊĠĠĠ Ġprivate Ġval Ġprimitives Ġ= Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Types . boolean , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Types . byte , ĠKotlin Types . short , ĠKotlin Types . int , ĠKotlin Types . long , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Types . u Byte , ĠKotlin Types . u Short , ĠKotlin Types . u Int , ĠKotlin Types . u Long , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Types . float , ĠKotlin Types . double , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Types . vector 1 2 8 ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġkotlinx . c interop .{ primitive } Var Ġ-> Ġkotlin .{ primitive } ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġprimitive Var Classifier To Primitive Type : ĠMap < Classifier , ĠKotlin Classifier Type > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprimitives . associate By Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Var Ġ= Ġ"${ it . classifier . top Level Name } Var " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass ifier . top Level ( c Interop Package , Ġtype Var ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġprimitive Type Ġprimitive Ġtype Ġfrom Ġkotlin Ġpackage . ĊĠĠĠĠ Ġ* Ġ@ return Ġkotlinx . c interop .[ primitive Type ] Var Of <[ primitive Type ]> ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Var OfType For ( primitive Type : ĠKotlin Classifier Type , Ġnullable : ĠBoolean ): ĠClass ifier Stub Type Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Var Of Ġ= Ġ"${ primitive Type . classifier . top Level Name } Var Of " ĊĠĠĠĠĠĠĠ Ġval Ġclassifier Ġ= ĠClass ifier . top Level ( c Interop Package , Ġtype Var Of ) ĊĠĠĠĠĠĠĠ Ġreturn ĠClass ifier Stub Type ( classifier , ĠlistOf ( Type Argument Stub ( primitive Type . to Stub Ir Type ())), Ġnullable Ġ= Ġnullable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexpand CO pa que Pointer Var ( nullable : ĠBoolean ): ĠA bb re vi ated Type Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Argument Ġ= ĠType Argument Stub ( expand CO pa que Pointer ( nullable = false )) ĊĠĠĠĠĠĠĠ Ġval Ġunderlying Type Ġ= ĠClass ifier Stub Type ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Types . c Pointer Var Of , ĠlistOf ( type Argument ), Ġnullable Ġ= Ġnullable ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn ĠA bb re vi ated Type ( underlying Type , ĠKotlin Types . c Opaque Pointer Var . classifier , Ġempty List (), Ġnullable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexpand CO pa que Pointer ( nullable : ĠBoolean ): ĠA bb re vi ated Type Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Argument Ġ= ĠType Argument Stub ( Classifier Stub Type ( Kotlin Types . c Point ed ), ĠType Argument . Variance . OUT ) ĊĠĠĠĠĠĠĠ Ġval Ġunderlying Type Ġ= ĠClass ifier Stub Type ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Types . c Pointer , ĠlistOf ( type Argument ), Ġnullable Ġ= Ġnullable ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn ĠA bb re vi ated Type ( underlying Type , ĠKotlin Types . c Opaque Pointer . classifier , Ġempty List (), Ġnullable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexpand CP o inter Var ( type Arguments : ĠList < Type Argument >, Ġnullable : ĠBoolean ): ĠA bb re vi ated Type Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( type Arguments . size Ġ== Ġ 1 ) Ġ{ Ġ" CP o inter Var Ġhas Ġonly Ġone Ġtype Ġargument ." Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġc Pointer Ġ= ĠClass ifier Stub Type ( Kotlin Types . c Pointer , Ġtype Arguments ) ĊĠĠĠĠĠĠĠ Ġval Ġc Pointer Var OfType Argument Ġ= ĠType Argument Stub ( c Pointer ) ĊĠĠĠĠĠĠĠ Ġval Ġunderlying Type Ġ= ĠClass ifier Stub Type ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Types . c Pointer Var Of , ĠlistOf ( c Pointer Var OfType Argument ), Ġnullable Ġ= Ġnullable ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn ĠA bb re vi ated Type ( underlying Type , ĠKotlin Types . c Pointer Var , Ġtype Arguments , Ġnullable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġprimitive Var Type Ġone Ġof Ġkotlinx . c interop .{ primitive } Var Ġtypes . ĊĠĠĠĠ Ġ* Ġ@ return Ġtype alias Ġin Ġterms Ġof ĠStub IR Ġtypes . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġexpand Primitive Var Type ( primitive Var Classifier : ĠClass ifier , Ġnullable : ĠBoolean ): ĠA bb re vi ated Type Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprimitive Type Ġ= Ġprimitive Var Classifier To Primitive Type . getValue ( primitive Var Classifier ) ĊĠĠĠĠĠĠĠ Ġval Ġunderlying Type Ġ= Ġget Var OfType For ( primitive Type , Ġnullable ) ĊĠĠĠĠĠĠĠ Ġreturn ĠA bb re vi ated Type ( underlying Type , Ġprimitive Var Classifier , ĠlistOf (), Ġnullable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexpand Native Ptr ( platform : ĠKotlin Platform , Ġnullable : ĠBoolean ): ĠStub Type Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġunderlying Type Classifier Ġ= Ġwhen Ġ( platform ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Platform . JVM Ġ-> ĠKotlin Types . long . classifier ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Platform . NATIVE Ġ-> ĠClass ifier . top Level (" kotlin . native . internal ", Ġ" Native Ptr ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġunderlying Type Ġ= ĠClass ifier Stub Type ( underlying Type Classifier , Ġnullable Ġ= Ġnullable ) ĊĠĠĠĠĠĠĠ Ġreturn ĠA bb re vi ated Type ( underlying Type , Ġnative Ptr Classifier , ĠlistOf (), Ġnullable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexpand Obj C ObjectMeta ( type Arguments : ĠList < Type Argument >, Ġnullable : ĠBoolean ): ĠA bb re vi ated Type Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( type Arguments . isEmpty ()) ĊĠĠĠĠĠĠĠ Ġval Ġobj C Class Ġ= ĠClass ifier Stub Type ( Kotlin Types . obj C Class , Ġempty List (), Ġnullable ) ĊĠĠĠĠĠĠĠ Ġreturn ĠA bb re vi ated Type ( obj C Class , ĠKotlin Types . obj C ObjectMeta , Ġempty List (), Ġnullable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexpand C Array Pointer ( type Arguments : ĠList < Type Argument >, Ġnullable : ĠBoolean ): ĠA bb re vi ated Type Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġc Pointer Ġ= ĠClass ifier Stub Type ( Kotlin Types . c Pointer , Ġtype Arguments ) ĊĠĠĠĠĠĠĠ Ġreturn ĠA bb re vi ated Type ( c Pointer , ĠKotlin Types . c Array Pointer , Ġtype Arguments , Ġnullable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġ[ Classifier Stub Type ] Ġif Ġ[ classifier ] Ġis Ġa Ġtype alias Ġfrom Ġ[ kotlin x . c interop ] Ġpackage . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġtry Expand Pre defined Type alias ( classifier : ĠClass ifier , Ġnullable : ĠBoolean , Ġtype Arguments : ĠList < Type Argument >): ĠA bb re vi ated Type ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( classifier ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġprimitive Var Classifier To Primitive Type . keys Ġ-> Ġexpand Primitive Var Type ( classifier , Ġnullable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Types . c Opaque Pointer . classifier Ġ-> Ġexpand CO pa que Pointer ( nullable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Types . c Opaque Pointer Var . classifier Ġ-> Ġexpand CO pa que Pointer Var ( nullable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Types . c Pointer Var Ġ-> Ġexpand CP o inter Var ( type Arguments , Ġnullable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Types . obj C ObjectMeta Ġ-> Ġexpand Obj C ObjectMeta ( type Arguments , Ġnullable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Types . c Array Pointer Ġ-> Ġexpand C Array Pointer ( type Arguments , Ġnullable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠVariant Ġof Ġ[ try Expand Pre defined Type alias ] Ġwith Ġ[ platform ]- dependent Ġresult . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġtry Expand Platform Dependent Type alias ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclassifier : ĠClass ifier , Ġplatform : ĠKotlin Platform , Ġnullable : ĠBoolean ĊĠĠĠ Ġ): ĠStub Type ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( classifier ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnative Ptr Classifier Ġ-> Ġexpand Native Ptr ( platform , Ġnullable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ }