package Ġio . github . dz ir bel . gson . bi ject iv eref lection Ċ Ċ import Ġcom . google . gson . Gson Ċ import Ġcom . google . gson . Json Syntax Exception Ċ import Ġcom . google . gson . Type Adapter Ċ import Ġcom . google . gson . Type Adapter Factory Ċ import Ġcom . google . gson . annotations . SerializedName Ċ import Ġcom . google . gson . internal . Constructor Constructor Ċ import Ġcom . google . gson . internal .` $ Gson $ Types ` Ċ import Ġcom . google . gson . internal . bind . Reflect ive Type Adapter Factory Ċ import Ġcom . google . gson . reflect . Type Token Ċ import Ġcom . google . gson . stream . Json Reader Ċ import Ġcom . google . gson . stream . Json Token Ċ import Ġcom . google . gson . stream . Json Writer Ċ import Ġjava . lang . reflect . Field Ċ import Ġjavax . annotation . Nullable Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . K Property 1 Ċ import Ġkotlin . reflect . full . has Annotation Ċ import Ġkotlin . reflect . full . member Properties Ċ import Ġkotlin . reflect . jvm . java Field Ċ Ċ /** Ċ Ġ* ĠA Ġ[ Gson ] Ġ[ Type Adapter Factory ] Ġwhich Ġoverrides Ġthe Ġdefault Ġ[ Reflect ive Type Adapter Factory ] Ġto Ġprovides Ġstrict er Ġtype Ċ Ġ* Ġadapters Ġfor Ġuser - defined Ġclasses , Ġrequiring Ġthat Ġall ĠJSON Ġelements Ġare Ġreflected Ġin Ġthe Ġclass Ġand Ġvice Ġvers a . Ċ Ġ* Ċ Ġ* ĠLike Ġthe Ġdefault Ġ[ Reflect ive Type Adapter Factory ], Ġthis Ġ[ Type Adapter Factory ] Ġde serial izes ĠJSON Ġelements Ġby Ġreflect ing Ċ Ġ* Ġover Ġthe Ġfields Ġof Ġthe Ġdestination Ġclass . ĠUn like Ġthe Ġdefault Ġ[ Reflect ive Type Adapter Factory ], Ġ[ Type Adapter ] s Ġprovided Ċ Ġ* Ġby Ġthis Ġfactory Ġrequire Ġthat Ġthe Ġinput ĠJSON Ġand Ġthe Ġdestination Ġclass Ġhave Ġone - to - one Ġfields Ġ( unless Ġthe ĠJSON Ġfield Ċ Ġ* Ġhas Ġa Ġnull Ġvalue ). ĠSerialization Ġ( writing Ġclasses Ġto ĠJSON ) Ġis Ġdeleg ated Ġto Ġthe Ġ[ Reflect ive Type Adapter Factory ]. Ċ Ġ*/ Ċ class ĠBi ject ive Reflect ive Type Adapter Factory ( ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRequires Ġthat Ġevery Ġmember Ġfield Ġof Ġa Ġdestination Ġclass Ġis Ġrequired Ġto Ġbe Ġpresent Ġin Ġthe ĠJSON ; Ġdefault Ġtrue . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNullable Ġfields Ġ( either ĠKotlin Ġnullable Ġor Ġannotated Ġwith Ġeither Ġ[ javax . annotation . Nullable ] Ġor ĊĠĠĠĠ Ġ* Ġ[ org . jetbrains . annotations . Nullable ]) Ġor Ġfields Ġannotated Ġwith Ġ[ Optional Field ] Ġare Ġomitted . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġrequire All Class Fields Used : ĠBoolean Ġ= Ġtrue , ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRequires Ġthat Ġfor Ġevery ĠJSON Ġelement Ġthere Ġmust Ġbe Ġa Ġcorresponding Ġfield Ġin Ġthe Ġdestination Ġclass ; Ġdefault Ġtrue . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġ[ allow Unused Null s ] Ġis Ġtrue , Ġthen Ġif Ġa ĠJSON Ġelement Ġhas Ġnull Ġvalue , Ġit Ġis Ġnot Ġrequired Ġto Ġhave Ġan Ġassociated ĊĠĠĠĠ Ġ* Ġclass Ġfield . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġrequire All Json Fields Used : ĠBoolean Ġ= Ġtrue , ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAllows Ġthe Ġinput ĠJSON Ġto Ġcontain Ġfields Ġwith Ġa Ġnull Ġvalue Ġfor Ġwhich Ġthere Ġis Ġno Ġcorresponding Ġfield Ġin Ġthe ĊĠĠĠĠ Ġ* Ġdestination Ġclass . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġallow Unused Null s : ĠBoolean Ġ= Ġtrue , ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAn Ġoptional Ġset Ġof Ġ[ K Class ] es Ġwhich Ġthis Ġ[ Type Adapter Factory ] Ġwill Ġdeserialize Ġinto ; Ġwhen Ġnull Ġ( the Ġdefault ), Ġit ĊĠĠĠĠ Ġ* Ġde serial izes Ġinto Ġall Ġclasses Ġwhich Ġthe Ġthe Ġdefault Ġ[ Reflect ive Type Adapter Factory ] Ġhandles . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġclasses : ĠSet < K Class <* >> ? Ġ= Ġnull Ċ ) Ġ: ĠType Adapter Factory Ġ{ ĊĊĠĠĠ Ġ@ Target ( Annotation Target . PROPERTY , ĠAnnotation Target . FIELD ) ĊĠĠĠ Ġ@ Retention ( Annotation Retention . RUNTIME ) ĊĠĠĠ Ġannotation Ġclass ĠOptional Field ĊĊĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠAny ?> Ġcreate ( gson : ĠGson , Ġtype : ĠType Token < T >): ĠType Adapter < T >? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( classes Ġ!= Ġnull Ġ&& Ġ! classes . contains ( type . raw Type . kotlin )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdelegate Ġ= Ġgson . get Delegate Adapter ( this , Ġtype ) ĊĠĠĠĠĠĠĠ Ġreturn Ġ( delegate Ġas ? ĠReflect ive Type Adapter Factory . Adapter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBi ject ive Reflect ive Type Adapter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgson Ġ= Ġgson , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġtype , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate Ġ= Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire All Json Fields Used Ġ= Ġrequire All Json Fields Used , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire All Class Fields Used Ġ= Ġrequire All Class Fields Used , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġallow Unused Null s Ġ= Ġallow Unused Null s ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġ[ Type Adapter ] Ġwhich Ġcan Ġ[ read ] ĠJSON Ġobjects Ġinto Ġinstances Ġof Ġ[ T ]. Ċ Ġ*/ Ċ private Ġclass ĠBi ject ive Reflect ive Type Adapter < T >( ĊĠĠĠ Ġprivate Ġval Ġgson : ĠGson , ĊĠĠĠ Ġprivate Ġval Ġtype : ĠType Token < T >, ĊĠĠĠ Ġprivate Ġval Ġdelegate : ĠReflect ive Type Adapter Factory . Adapter < T >, ĊĠĠĠ Ġprivate Ġval Ġrequire All Json Fields Used : ĠBoolean , ĊĠĠĠ Ġprivate Ġval Ġrequire All Class Fields Used : ĠBoolean , ĊĠĠĠ Ġprivate Ġval Ġallow Unused Null s : ĠBoolean Ċ ) Ġ: ĠType Adapter < T >() Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġmember Ġfields Ġof Ġ[ T ]; Ġpaired Ġby Ġ[ K Property 1 ] Ġ( Kotlin Ġreflection ) Ġand Ġ[ Field ] Ġ( Java Ġreflection ); Ġonly ĊĠĠĠĠ Ġ* Ġincluding Ġfields Ġwhich Ġhave Ġa Ġnon - null Ġ[ Field ], Ġi . e . Ġthose Ġwhich Ġhave Ġa Ġbacking Ġfield . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġfields : ĠList < Pair < K Property 1 < in ĠT , Ġ* >, ĠField >> Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġtype . raw Type . kotlin . member Properties . map NotNull Ġ{ Ġk Property Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġk Property . java Field ?. let Ġ{ Ġjava Field Ġ-> ĠPair ( k Property , Ġjava Field ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġmember Ġfields Ġof Ġ[ T ] Ġwhich Ġare Ġrequired Ġwhen Ġ[ require All Class Fields Used ] Ġis Ġtrue , Ġi . e . Ġthe Ġsubset Ġof Ġ[ fields ] ĊĠĠĠĠ Ġ* Ġwhich Ġare Ġnon - nullable Ġand Ġnot Ġannotated Ġwith Ġ[ Bi ject ive Reflect ive Type Adapter Factory . Optional Field ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġrequired Fields : ĠList < Field > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġfields ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ( k Property , Ġ_) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! k Property . returnType . is Marked Nullable Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! k Property . has Annotation < Nullable >() Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! k Property . has Annotation < Bi ject ive Reflect ive Type Adapter Factory . Optional Field >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . second Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġconstructor Ġby Ġlazy Ġ{ ĠConstructor Constructor ( empty Map ()). get ( type ) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġ[ Set ] Ġof Ġthe Ġserialized Ġnames Ġfor Ġthis Ġclass Ġ[ Field ]; ĠJSON Ġfields Ġwhich Ġmatch Ġany Ġof Ġthese Ġnames Ġshould ĊĠĠĠĠ Ġ* Ġbe Ġserialized Ġinto Ġthis Ġ[ Field ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval ĠField . serialized Names : ĠSet < String > ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Annotation ( SerializedName :: class . java )?. let Ġ{ Ġannotation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Of NotNull ( annotation . value ). plus ( annotation . alternate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġset Of ( gson . field Naming Strategy (). translate Name ( this )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDetermines Ġthe Ġ[ Field ] Ġwhich Ġshould Ġbe Ġset Ġfor Ġthe ĠJSON Ġfield Ġof Ġthe Ġgiven Ġ[ name ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġfield For ( name : ĠString ): ĠField ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfields . find Ġ{ Ġ(_, Ġjava Field ) Ġ-> Ġjava Field . serialized Names . contains ( name ) Ġ} ?. second ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġwrite ( out : ĠJson Writer , Ġvalue : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdelegate . write ( out , Ġvalue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġread ( reader : ĠJson Reader ): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( reader . peek () Ġ== ĠJson Token . NULL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreader . next Null () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= Ġconstructor . construct () ĊĠĠĠĠĠĠĠ Ġval Ġmissing Fields Ġ= Ġif Ġ( require All Class Fields Used ) Ġrequired Fields . to Mutable Set () Ġelse Ġnull ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreader . begin Object () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( reader . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġreader . next Name () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield Ġ= Ġfield For ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġif Ġ( require All Json Fields Used Ġ&& Ġ(! allow Unused Null s Ġ|| Ġreader . peek () Ġ!= ĠJson Token . NULL )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Value Ġ= Ġgson . get Adapter ( Any :: class . java ). read ( reader ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠJson Syntax Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Model Ġclass Ġ${ type . type . typeName } Ġdoes Ġnot Ġcontain Ġa Ġfield Ġfor ĠJSON Ġproperty Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"` $ name ` Ġwith Ġvalue Ġ`$ json Value `" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġskip Ġpast Ġfields Ġon ĠJSON Ġwhich Ġhave Ġno Ġclass Ġfield Ġwhen Ġrequire All Json Fields Used Ġis Ġfalse Ġ( or ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhen Ġallow Unused Null s Ġis Ġtrue Ġand Ġthe Ġvalue Ġis Ġnull ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġread Ġpast Ġthe Ġnext Ġelement ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġany Type Ġ= Ġ`$ Gson $ Types `. resolve ( type . type , Ġtype . raw Type , ĠAny :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadapter Ġ= Ġgson . get Adapter ( Type Token . get ( any Type )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . read ( reader ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! field . try Set Accessible ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠJson Syntax Exception (" Could Ġnot Ġmake Ġ$ field Ġaccessible ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfieldType Ġ= Ġ`$ Gson $ Types `. resolve ( type . type , Ġtype . raw Type , Ġfield . generic Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadapter Ġ= Ġgson . get Adapter ( Type Token . get ( fieldType )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield Value Ġ= Ġadapter . read ( reader ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield [ instance ] Ġ= Ġfield Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmissing Fields ?. remove ( field ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalStateException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠJson Syntax Exception ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreader . end Object () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( missing Fields ?. isNotEmpty () Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠJson Syntax Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Model Ġclass Ġ${ type . type . typeName } Ġrequired Ġfield ( s ) Ġwhich Ġwere Ġnot Ġpresent Ġin Ġthe ĠJSON : Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmissing Fields . join ToString Ġ{ Ġit . serialized Names . toString () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġinstance ĊĠĠĠ Ġ} Ċ } Ċ