/* Ċ Ġ* ĠCopyright Ġ 2 0 1 7 - 2 0 2 0 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense . Ċ Ġ*/ Ċ Ċ package Ġkotlinx . serialization Ċ Ċ import Ġkotlin . reflect .* ĊĊ Ċ @ Opt In ( Experimental Associated Objects :: class ) Ċ @ Associated Object Key Ċ @ Retention ( Annotation Retention . BINARY ) Ċ @ Deprecated (" Inserted Ġinto Ġgenerated Ġcode Ġand Ġshould Ġnot Ġbe Ġused Ġdirectly ", Ġlevel Ġ= ĠDeprec ation Level . HIDDEN ) Ċ public Ġannotation Ġclass ĠSerializable With ( public Ġval Ġserializer : ĠK Class < out ĠK Serializer <* >>) Ċ Ċ @ Suppress ( ĊĠĠĠ Ġ" UN CHECK ED _ CAST ", ĊĠĠĠ Ġ" DE PREC ATION _ ERROR " Ċ ) Ċ @ Opt In ( Experimental Associated Objects :: class ) Ċ internal Ġactual Ġfun Ġ< T Ġ: ĠAny > ĠK Class < T >. construct Serializer For Given Type Args ( var arg Ġargs : ĠK Serializer < Any ?> ): ĠK Serializer < T >? Ġ= ĊĠĠĠ Ġwhen Ġ( val Ġassoc Object Ġ= Ġfind Associated Object < Serializable With >()) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠK Serializer < *> Ġ-> Ġassoc Object Ġas ĠK Serializer < T > ĊĠĠĠĠĠĠĠ Ġis Ġkotlinx . serialization . internal . Serializer Factory Ġ-> Ġassoc Object . serializer (* args ) Ġas ĠK Serializer < T > ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠ Ġ} ĊĊ Ċ @ Suppress ( ĊĠĠĠ Ġ" UN CHECK ED _ CAST ", ĊĠĠĠ Ġ" DE PREC ATION _ ERROR " Ċ ) Ċ @ Opt In ( Experimental Associated Objects :: class ) Ċ @ Implicit Reflection Serializer Ċ internal Ġactual Ġfun Ġ< T Ġ: ĠAny > ĠK Class < T >. compiled Serializer Impl (): ĠK Serializer < T >? Ġ= ĊĠĠĠ Ġfind Associated Object < Serializable With >() Ġas ? ĠK Serializer < T > Ċ Ċ internal Ġactual Ġfun Ġ< T Ġ: ĠAny , ĠE Ġ: ĠT ?> ĠArrayList < E >. to Native Array Impl ( e Class : ĠK Class < T >): ĠArray < E > Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= ĠarrayOf Any Null s < E >( size ) ĊĠĠĠ Ġvar Ġindex Ġ= Ġ 0 ĊĠĠĠ Ġfor Ġ( element Ġin Ġthis ) Ġresult [ index ++] Ġ= Ġelement ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ", Ġ" USE LESS _ CAST ") ĊĠĠĠ Ġreturn Ġresult Ġas ĠArray < E > Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ private Ġfun Ġ< T > ĠarrayOf Any Null s ( size : ĠInt ): ĠArray < T > Ġ= ĠarrayOf Null s < Any >( size ) Ġas ĠArray < T > Ċ Ċ internal Ġactual Ġfun ĠAny . isInstanceOf ( k class : ĠK Class < *> ): ĠBoolean Ġ= Ġk class . is Instance ( this ) Ċ Ċ internal Ġactual Ġfun Ġ< T Ġ: ĠAny > ĠK Class < T >. simple Name (): ĠString ? Ġ= Ġsimple Name Ċ Ċ internal Ġactual Ġfun Ġis Reference Array ( type : ĠK Type , Ġroot Class : ĠK Class < Any >): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġtype Parameters Ġ= Ġtype . arguments ĊĠĠĠ Ġif Ġ( type Parameters . size Ġ!= Ġ 1 ) Ġreturn Ġfalse ĊĠĠĠ Ġval Ġparameter Ġ= Ġtype Parameters . single () ĊĠĠĠ Ġ// ĠFun Ġfact Ġ-- Ġstar Ġprojection s Ġpass Ġthis Ġcheck ĊĠĠĠ Ġval Ġvariance Ġ= Ġparameter . variance Ġ?: Ġerror (" Star Ġprojection s Ġare Ġforbidden : Ġ$ type ") ĊĠĠĠ Ġif Ġ( parameter . type Ġ== Ġnull ) Ġerror (" Star Ġprojection s Ġare Ġforbidden : Ġ$ type ") ĊĠĠĠ Ġval Ġprefix Ġ= Ġif Ġ( variance Ġ== ĠK Variance . IN Ġ|| Ġvariance Ġ== ĠK Variance . OUT ) ĊĠĠĠĠĠĠĠ Ġvariance . toString (). toLowerCase () Ġ+ Ġ" Ġ" Ġelse Ġ"" ĊĠĠĠ Ġval Ġparameter Name Ġ= Ġprefix Ġ+ Ġparameter . type . toString () ĊĠĠĠ Ġval Ġexpected Name Ġ= Ġ" kotlin . Array <$ parameter Name >" ĊĠĠĠ Ġif Ġ( type . toString () Ġ!= Ġexpected Name ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtrue Ċ } Ċ