/* Ċ Ġ* Ġ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 . Generation Mode Ċ import Ġorg . jetbrains . kotlin . native . interop . gen . jvm . Kotlin Platform Ċ import Ġorg . jetbrains . kotlin . native . interop . indexer .* Ċ Ċ internal Ġclass ĠMacro Constant Stub Builder ( ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġcontext : ĠStub s Building Context , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġconstant : ĠConstant Def Ċ ) Ġ: ĠStub Element Builder Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġbuild (): ĠList < Stub Ir Element > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkotlin Name Ġ= Ġconstant . name ĊĠĠĠĠĠĠĠ Ġval Ġorigin Ġ= ĠStub Origin . Constant ( constant ) ĊĠĠĠĠĠĠĠ Ġval Ġdeclaration Ġ= Ġwhen Ġ( constant ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInteger Constant Def Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġliteral Ġ= Ġcontext . try Create Integral Stub ( constant . type , Ġconstant . value ) Ġ?: Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkotlin Type Ġ= Ġcontext . mirror ( constant . type ). arg Type . to Stub Ir Type () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( context . platform ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Platform . NATIVE Ġ-> ĠProperty Stub ( kotlin Name , Ġkotlin Type , ĠProperty Stub . Kind . Constant ( literal ), Ġorigin Ġ= Ġorigin ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNo Ġreason Ġto Ġmake Ġit Ġconst Ġval Ġwith Ġbacking Ġfield Ġon ĠKotlin / JVM Ġyet : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Platform . JVM Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgetter Ġ= ĠProperty Accessor . Getter . Simple Getter ( constant Ġ= Ġliteral ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Stub ( kotlin Name , Ġkotlin Type , ĠProperty Stub . Kind . Val ( getter ), Ġorigin Ġ= Ġorigin ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFloating Constant Def Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġliteral Ġ= Ġcontext . try Create Double Stub ( constant . type , Ġconstant . value ) Ġ?: Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkind Ġ= Ġwhen Ġ( context . generation Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGeneration Mode . SOURCE _ CODE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Stub . Kind . Val ( Property Accessor . Getter . Simple Getter ( constant Ġ= Ġliteral )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGeneration Mode . METADATA Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Stub . Kind . Constant ( literal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkotlin Type Ġ= Ġcontext . mirror ( constant . type ). arg Type . to Stub Ir Type () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Stub ( kotlin Name , Ġkotlin Type , Ġkind , Ġorigin Ġ= Ġorigin ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠString Constant Def Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġliteral Ġ= ĠString Constant Stub ( constant . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkind Ġ= Ġwhen Ġ( context . generation Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGeneration Mode . SOURCE _ CODE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Stub . Kind . Val ( Property Accessor . Getter . Simple Getter ( constant Ġ= Ġliteral )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGeneration Mode . METADATA Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Stub . Kind . Constant ( literal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Stub ( kotlin Name , ĠKotlin Types . string . to Stub Ir Type (), Ġkind , Ġorigin Ġ= Ġorigin ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( declaration ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠStruct Stub Builder ( ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġcontext : ĠStub s Building Context , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdecl : ĠStruct Decl Ċ ) Ġ: ĠStub Element Builder Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġbuild (): ĠList < Stub Ir Element > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġplatform Ġ= Ġcontext . platform ĊĠĠĠĠĠĠĠ Ġval Ġdef Ġ= Ġdecl . def Ġ?: Ġreturn Ġgenerate Forward Struct ( decl ) ĊĊĠĠĠĠĠĠĠ Ġval Ġstruct Annotation : ĠAnnotation Stub ? Ġ= Ġif Ġ( platform Ġ== ĠKotlin Platform . JVM ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( def . kind Ġ== ĠStruct Def . Kind . STRUCT Ġ&& Ġdef . fields Have Default Alignment ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAnnotation Stub . CN atural Struct ( def . members ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Render Struct Or Union ( def )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAnnotation Stub . C Struct ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġclassifier Ġ= Ġcontext . get Kotlin Class For Point ed ( decl ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfields : ĠList < Property Stub ?> Ġ= Ġdef . fields . map Ġ{ Ġfield Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( field . name . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( field . offset Ġ% Ġ 8 Ġ== Ġ 0 L ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġfield . offset Ġ/ Ġ 8 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield Ref Type Ġ= Ġcontext . mirror ( field . type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġun wrapped FieldType Ġ= Ġfield . type . unwrap Type defs () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorigin Ġ= ĠStub Origin . Struct Member ( field ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfieldName Ġ= Ġm angle Simple ( field . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( un wrapped FieldType Ġis ĠArray Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġ( field Ref Type Ġas ĠType Mirror . By Value ). valueType ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġannotations Ġ= Ġif Ġ( platform Ġ== ĠKotlin Platform . JVM ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġget Array Length ( un wrapped FieldType ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġ@ CL ength Ġshould Ġprobably Ġbe Ġused Ġon Ġtypes Ġinstead Ġof Ġproperties . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Annotation Stub . CL ength ( length )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgetter Ġ= Ġwhen Ġ( context . generation Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGeneration Mode . SOURCE _ CODE Ġ-> ĠProperty Accessor . Getter . Array Member At ( offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGeneration Mode . METADATA Ġ-> ĠProperty Accessor . Getter . External Getter ( listOf ( Annotation Stub . C Struct . Array Member At ( offset ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkind Ġ= ĠProperty Stub . Kind . Val ( getter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠShould Ġreceiver Ġbe Ġadded ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Stub ( fieldName , Ġtype . to Stub Ir Type (), Ġkind , Ġannotations Ġ= Ġannotations , Ġorigin Ġ= Ġorigin ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpointed Type Ġ= Ġfield Ref Type . point ed Type . to Stub Ir Type () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpointed Type Argument Ġ= ĠType Argument Stub ( point ed Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ref Type Ġis ĠType Mirror . By Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgetter : ĠProperty Accessor . Getter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsetter : ĠProperty Accessor . Setter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( context . generation Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGeneration Mode . SOURCE _ CODE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgetter Ġ= ĠProperty Accessor . Getter . Member At ( offset , Ġtype Arguments Ġ= ĠlistOf ( point ed Type Argument ), Ġhas Value Accessor Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsetter Ġ= ĠProperty Accessor . Setter . Member At ( offset , Ġtype Arguments Ġ= ĠlistOf ( point ed Type Argument )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGeneration Mode . METADATA Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgetter Ġ= ĠProperty Accessor . Getter . External Getter ( listOf ( Annotation Stub . C Struct . Member At ( offset ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsetter Ġ= ĠProperty Accessor . Setter . External Setter ( listOf ( Annotation Stub . C Struct . Member At ( offset ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkind Ġ= ĠProperty Stub . Kind . Var ( getter , Ġsetter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Stub ( fieldName , Ġfield Ref Type . arg Type . to Stub Ir Type (), Ġkind , Ġorigin Ġ= Ġorigin ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaccessor Ġ= Ġwhen Ġ( context . generation Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGeneration Mode . SOURCE _ CODE Ġ-> ĠProperty Accessor . Getter . Member At ( offset , Ġhas Value Accessor Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGeneration Mode . METADATA Ġ-> ĠProperty Accessor . Getter . External Getter ( listOf ( Annotation Stub . C Struct . Member At ( offset ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkind Ġ= ĠProperty Stub . Kind . Val ( accessor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Stub ( fieldName , Ġpointed Type , Ġkind , Ġorigin Ġ= Ġorigin ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġbit Fields : ĠList < Property Stub > Ġ= Ġdef . bit Fields . map Ġ{ Ġfield Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Mirror Ġ= Ġcontext . mirror ( field . type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Info Ġ= Ġtype Mirror . info ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkotlin Type Ġ= Ġtype Mirror . arg Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsigned Ġ= Ġfield . type . is Integer Type Signed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfieldName Ġ= Ġm angle Simple ( field . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkind Ġ= Ġwhen Ġ( context . generation Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGeneration Mode . SOURCE _ CODE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġread Bits Ġ= ĠProperty Accessor . Getter . Read Bits ( field . offset , Ġfield . size , Ġsigned ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwrite Bits Ġ= ĠProperty Accessor . Setter . Write Bits ( field . offset , Ġfield . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . bridge Components Builder . getter To Bridge Info [ read Bits ] Ġ= ĠBridge Generation Info ("", Ġtype Info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . bridge Components Builder . setter To Bridge Info [ write Bits ] Ġ= ĠBridge Generation Info ("", Ġtype Info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Stub . Kind . Var ( read Bits , Ġwrite Bits ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGeneration Mode . METADATA Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġread Bits Ġ= ĠProperty Accessor . Getter . External Getter ( listOf ( Annotation Stub . C Struct . Bit Field ( field . offset , Ġfield . size ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwrite Bits Ġ= ĠProperty Accessor . Setter . External Setter ( listOf ( Annotation Stub . C Struct . Bit Field ( field . offset , Ġfield . size ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Stub . Kind . Var ( read Bits , Ġwrite Bits ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Stub ( fieldName , Ġkotlin Type . to Stub Ir Type (), Ġkind , Ġorigin Ġ= ĠStub Origin . Struct Member ( field )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠsuperClass Ġ= Ġcontext . platform . get Runtime Type (" C Struct Var ") ĊĠĠĠĠĠĠĠ Ġrequire ( super Class Ġis ĠClass ifier Stub Type ) ĊĠĠĠĠĠĠĠ Ġval Ġraw Ptr Constructor Param Ġ= ĠFunction Parameter Stub (" raw Ptr ", Ġcontext . platform . get Runtime Type (" Native Ptr ")) ĊĠĠĠĠĠĠĠ Ġval Ġorigin Ġ= ĠStub Origin . Struct ( decl ) ĊĠĠĠĠĠĠĠ Ġval Ġprimary Constructor Ġ= ĠConstructor Stub ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Ġ= ĠlistOf ( raw Ptr Constructor Param ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Primary Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotations Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Ġ= Ġorigin ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval ĠsuperClass Init Ġ= ĠSuper Class Init ( super Class , ĠlistOf ( Get Constructor Parameter ( raw Ptr Constructor Param ))) ĊĊĠĠĠĠĠĠĠ Ġval Ġcompanion Super Ġ= ĠsuperClass . nested (" Type ") ĊĠĠĠĠĠĠĠ Ġval Ġtype Size Ġ= ĠlistOf ( Integral Constant Stub ( def . size , Ġ 4 , Ġtrue ), ĠIntegr al Constant Stub ( def . align . to Long (), Ġ 4 , Ġtrue )) ĊĠĠĠĠĠĠĠ Ġval Ġcompanion Super Init Ġ= ĠSuper Class Init ( comp anion Super , Ġtype Size ) ĊĠĠĠĠĠĠĠ Ġval Ġcompanion Classifier Ġ= Ġclassifier . nested (" Companion ") ĊĠĠĠĠĠĠĠ Ġval Ġannotation Ġ= ĠAnnotation Stub . C Struct . Var Type ( def . size , Ġdef . align ). take If Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . generation Mode Ġ== ĠGeneration Mode . METADATA ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcompanion Ġ= ĠClass Stub . Companion ( comp anion Classifier , Ġ ĠsuperClass Init Ġ= Ġcompanion Super Init , Ġannotations Ġ= ĠlistOf NotNull ( annotation )) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( Class Stub . Simple ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclassifier , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Ġ= Ġorigin , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperties Ġ= Ġfields . filter NotNull () Ġ+ Ġif Ġ( platform Ġ== ĠKotlin Platform . NATIVE ) Ġbit Fields Ġelse Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructors Ġ= ĠlistOf ( primary Constructor ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethods Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmod ality Ġ= ĠClass Stub Modal ity . NONE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotations Ġ= ĠlistOf NotNull ( struct Annotation ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsuperClass Init Ġ= ĠsuperClass Init , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompanion Ġ= Ġcompanion ĊĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Array Length ( type : ĠArray Type ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġun wrapped ElementType Ġ= Ġtype . elem Type . unwrap Type defs () ĊĠĠĠĠĠĠĠ Ġval Ġelement Length Ġ= Ġif Ġ( un wrapped ElementType Ġis ĠArray Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Array Length ( un wrapped ElementType ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 L ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġelement Count Ġ= Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠConst ArrayType Ġ-> Ġtype . length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIn complete ArrayType Ġ-> Ġ 0 L ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠTODO ( type . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġelement Length Ġ* Ġelement Count ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġtail rec Ġfun ĠType . is Integer Type Signed (): ĠBoolean Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠInteger Type Ġ-> Ġthis . is Signed ĊĠĠĠĠĠĠĠ Ġis ĠBool Type Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġis ĠEnum Type Ġ-> Ġthis . def . base Type . is Integer Type Signed () ĊĠĠĠĠĠĠĠ Ġis ĠType def Ġ-> Ġthis . def . ali ased . is Integer Type Signed () ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPro duces Ġto Ġ[ out ] Ġthe Ġdefinition Ġof ĠKotlin Ġclass Ġrepresenting Ġthe Ġreference Ġto Ġgiven Ġforward Ġ( in complete ) Ġstruct . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġgenerate Forward Struct ( s : ĠStruct Decl ): ĠList < Stub Ir Element > Ġ= Ġwhen Ġ( context . platform ) Ġ{ ĊĠĠĠĠĠĠĠ ĠKotlin Platform . JVM Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclassifier Ġ= Ġcontext . get Kotlin Class For Point ed ( s ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠsuperClass Ġ= Ġcontext . platform . get Runtime Type (" CO pa que ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġraw Ptr Constructor Param Ġ= ĠFunction Parameter Stub (" raw Ptr ", Ġcontext . platform . get Runtime Type (" Native Ptr ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠsuperClass Init Ġ= ĠSuper Class Init ( super Class , ĠlistOf ( Get Constructor Parameter ( raw Ptr Constructor Param ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorigin Ġ= ĠStub Origin . Struct ( s ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprimary Constructor Ġ= ĠConstructor Stub ( listOf ( raw Ptr Constructor Param ), Ġempty List (), Ġis Primary Ġ= Ġtrue , Ġorigin Ġ= Ġorigin ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Class Stub . Simple ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclassifier , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass Stub Modal ity . NONE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructors Ġ= ĠlistOf ( primary Constructor ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsuperClass Init Ġ= ĠsuperClass Init , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Ġ= Ġorigin )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠKotlin Platform . NATIVE Ġ-> Ġempty List () ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠEnum Stub Builder ( ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġcontext : ĠStub s Building Context , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġenum Def : ĠEnum Def Ċ ) Ġ: ĠStub Element Builder Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġclassifier Ġ= Ġ( context . mirror ( Enum Type ( enum Def )) Ġas ĠType Mirror . By Value ). valueType . classifier ĊĠĠĠ Ġprivate Ġval Ġbase Type Mirror Ġ= Ġcontext . mirror ( enum Def . base Type ) ĊĠĠĠ Ġprivate Ġval Ġbase Type Ġ= Ġbase Type Mirror . arg Type . to Stub Ir Type () ĊĊĠĠĠ Ġoverride Ġfun Ġbuild (): ĠList < Stub Ir Element > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! context . is Strict Enum ( enum Def )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġgenerate Enum As Constants ( enum Def ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġconstructor Parameter Ġ= ĠFunction Parameter Stub (" value ", Ġbase Type ) ĊĠĠĠĠĠĠĠ Ġval Ġvalue Property Ġ= ĠProperty Stub ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" value ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġbase Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkind Ġ= ĠProperty Stub . Kind . Val ( Property Accessor . Getter . Get Constructor Parameter ( constructor Parameter )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmod ality Ġ= ĠMember Stub Modal ity . OPEN , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Ġ= ĠStub Origin . Synt hetic . EnumValue Field ( enum Def ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Override Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcanonical sBy Value Ġ= Ġenum Def . constants ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. grouping By Ġ{ Ġit . value Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. reduce Ġ{ Ġ_, Ġaccumulator , Ġelement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element . is More Canonical Than ( accumulator )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccumulator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġ( canonical Constants , Ġalias Constants ) Ġ= Ġenum Def . constants . partition Ġ{ Ġcanonical sBy Value [ it . value ] Ġ== Ġit Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcanonical Entries With Aliases Ġ= Ġcanonical Constants ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ Ġit . value Ġ} Ġ// ĠTODO : ĠIs Ġit Ġstable Ġenough ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Indexed Ġ{ Ġindex , Ġconstant Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġliteral Ġ= Ġcontext . try Create Integral Stub ( enum Def . base Type , Ġconstant . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġerror (" Cannot Ġcreate Ġenum Ġvalue Ġ${ constant . value } Ġof Ġtype Ġ${ enum Def . base Type }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= ĠEnum Entry Stub ( m angle Simple ( constant . name ), Ġliteral , ĠStub Origin . Enum Entry ( constant ), Ġindex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaliases Ġ= Ġalias Constants ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . value Ġ== Ġconstant . value Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġconstruct Alias Property ( it , Ġentry ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry Ġto Ġaliases ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġorigin Ġ= ĠStub Origin . Enum ( enum Def ) ĊĠĠĠĠĠĠĠ Ġval Ġprimary Constructor Ġ= ĠConstructor Stub ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Ġ= ĠlistOf ( constructor Parameter ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotations Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Primary Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Ġ= Ġorigin , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠVisibility Modifier . PRIVATE ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġby Value Function Ġ= ĠFunction Stub ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" by Value ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Ġ= ĠClass ifier Stub Type ( classifier ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Ġ= ĠlistOf ( Function Parameter Stub (" value ", Ġbase Type )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Ġ= ĠStub Origin . Synt hetic . Enum By Value ( enum Def ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceiver Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmod ality Ġ= ĠMember Stub Modal ity . FINAL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotations Ġ= Ġempty List () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcompanion Ġ= ĠClass Stub . Companion ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclassifier Ġ= Ġclassifier . nested (" Companion "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperties Ġ= Ġcanonical Entries With Aliases . flatMap Ġ{ Ġit . second Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethods Ġ= ĠlistOf ( by Value Function ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġenum Var Class Ġ= Ġconstruct Enum Var Class (). take If Ġ{ Ġcontext . generation Mode Ġ== ĠGeneration Mode . METADATA Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġkotlin Enum Type Ġ= ĠClass ifier Stub Type ( Classifier . top Level (" kotlin ", Ġ" Enum "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Type Argument Stub ( Classifier Stub Type ( classifier )))) ĊĠĠĠĠĠĠĠ Ġval Ġenum Ġ= ĠClass Stub . Enum ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclassifier Ġ= Ġclassifier , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsuperClass Init Ġ= ĠSuper Class Init ( kotlin Enum Type ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentries Ġ= Ġcanonical Entries With Aliases . map Ġ{ Ġit . first Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompanion Ġ= Ġcompanion , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructors Ġ= ĠlistOf ( primary Constructor ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperties Ġ= ĠlistOf ( value Property ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Ġ= Ġorigin , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinterfaces Ġ= ĠlistOf ( context . platform . get Runtime Type (" C Enum ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren Classes Ġ= ĠlistOf NotNull ( enum Var Class ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġcontext . bridge Components Builder . enum To Type Mirror [ enum ] Ġ= Ġbase Type Mirror ĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( enum ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconstruct Alias Property ( enum Constant : ĠEnum Constant , Ġentry : ĠEnum Entry Stub ): ĠProperty Stub Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġalias Annotation Ġ= ĠAnnotation Stub . C Enum Entry Alias ( entry . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take If Ġ{ Ġcontext . generation Mode Ġ== ĠGeneration Mode . METADATA Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠProperty Stub ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenum Constant . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass ifier Stub Type ( classifier ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkind Ġ= ĠProperty Stub . Kind . Val ( Property Accessor . Getter . Get Enum Entry ( entry )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Ġ= ĠStub Origin . Enum Entry ( enum Constant ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotations Ġ= ĠlistOf NotNull ( alias Annotation ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconstruct Enum Var Class (): ĠClass Stub . Simple Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġenum Var Classifier Ġ= Ġclassifier . nested (" Var ") ĊĊĠĠĠĠĠĠĠ Ġval Ġraw Ptr Constructor Param Ġ= ĠFunction Parameter Stub (" raw Ptr ", Ġcontext . platform . get Runtime Type (" Native Ptr ")) ĊĠĠĠĠĠĠĠ Ġval ĠsuperClass Ġ= Ġcontext . platform . get Runtime Type (" C Enum Var ") ĊĠĠĠĠĠĠĠ Ġrequire ( super Class Ġis ĠClass ifier Stub Type ) ĊĠĠĠĠĠĠĠ Ġval Ġprimary Constructor Ġ= ĠConstructor Stub ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Ġ= ĠlistOf ( raw Ptr Constructor Param ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Primary Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotations Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Ġ= ĠStub Origin . Synt hetic . Default Constructor ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval ĠsuperClass Init Ġ= ĠSuper Class Init ( super Class , ĠlistOf ( Get Constructor Parameter ( raw Ptr Constructor Param ))) ĊĊĠĠĠĠĠĠĠ Ġval Ġbase Integer Type Size Ġ= Ġwhen Ġ( val Ġun wrapped Type Ġ= Ġenum Def . base Type . unwrap Type defs ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInteger Type Ġ-> Ġun wrapped Type . size . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChar Type Ġ-> Ġ 1 L ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Incorrect Ġbase Ġtype Ġfor Ġenum Ġ${ classifier . fq Name }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtype Size Ġ= ĠIntegr al Constant Stub ( base Integer Type Size , Ġ 4 , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġval Ġcompanion Super Ġ= Ġ( context . platform . get Runtime Type (" CP ri mitive Var ") Ġas ĠClass ifier Stub Type ). nested (" Type ") ĊĠĠĠĠĠĠĠ Ġval Ġvar Size Annotation Ġ= ĠAnnotation Stub . C Enum Var Type Size ( base Integer Type Size . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take If Ġ{ Ġcontext . generation Mode Ġ== ĠGeneration Mode . METADATA Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcompanion Ġ= ĠClass Stub . Companion ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclassifier Ġ= Ġenum Var Classifier . nested (" Companion "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsuperClass Init Ġ= ĠSuper Class Init ( comp anion Super , ĠlistOf ( type Size )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotations Ġ= ĠlistOf NotNull ( var Size Annotation ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġvalue Property Ġ= ĠProperty Stub ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" value ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠClass ifier Stub Type ( classifier ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkind Ġ= ĠProperty Stub . Kind . Var ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Accessor . Getter . External Getter (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Accessor . Setter . External Setter () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Ġ= ĠStub Origin . Synt hetic . Enum Var Value Field ( enum Def ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn ĠClass Stub . Simple ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclassifier Ġ= Ġenum Var Classifier , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructors Ġ= ĠlistOf ( primary Constructor ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsuperClass Init Ġ= ĠsuperClass Init , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompanion Ġ= Ġcompanion , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmod ality Ġ= ĠClass Stub Modal ity . NONE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Ġ= ĠStub Origin . Var Of ( Stub Origin . Enum ( enum Def )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperties Ġ= ĠlistOf ( value Property ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠEnum Constant . is More Canonical Than ( other : ĠEnum Constant ): ĠBoolean Ġ= Ġwith ( other . name . toLowerCase ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontains (" min ") Ġ|| Ġcontains (" max ") Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontains (" first ") Ġ|| Ġcontains (" last ") Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontains (" begin ") Ġ|| Ġcontains (" end ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPro duces Ġto Ġ[ out ] Ġthe ĠKotlin Ġdefinitions Ġfor Ġgiven Ġenum Ġwhich Ġshouldn 't Ġbe Ġrepresented Ġas ĠKotlin Ġenum . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġgenerate Enum As Constants ( enum Def : ĠEnum Def ): ĠList < Stub Ir Element > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġif Ġthis Ġenum Ġdefines Ġe . g . Ġa Ġtype Ġof Ġstruct Ġfield , Ġthen Ġit Ġshould Ġbe Ġgenerated Ġinside Ġthe Ġstruct Ġclass ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġto Ġprevent Ġname Ġcl ashing ĊĊĠĠĠĠĠĠĠ Ġval Ġentries Ġ= Ġmutable ListOf < Property Stub >() ĊĠĠĠĠĠĠĠ Ġval Ġtype aliases Ġ= Ġmutable ListOf < Type alias Stub >() ĊĊĠĠĠĠĠĠĠ Ġval Ġconstants Ġ= Ġenum Def . constants . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMacro Ġ" overrides " Ġthe Ġoriginal Ġenum Ġconstant . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . name Ġ! in Ġcontext . macro Constants ByName ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġkotlin Type : ĠKotlin Type ĊĊĠĠĠĠĠĠĠ Ġval Ġbase Kotlin Type Ġ= Ġcontext . mirror ( enum Def . base Type ). arg Type ĊĠĠĠĠĠĠĠ Ġval Ġmeta Ġ= Ġif Ġ( enum Def . is Anonymous ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin Type Ġ= Ġbase Kotlin Type ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStub Container Meta ( text At Start Ġ= Ġif Ġ( constants . isNotEmpty ()) Ġ"// Ġ${ enum Def . spell ing } :" Ġelse Ġ"") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Mirror Ġ= Ġcontext . mirror ( Enum Type ( enum Def )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Mirror Ġ! is ĠType Mirror . By Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" unexpected Ġenum Ġtype Ġmirror : Ġ$ type Mirror ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvar TypeName Ġ= Ġtype Mirror . info . construct Point ed Type ( type Mirror . valueType ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvar Type Classifier Ġ= Ġtype Mirror . point ed Type . classifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Type Classifier Ġ= Ġtype Mirror . valueType . classifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorigin Ġ= ĠStub Origin . Enum ( enum Def ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype aliases Ġ+= ĠType alias Stub ( var Type Classifier , Ġvar TypeName . to Stub Ir Type (), ĠStub Origin . Var Of ( origin )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype aliases Ġ+= ĠType alias Stub ( valueType Classifier , Ġbase Kotlin Type . to Stub Ir Type (), Ġorigin ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin Type Ġ= Ġtype Mirror . valueType ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStub Container Meta () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( constant Ġin Ġconstants ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġliteral Ġ= Ġcontext . try Create Integral Stub ( enum Def . base Type , Ġconstant . value ) Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkind Ġ= Ġwhen Ġ( context . generation Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGeneration Mode . SOURCE _ CODE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgetter Ġ= ĠProperty Accessor . Getter . Simple Getter ( constant Ġ= Ġliteral ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Stub . Kind . Val ( getter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGeneration Mode . METADATA Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Stub . Kind . Constant ( literal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentries Ġ+= ĠProperty Stub ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstant . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin Type . to Stub Ir Type (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkind , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMember Stub Modal ity . FINAL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Ġ= ĠStub Origin . Enum Entry ( constant ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcontainer Ġ= ĠSimple Stub Container ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeta , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperties Ġ= Ġentries . toList (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype aliases Ġ= Ġtype aliases . toList () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( container ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠFunction Stub Builder ( ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġcontext : ĠStub s Building Context , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġfunc : ĠFunction Decl , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġskip Over loads : ĠBoolean Ġ= Ġfalse Ċ ) Ġ: ĠStub Element Builder Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġbuild (): ĠList < Stub Ir Element > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġplatform Ġ= Ġcontext . platform ĊĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġmutable ListOf < Function Parameter Stub >() ĊĊĠĠĠĠĠĠĠ Ġfunc . parameters . forEach Indexed Ġ{ Ġindex , Ġparameter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameter Name Ġ= Ġparameter . name . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ== Ġnull Ġ|| Ġit . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" arg $ index " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrepresent As Values Ref Ġ= Ġrepresent C Function Parameter As Values Ref ( parameter . type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Ġ+= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepresent C Function Parameter AsString ( func , Ġparameter . type ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġannotations Ġ= Ġwhen Ġ( platform ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Platform . JVM Ġ-> Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Platform . NATIVE Ġ-> ĠlistOf ( Annotation Stub . C Call . CString ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= ĠKotlin Types . string . make Nullable (). to Stub Ir Type () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunction Parameter Stub Ġ= ĠFunction Parameter Stub ( parameter Name , Ġtype , Ġannotations ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . bridge Components Builder . c String Parameters Ġ+= Ġfunction Parameter Stub ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Parameter Stub ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepresent C Function Parameter As W String ( func , Ġparameter . type ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġannotations Ġ= Ġwhen Ġ( platform ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Platform . JVM Ġ-> Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Platform . NATIVE Ġ-> ĠlistOf ( Annotation Stub . C Call . WC String ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= ĠKotlin Types . string . make Nullable (). to Stub Ir Type () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunction Parameter Stub Ġ= ĠFunction Parameter Stub ( parameter Name , Ġtype , Ġannotations ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . bridge Components Builder . w CString Parameters Ġ+= Ġfunction Parameter Stub ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Parameter Stub ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepresent As Values Ref Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFunction Parameter Stub ( parameter Name , Ġrepresent As Values Ref . to Stub Ir Type ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmirror Ġ= Ġcontext . mirror ( parameter . type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġmirror . arg Type . to Stub Ir Type () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFunction Parameter Stub ( parameter Name , Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠreturnType Ġ= Ġif Ġ( func . returns Void ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Types . unit ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . mirror ( func . returnType ). arg Type ĊĠĠĠĠĠĠĠ Ġ}. to Stub Ir Type () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( skip Over loads Ġ&& Ġcontext . is Over loading ( func )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĊĠĠĠĠĠĠĠ Ġval Ġannotations : ĠList < Annotation Stub > ĊĠĠĠĠĠĠĠ Ġval Ġmust Be External : ĠBoolean ĊĠĠĠĠĠĠĠ Ġif Ġ( platform Ġ== ĠKotlin Platform . JVM ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġannotations Ġ= Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmust Be External Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( func . is Var arg ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= ĠKotlin Types . any . make Nullable (). to Stub Ir Type () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Ġ+= ĠFunction Parameter Stub (" vari adic Arguments ", Ġtype , Ġis Var arg Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġannotations Ġ= ĠlistOf ( Annotation Stub . C Call . Symbol ("${ context . generate Next UniqueId (" kn if un ptr _ ") }_${ func . name } ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmust Be External Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfunction Stub Ġ= ĠFunction Stub ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunc . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . toList (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStub Origin . Function ( func ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotations , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmust Be External , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMember Stub Modal ity . FINAL ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( function Stub ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun ĠFunction Decl . returns Void (): ĠBoolean Ġ= Ġthis . returnType . unwrap Type defs () Ġis ĠVoid Type ĊĊĠĠĠ Ġprivate Ġfun Ġrepresent C Function Parameter As Values Ref ( type : ĠType ): ĠKotlin Type ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpoint ee Type Ġ= Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPointer Type Ġ-> Ġtype . point ee Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠArray Type Ġ-> Ġtype . elem Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġun wrapped Point ee Type Ġ= Ġpoint ee Type . unwrap Type defs () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( un wrapped Point ee Type Ġis ĠVoid Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRepresent Ġ` void *` Ġas Ġ` C Values Ref < *> ? `: ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠKotlin Types . c Values Ref . type With ( Star Projection ). make Nullable () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( un wrapped Point ee Type Ġis ĠFunction Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDon 't Ġrepresent Ġfunction Ġpointer Ġas Ġ` C Values Ref < T >? ` Ġcurrently : ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( un wrapped Point ee Type Ġis ĠArray Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrepresent C Function Parameter As Values Ref ( point ee Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġreturn ĠKotlin Types . c Values Ref . type With ( context . mirror ( point ee Type ). point ed Type ). make Nullable () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġval Ġplatform W String Types Ġ= Ġset Of (" LPC WSTR ") ĊĊĠĠĠ Ġprivate Ġval Ġno String Conversion : ĠSet < String > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġcontext . configuration . no String Conversion ĊĊĠĠĠ Ġprivate Ġfun ĠType . is Alias Of ( names : ĠSet < String >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtype Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġwhile Ġ( type Ġis ĠType def ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( names . contains ( type . def . name )) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġtype . def . ali ased ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrepresent C Function Parameter AsString ( function : ĠFunction Decl , Ġtype : ĠType ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġun wrapped Type Ġ= Ġtype . unwrap Type defs () ĊĠĠĠĠĠĠĠ Ġreturn Ġun wrapped Type Ġis ĠPointer Type Ġ&& Ġun wrapped Type . point ee Is Const Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun wrapped Type . point ee Type . unwrap Type defs () Ġ== ĠChar Type Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! no String Conversion . contains ( function . name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠWe Ġtake Ġthis Ġapproach Ġas Ġgeneric Ġ' const Ġshort *' Ġshall Ġnot Ġbe Ġused Ġas ĠString . ĊĠĠĠ Ġprivate Ġfun Ġrepresent C Function Parameter As W String ( function : ĠFunction Decl , Ġtype : ĠType ) Ġ= Ġtype . is Alias Of ( platform W String Types ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ! no String Conversion . contains ( function . name ) Ċ } Ċ Ċ internal Ġclass ĠGlobal Stub Builder ( ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġcontext : ĠStub s Building Context , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġglobal : ĠGlobal Decl Ċ ) Ġ: ĠStub Element Builder Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġbuild (): ĠList < Stub Ir Element > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmirror Ġ= Ġcontext . mirror ( global . type ) ĊĠĠĠĠĠĠĠ Ġval Ġun wrapped Type Ġ= Ġglobal . type . unwrap Type defs () ĊĠĠĠĠĠĠĠ Ġval Ġorigin Ġ= ĠStub Origin . Global ( global ) ĊĊĠĠĠĠĠĠĠ Ġval Ġkotlin Type : ĠKotlin Type ĊĠĠĠĠĠĠĠ Ġval Ġkind : ĠProperty Stub . Kind ĊĠĠĠĠĠĠĠ Ġif Ġ( un wrapped Type Ġis ĠArray Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin Type Ġ= Ġ( mirror Ġas ĠType Mirror . By Value ). valueType ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgetter Ġ= Ġwhen Ġ( context . platform ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Platform . JVM Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Accessor . Getter . Simple Getter (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextra Ġ= ĠBridge Generation Info ( global . name , Ġmirror . info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . bridge Components Builder . array Getter Bridge Info [ it ] Ġ= Ġextra ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Platform . NATIVE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Call Annotation Ġ= ĠAnnotation Stub . C Call . Symbol ("${ context . generate Next UniqueId (" kn if un ptr _ ") }_${ global . name }_ getter ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Accessor . Getter . External Getter ( listOf ( c Call Annotation )). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . wrapper Components Builder . getter To Wrapper Info [ it ] Ġ= ĠWrapper Generation Info ( global ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkind Ġ= ĠProperty Stub . Kind . Val ( getter ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( mirror ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠType Mirror . By Value Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin Type Ġ= Ġmirror . arg Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgetter Ġ= Ġwhen Ġ( context . platform ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Platform . JVM Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Accessor . Getter . Simple Getter (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgetter Extra Ġ= ĠBridge Generation Info ( global . name , Ġmirror . info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . bridge Components Builder . getter To Bridge Info [ it ] Ġ= Ġgetter Extra ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Platform . NATIVE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Call Annotation Ġ= ĠAnnotation Stub . C Call . Symbol ("${ context . generate Next UniqueId (" kn if un ptr _ ") }_${ global . name }_ getter ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Accessor . Getter . External Getter ( listOf ( c Call Annotation )). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . wrapper Components Builder . getter To Wrapper Info [ it ] Ġ= ĠWrapper Generation Info ( global ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkind Ġ= Ġif Ġ( global . is Const ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Stub . Kind . Val ( getter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsetter Ġ= Ġwhen Ġ( context . platform ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Platform . JVM Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Accessor . Setter . Simple Setter (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsetter Extra Ġ= ĠBridge Generation Info ( global . name , Ġmirror . info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . bridge Components Builder . setter To Bridge Info [ it ] Ġ= Ġsetter Extra ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Platform . NATIVE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Call Annotation Ġ= ĠAnnotation Stub . C Call . Symbol ("${ context . generate Next UniqueId (" kn if un ptr _ ") }_${ global . name }_ setter ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Accessor . Setter . External Setter ( listOf ( c Call Annotation )). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . wrapper Components Builder . setter To Wrapper Info [ it ] Ġ= ĠWrapper Generation Info ( global ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Stub . Kind . Var ( getter , Ġsetter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠType Mirror . By Ref Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin Type Ġ= Ġmirror . point ed Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgetter Ġ= Ġwhen Ġ( context . generation Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGeneration Mode . SOURCE _ CODE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Accessor . Getter . Inter pret Point ed ( global . name , Ġkotlin Type . to Stub Ir Type ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGeneration Mode . METADATA Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Call Annotation Ġ= ĠAnnotation Stub . C Call . Symbol ("${ context . generate Next UniqueId (" kn if un ptr _ ") }_${ global . name }_ getter ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Accessor . Getter . External Getter ( listOf ( c Call Annotation )). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . wrapper Components Builder . getter To Wrapper Info [ it ] Ġ= ĠWrapper Generation Info ( global , Ġpass Via Pointer Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkind Ġ= ĠProperty Stub . Kind . Val ( getter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( Property Stub ( global . name , Ġkotlin Type . to Stub Ir Type (), Ġkind , Ġorigin Ġ= Ġorigin )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠType def Stub Builder ( ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġcontext : ĠStub s Building Context , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtypedef Def : ĠType def Def Ċ ) Ġ: ĠStub Element Builder Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġbuild (): ĠList < Stub Ir Element > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmirror Ġ= Ġcontext . mirror ( Type def ( typedef Def )) ĊĠĠĠĠĠĠĠ Ġval Ġbase Mirror Ġ= Ġcontext . mirror ( typedef Def . ali ased ) ĊĠĠĠĠĠĠĠ Ġval Ġvar Type Ġ= Ġmirror . point ed Type . classifier ĊĠĠĠĠĠĠĠ Ġval Ġorigin Ġ= ĠStub Origin . TypeDef ( typedef Def ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( base Mirror ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠType Mirror . By Value Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Type Ġ= Ġ( mirror Ġas ĠType Mirror . By Value ). valueType ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvar Type Ali ase e Ġ= Ġmirror . info . construct Point ed Type ( valueType ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Type Ali ase e Ġ= Ġbase Mirror . valueType ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType alias Stub ( var Type , Ġvar Type Ali ase e . to Stub Ir Type (), ĠStub Origin . Var Of ( origin )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType alias Stub ( valueType . classifier , Ġvalue Type Ali ase e . to Stub Ir Type (), Ġorigin ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠType Mirror . By Ref Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvar Type Ali ase e Ġ= Ġbase Mirror . point ed Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Type alias Stub ( var Type , Ġvar Type Ali ase e . to Stub Ir Type (), Ġorigin )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ