/* Ċ Ġ* Ġ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 . internal Ċ Ċ import Ġkotlinx . serialization .* Ċ import Ġjava . lang . reflect .* Ċ import Ġkotlin . reflect .* Ċ Ċ @ Suppress (" NOTH ING _ TO _ INLINE ") Ċ internal Ġactual Ġinline Ġfun Ġ< T > ĠArray < T >. get Checked ( index : ĠInt ): ĠT Ġ{ ĊĠĠĠ Ġreturn Ġget ( index ) Ċ } Ċ Ċ @ Suppress (" NOTH ING _ TO _ INLINE ") Ċ internal Ġactual Ġinline Ġfun ĠBoolean Array . get Checked ( index : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġget ( index ) Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ internal Ġactual Ġfun Ġ< T Ġ: ĠAny > ĠK Class < T >. compiled Serializer Impl (): ĠK Serializer < T >? Ġ= ĊĠĠĠ Ġthis . construct Serializer For Given Type Args () Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ internal Ġactual Ġfun Ġ< T Ġ: ĠAny , ĠE Ġ: ĠT ?> ĠArrayList < E >. to Native Array Impl ( e Class : ĠK Class < T >): ĠArray < E > Ġ= ĊĠĠĠ Ġto Array ( java . lang . reflect . Array . newInstance ( e Class . java , Ġsize ) Ġas ĠArray < E >) Ċ Ċ internal Ġactual Ġfun ĠK Class <* >. platform Specific Serializer Not Registered (): ĠNothing Ġ= Ġserializer Not Registered () Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ internal Ġactual Ġfun Ġ< T Ġ: ĠAny > ĠK Class < T >. construct Serializer For Given Type Args ( var arg Ġargs : ĠK Serializer < Any ?> ): ĠK Serializer < T >? Ġ{ ĊĠĠĠ Ġval Ġj Class Ġ= Ġthis . java ĊĠĠĠ Ġif Ġ( j Class . is Enum Ġ&& Ġj Class . isNot Annotated ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġj Class . create Enum Serializer () ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( j Class . is Interface ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinterface Serializer () ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// ĠSearch Ġfor Ġserializer Ġdefined Ġon Ġcompanion Ġobject . ĊĠĠĠ Ġval Ġserializer Ġ= Ġinvoke Serializer On Companion < T >( j Class , Ġ* args ) ĊĠĠĠ Ġif Ġ( serializer Ġ!= Ġnull ) Ġreturn Ġserializer ĊĠĠĠ Ġ// ĠCheck Ġwhether Ġit 's Ġserial izable Ġobject ĊĠĠĠ Ġfind Object Serializer ( j Class )?. let Ġ{ Ġreturn Ġit Ġ} ĊĠĠĠ Ġ// ĠSearch Ġfor Ġdefault Ġserializer Ġif Ġno Ġserializer Ġis Ġdefined Ġin Ġcompanion Ġobject . ĊĠĠĠ Ġ// ĠIt Ġis Ġrequired Ġfor Ġnamed Ġcomp an ions ĊĠĠĠ Ġval Ġfrom Named Companion Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġj Class . declared Classes . single OrNull Ġ{ Ġit . simple Name Ġ== Ġ(" \$ serializer ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . getField (" INSTANCE ") ?. get ( null ) Ġas ? ĠK Serializer < T > ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠNoSuch Field Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( from Named Companion Ġ!= Ġnull ) Ġreturn Ġfrom Named Companion ĊĠĠĠ Ġ// ĠCheck Ġfor Ġpol ymorphic ĊĠĠĠ Ġreturn Ġpol ymorphic Serializer () Ċ } Ċ Ċ private Ġfun Ġ< T : ĠAny > ĠClass < T >. isNot Annotated (): ĠBoolean Ġ{ ĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* ĠFor Ġannotated Ġenums Ġsearch Ġserializer Ġdirectly Ġ( or Ġdo Ġnot Ġsearch Ġat Ġall ?) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġreturn Ġget Annotation ( Serializable :: class . java ) Ġ== Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Annotation ( Pol ymorphic :: class . java ) Ġ== Ġnull Ċ } Ċ Ċ private Ġfun Ġ< T : ĠAny > ĠK Class < T >. pol ymorphic Serializer (): ĠK Serializer < T >? Ġ{ ĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* ĠLast Ġres ort : Ġcheck Ġfor Ġ@ Pol ymorphic Ġor ĠSerializable ( with Ġ= ĠPol ymorphic Serializer :: class ) ĊĠĠĠĠ Ġ* Ġannotations . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġj Class Ġ= Ġjava ĊĠĠĠ Ġif Ġ( j Class . getAnnotation ( Pol ymorphic :: class . java ) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPol ymorphic Serializer ( this ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġserial izable Ġ= Ġj Class . getAnnotation ( Serializable :: class . java ) ĊĠĠĠ Ġif Ġ( serial izable Ġ!= Ġnull Ġ&& Ġserial izable . with Ġ== ĠPol ymorphic Serializer :: class ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPol ymorphic Serializer ( this ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġnull Ċ } Ċ Ċ private Ġfun Ġ< T : ĠAny > ĠK Class < T >. interface Serializer (): ĠK Serializer < T >? Ġ{ ĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* ĠInterfaces Ġare Ġ@ Pol ymorphic Ġby Ġdefault . ĊĠĠĠĠ Ġ* ĠCheck Ġif Ġit Ġhas Ġno Ġannotations Ġor Ġ`@ Serializable ( with Ġ= ĠPol ymorphic Serializer :: class )`, ĊĠĠĠĠ Ġ* Ġotherwise Ġb ai lout . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġserial izable Ġ= Ġjava . getAnnotation ( Serializable :: class . java ) ĊĠĠĠ Ġif Ġ( serial izable Ġ== Ġnull Ġ|| Ġserial izable . with Ġ== ĠPol ymorphic Serializer :: class ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPol ymorphic Serializer ( this ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġnull Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ private Ġfun Ġ< T Ġ: ĠAny > Ġinvoke Serializer On Companion ( j Class : ĠClass <* >, Ġvar arg Ġargs : ĠK Serializer < Any ?> ): ĠK Serializer < T >? Ġ{ ĊĠĠĠ Ġval Ġcompanion Ġ= Ġj Class . comp anion OrNull () Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtypes Ġ= Ġif Ġ( args . isEmpty ()) Ġempty Array () Ġelse ĠArray ( args . size ) Ġ{ ĠK Serializer :: class . java Ġ} ĊĠĠĠĠĠĠĠ Ġcompanion . java Class . getDeclared Method (" serializer ", Ġ* types ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. invoke ( comp anion , Ġ* args ) Ġas ? ĠK Serializer < T > ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠNoSuch Method Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠInvocation TargetException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcause Ġ= Ġe . cause Ġ?: Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġthrow ĠInvocation TargetException ( cause , Ġcause . message Ġ?: Ġe . message ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠClass <* >. comp anion OrNull () Ġ= ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcompanion Ġ= Ġget Declared Field (" Companion ") ĊĠĠĠĠĠĠĠ Ġcompanion . is Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġcompanion . get ( null ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ private Ġfun Ġ< T Ġ: ĠAny > ĠClass < T >. create Enum Serializer (): ĠK Serializer < T >? Ġ{ ĊĠĠĠ Ġval Ġconstants Ġ= Ġenum Constants ĊĠĠĠ Ġreturn ĠEnum Serializer ( canonical Name , Ġconstants Ġas ĠArray < out ĠEnum <* >>) Ġas ? ĠK Serializer < T > Ċ } Ċ Ċ private Ġfun Ġ< T Ġ: ĠAny > Ġfind Object Serializer ( j Class : ĠClass < T >): ĠK Serializer < T >? Ġ{ ĊĠĠĠ Ġ// ĠCheck Ġit Ġis Ġan Ġobject Ġwithout Ġusing Ġkotlin - reflect ĊĠĠĠ Ġval Ġfield Ġ= ĊĠĠĠĠĠĠĠ Ġj Class . declared Fields . single OrNull Ġ{ Ġit . name Ġ== Ġ" INSTANCE " Ġ&& Ġit . type Ġ== Ġj Class Ġ&& ĠModifier . is Static ( it . modifiers ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġ// ĠRetrieve Ġits Ġinstance Ġand Ġcall Ġserializer () ĊĠĠĠ Ġval Ġinstance Ġ= Ġfield . get ( null ) ĊĠĠĠ Ġval Ġmethod Ġ= ĊĠĠĠĠĠĠĠ Ġj Class . methods . single OrNull Ġ{ Ġit . name Ġ== Ġ" serializer " Ġ&& Ġit . parameter Types . isEmpty () Ġ&& Ġit . returnType Ġ== ĠK Serializer :: class . java Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġval Ġresult Ġ= Ġmethod . invoke ( instance ) ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġreturn Ġresult Ġas ? ĠK Serializer < T > Ċ } Ċ Ċ /** Ċ Ġ* ĠChecks Ġif Ġan Ġ[ this @ isInstanceOf ] Ġis Ġan Ġinstance Ġof Ġa Ġgiven Ġ[ k class ]. Ċ Ġ* Ċ Ġ* ĠThis Ġcheck Ġis Ġa Ġreplacement Ġfor Ġ[ K Class . is Instance ] Ġbecause Ċ Ġ* Ġon ĠJVM Ġit Ġrequires Ġkotlin - reflect . jar Ġin Ġclasspath Ċ Ġ* Ġ( see Ġhttps :// yout rack . jetbrains . com / issue / KT - 1 4 7 2 0 ). Ċ Ġ* Ċ Ġ* ĠOn ĠJS Ġand ĠNative , Ġthis Ġfunction Ġdeleg ates Ġto Ġa fore mention ed Ċ Ġ* Ġ[ K Class . is Instance ] Ġsince Ġit Ġis Ġsupported Ġthere Ġout - of - the Ġbox ; Ċ Ġ* Ġon ĠJVM , Ġit Ġfalls Ġback Ġto Ġjava . lang . Class . is Instance , Ġwhich Ġcauses Ċ Ġ* Ġdifference Ġwhen Ġapplied Ġto Ġfunction Ġtypes Ġwith Ġbig Ġar ity . Ċ Ġ*/ Ċ internal Ġactual Ġfun ĠAny . isInstanceOf ( k class : ĠK Class < *> ): ĠBoolean Ġ= Ġk class . java ObjectType . is Instance ( this ) Ċ Ċ internal Ġactual Ġfun Ġis Reference Array ( root Class : ĠK Class < Any >): ĠBoolean Ġ= Ġroot Class . java . isArray Ċ