/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 9 ĠJetBrains Ġs . r . o . Ġand ĠKotlin ĠProgramming ĠLanguage Ġcontributors . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe Ġlicense / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . common izer . core Ċ Ċ import Ġorg . jetbrains . kotlin . common izer . Common izer Target Ċ import Ġorg . jetbrains . kotlin . common izer . all Le aves Ċ import Ġorg . jetbrains . kotlin . common izer . cir .* Ċ import Ġorg . jetbrains . kotlin . common izer . merge dt ree . C ir Known Class ifiers Ċ import Ġorg . jetbrains . kotlin . descriptors . Vis ibilities Ċ import Ġorg . jetbrains . kotlin . utils . addTo Std lib . first Is Instance OrNull Ċ Ċ class ĠType Alias Common izer ( ĊĠĠĠ Ġprivate Ġval Ġclassifiers : ĠC ir Known Class ifiers Ċ ) Ġ: ĠNullable Single Invocation Common izer < C ir Type Alias > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġinvoke ( values : ĠList < C ir Type Alias >): ĠC ir Type Alias ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( values . isEmpty ()) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġvalues . map Ġ{ Ġit . name Ġ}. distinct (). single OrNull () Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġtype Parameters Ġ= ĠType Parameter List Common izer ( class ifiers ). common ize ( values . map Ġ{ Ġit . type Parameters Ġ}) Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġunderlying Type Ġ= ĠType Common izer ( class ifiers , ĠType Common izer . Options . default . with Allow Optim istic Number Type Common ization ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Common izer (). common ize ( values . map Ġ{ Ġit . underlying Type Ġ}) Ġas ? ĠC ir Class Or Type Alias Type Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġvisibility Ġ= ĠVisibility Common izer . lower ing (). common ize ( values ) Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġreturn ĠC ir Type Alias . create ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Parameters Ġ= Ġtype Parameters , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= Ġvisibility , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunderlying Type Ġ= Ġunderlying Type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpanded Type Ġ= Ġunderlying Type . expanded Type (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġannotations Ġ= ĠlistOf NotNull ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Unsafe Number Annotation If Ne cessary ( class ifiers . classifier Indices . targets , Ġvalues ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġcreate Unsafe Number Annotation If Ne cessary ( ĊĠĠĠ Ġtargets : ĠList < Common izer Target >, ĊĠĠĠ Ġvalues : ĠList < C ir Type Alias >, Ċ ): ĠC ir Annotation ? Ġ{ ĊĠĠĠ Ġval Ġexpanded Types Ġ= Ġvalues . map Ġ{ Ġit . expanded Type . classifier Id Ġ} ĊĊĠĠĠ Ġ// ĠAll Ġtype alias Ġhave Ġto Ġbe Ġpotentially Ġsubstit utable Ġ( aka Ġhave Ġto Ġbe Ġsome Ġkind Ġof Ġnumber Ġtype ) ĊĠĠĠ Ġif Ġ(! expanded Types . all Ġ{ ĠOptim istic Numbers Type Common izer . is Optim istic ally Subst it utable ( it ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġactual Platform Types Ġ= Ġmutable Map Of < String , ĠC ir EntityId >() ĊĠĠĠ Ġvalues . forEach Indexed ĠforEach @{ Ġindex , Ġta Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġexisting Annotation Ġ= Ġta . annotations . first Is Instance OrNull < Unsafe Number Annotation >() ĊĠĠĠĠĠĠĠ Ġif Ġ( existing Annotation Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactual Platform Types . put All ( existing Annotation . actual Platform Types ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtargets [ index ]. all Le aves (). forEach Ġ{ Ġtarget Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactual Platform Types [ target . name ] Ġ= Ġta . expanded Type . classifier Id ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( actual Platform Types . values . distinct (). size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠUnsafe Number Annotation ( actual Platform Types ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġnull Ċ } Ċ Ċ private Ġclass ĠUnsafe Number Annotation ( val Ġactual Platform Types : ĠMap < String , ĠC ir EntityId >) Ġ: ĠC ir Annotation Ġ{ ĊĠĠĠ Ġoverride Ġval Ġtype : ĠC ir ClassType Ġ= ĠUnsafe Number Annotation . type ĊĠĠĠ Ġoverride Ġval Ġannotation Value Arguments : ĠMap < C ir Name , ĠC ir Annotation > Ġ= Ġempty Map () ĊĊĠĠĠ Ġoverride Ġval Ġconstant Value Arguments : ĠMap < C ir Name , ĠC ir Constant Value > Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠ ĠC ir Name . create (" actual Platform Types ") Ġto ĠC ir Constant Value . Array Value ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactual Platform Types . map Ġ{ Ġ( platform , Ġtype ) Ġ-> ĠC ir Constant Value . StringValue ("$ platform : Ġ${ type . to QualifiedName String () }") Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtype Ġ= ĠC ir ClassType . create Intern ed ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Id Ġ= ĠC ir EntityId . create (" kotlin x / c interop / Unsafe Number "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġouter Type Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠVis ibilities . Public , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Marked Nullable Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġempty Ġ= ĠUnsafe Number Annotation ( empty Map ()) ĊĠĠĠ Ġ} Ċ }