/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 0 Ġ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 . android . parcel . ir Ċ Ċ import Ġorg . jetbrains . kotlin . android . parcel . serializers . Parcelable Extension Base . Companion . CRE ATOR _ NAME Ċ import Ġorg . jetbrains . kotlin . backend . jvm . codegen . is Jvm Interface Ċ import Ġorg . jetbrains . kotlin . backend . jvm . ir . er ased Upper Bound Ċ import Ġorg . jetbrains . kotlin . backend . jvm . ir . is Boxed Array Ċ import Ġorg . jetbrains . kotlin . ir . builders .* Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Class Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Value Declaration Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Expression Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Constructor Symbol Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Function Symbol Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Simple Function Symbol Ċ import Ġorg . jetbrains . kotlin . ir . types .* Ċ import Ġorg . jetbrains . kotlin . ir . util .* Ċ Ċ interface ĠIr Parcel Serializer Ġ{ ĊĠĠĠ Ġfun ĠAndroid Ir Builder . read Parcel ( parcel : ĠIr Value Declaration ): ĠIr Expression ĊĠĠĠ Ġfun ĠAndroid Ir Builder . write Parcel ( parcel : ĠIr Value Declaration , Ġflags : ĠIr Value Declaration , Ġvalue : ĠIr Expression ): ĠIr Expression Ċ } Ċ Ċ fun ĠAndroid Ir Builder . read Parcel With ( serializer : ĠIr Parcel Serializer , Ġparcel : ĠIr Value Declaration ): ĠIr Expression Ġ= ĊĠĠĠ Ġwith ( serializer ) Ġ{ Ġread Parcel ( parcel ) Ġ} Ċ Ċ fun ĠAndroid Ir Builder . write Parcel With ( ĊĠĠĠ Ġserializer : ĠIr Parcel Serializer , ĊĠĠĠ Ġparcel : ĠIr Value Declaration , ĊĠĠĠ Ġflags : ĠIr Value Declaration , ĊĠĠĠ Ġvalue : ĠIr Expression Ċ ): ĠIr Expression Ġ= ĊĠĠĠ Ġwith ( serializer ) Ġ{ Ġwrite Parcel ( parcel , Ġflags , Ġvalue ) Ġ} Ċ Ċ // ĠCreates Ġa Ġserializer Ġfrom Ġa Ġpair Ġof Ġparcel Ġmethods Ġof Ġthe Ġform Ġreader () T Ġand Ġwriter ( T ) V . Ċ class ĠIr Simple Parcel Serializer ( private Ġval Ġreader : ĠIr Simple Function Symbol , Ġprivate Ġval Ġwriter : ĠIr Simple Function Symbol ) Ġ: ĊĠĠĠ ĠIr Parcel Serializer Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠAndroid Ir Builder . read Parcel ( parcel : ĠIr Value Declaration ): ĠIr Expression Ġ= ĊĠĠĠĠĠĠĠ Ġir Call ( reader ). apply Ġ{ Ġdispatch Receiver Ġ= Ġir Get ( parcel ) Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠAndroid Ir Builder . write Parcel ( parcel : ĠIr Value Declaration , Ġflags : ĠIr Value Declaration , Ġvalue : ĠIr Expression ): ĠIr Expression Ġ= ĊĠĠĠĠĠĠĠ Ġir Call ( writer ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġir Get ( parcel ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( 0 , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ // ĠSerialize Ġa Ġvalue Ġof Ġthe Ġprimitive Ġtype Ġ[ parcel Type ] Ġby Ġwrapping Ġthe Ġgiven Ġ[ serializer ] Ġwith Ġcast s . Ċ class ĠIr Wrapped Primitive Parcel Serializer ( private Ġval Ġparcel Type : ĠIr Type , Ġprivate Ġval Ġserializer : ĠIr Parcel Serializer ) Ġ: ĠIr Parcel Serializer Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠAndroid Ir Builder . read Parcel ( parcel : ĠIr Value Declaration ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdeserialized Primitive Ġ= Ġread Parcel With ( serializer , Ġparcel ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( parcel Type . is Boolean ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir If Then Else ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparcel Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Not Equals ( de serialized Primitive , Ġir Int ( 0 )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Int ( 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Int ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconversion Ġ= Ġdeserialized Primitive . type . getClass () !!. functions . first Ġ{ Ġfunction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . name . asString () Ġ== Ġ" to ${ parcel Type . getClass () !!. name }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir Call ( conversion ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġdeserialized Primitive ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠIr Builder With Scope . ir Cast IfNeeded ( expression : ĠIr Expression , Ġir Type : ĠIr Type ): ĠIr Expression Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( expression . type Ġ== Ġir Type ) Ġexpression Ġelse Ġir As ( expression , Ġir Type ) ĊĊĠĠĠ Ġoverride Ġfun ĠAndroid Ir Builder . write Parcel ( parcel : ĠIr Value Declaration , Ġflags : ĠIr Value Declaration , Ġvalue : ĠIr Expression ): ĠIr Expression Ġ= ĊĠĠĠĠĠĠĠ Ġwrite Parcel With ( serializer , Ġparcel , Ġflags , Ġir Cast IfNeeded ( value , Ġparcel Type )) Ċ } Ċ Ċ // ĠWrap s Ġa Ġnon - null Ġaware Ġparcel er Ġto Ġhandle Ġnullable Ġtypes . Ċ class ĠIr Null Aware Parcel Serializer ( private Ġval Ġserializer : ĠIr Parcel Serializer ) Ġ: ĠIr Parcel Serializer Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠAndroid Ir Builder . read Parcel ( parcel : ĠIr Value Declaration ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnon Null Result Ġ= Ġread Parcel With ( serializer , Ġparcel ) ĊĠĠĠĠĠĠĠ Ġreturn Ġir If Then Else ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnon Null Result . type . make Nullable (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir Equals ( parcel ReadInt ( ir Get ( parcel )), Ġir Int ( 0 )), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir Null (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnon Null Result ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠAndroid Ir Builder . write Parcel ( parcel : ĠIr Value Declaration , Ġflags : ĠIr Value Declaration , Ġvalue : ĠIr Expression ): ĠIr Expression Ġ= ĊĠĠĠĠĠĠĠ Ġir Let S ( value ) Ġ{ Ġir Value Symbol Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir If Null ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . ir Built Ins . unit Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Get ( ir Value Symbol . owner ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparcel Write Int ( ir Get ( parcel ), Ġir Int ( 0 )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Block Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ parcel Write Int ( ir Get ( parcel ), Ġir Int ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ write Parcel With ( serializer , Ġparcel , Ġflags , Ġir Get ( ir Value Symbol . owner )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ // ĠParcel Ġserializer Ġfor Ġobject Ġclasses . ĠWe Ġavoid Ġempty Ġparcel s Ġby Ġwriting Ġa Ġdummy Ġvalue . ĠNot Ġnull - safe . Ċ class ĠIr Object Parcel Serializer ( val Ġobject Class : ĠIr Class ) Ġ: ĠIr Parcel Serializer Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠAndroid Ir Builder . read Parcel ( parcel : ĠIr Value Declaration ): ĠIr Expression Ġ= ĊĠĠĠĠĠĠĠ Ġ// ĠAvoid Ġempty Ġparcel s ĊĠĠĠĠĠĠĠ Ġir Block Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+ parcel ReadInt ( ir Get ( parcel )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir GetObject ( object Class . symbol ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠAndroid Ir Builder . write Parcel ( parcel : ĠIr Value Declaration , Ġflags : ĠIr Value Declaration , Ġvalue : ĠIr Expression ): ĠIr Expression Ġ= ĊĠĠĠĠĠĠĠ Ġparcel Write Int ( ir Get ( parcel ), Ġir Int ( 1 )) Ċ } Ċ Ċ // ĠParcel Ġserializer Ġfor Ġclasses Ġwith Ġa Ġdefault Ġconstructor . ĠWe Ġavoid Ġempty Ġparcel s Ġby Ġwriting Ġa Ġdummy Ġvalue . ĠNot Ġnull - safe . Ċ class ĠIr No Parameter Class Parcel Serializer ( val Ġir Class : ĠIr Class ) Ġ: ĠIr Parcel Serializer Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠAndroid Ir Builder . read Parcel ( parcel : ĠIr Value Declaration ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdefault Constructor Ġ= Ġir Class . primary Constructor !! ĊĠĠĠĠĠĠĠ Ġreturn Ġir Block Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+ parcel ReadInt ( ir Get ( parcel )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Call ( default Constructor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠAndroid Ir Builder . write Parcel ( parcel : ĠIr Value Declaration , Ġflags : ĠIr Value Declaration , Ġvalue : ĠIr Expression ): ĠIr Expression Ġ= ĊĠĠĠĠĠĠĠ Ġparcel Write Int ( ir Get ( parcel ), Ġir Int ( 1 )) Ċ } Ċ Ċ // ĠParcel Ġserializer Ġfor Ġenum Ġclasses . ĠNot Ġnull - safe . Ċ class ĠIr Enum Parcel Serializer ( val Ġenum Class : ĠIr Class ) Ġ: ĠIr Parcel Serializer Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠAndroid Ir Builder . read Parcel ( parcel : ĠIr Value Declaration ): ĠIr Expression Ġ= ĊĠĠĠĠĠĠĠ Ġir Call ( enum ValueOf ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( 0 , Ġparcel ReadString ( ir Get ( parcel ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠAndroid Ir Builder . write Parcel ( parcel : ĠIr Value Declaration , Ġflags : ĠIr Value Declaration , Ġvalue : ĠIr Expression ): ĠIr Expression Ġ= ĊĠĠĠĠĠĠĠ Ġparcel WriteString ( ir Get ( parcel ), Ġir Call ( enum Name ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠ Ġprivate Ġval Ġenum ValueOf : ĠIr Function Symbol Ġ= ĊĠĠĠĠĠĠĠ Ġenum Class . functions . single Ġ{ Ġfunction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . name . asString () Ġ== Ġ" valueOf " Ġ&& Ġfunction . dispatch Receiver Parameter Ġ== Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġfunction . extension Receiver Parameter Ġ== Ġnull Ġ&& Ġfunction . value Parameters . size Ġ== Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġfunction . value Parameters . single (). type . isString () ĊĠĠĠĠĠĠĠ Ġ}. symbol ĊĊĠĠĠ Ġprivate Ġval Ġenum Name : ĠIr Function Symbol Ġ= ĊĠĠĠĠĠĠĠ Ġenum Class . getProperty Getter (" name ") !! Ċ } Ċ Ċ // ĠParcel Ġserializer Ġfor Ġthe Ġjava ĠCharSequence Ġinterface . Ċ class ĠIr CharSequence Parcel Serializer Ġ: ĠIr Parcel Serializer Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠAndroid Ir Builder . read Parcel ( parcel : ĠIr Value Declaration ): ĠIr Expression Ġ= ĊĠĠĠĠĠĠĠ Ġparcel able Creator CreateFrom Parcel ( getText Utils CharSequence Creator (), Ġir Get ( parcel )) ĊĊĠĠĠ Ġoverride Ġfun ĠAndroid Ir Builder . write Parcel ( parcel : ĠIr Value Declaration , Ġflags : ĠIr Value Declaration , Ġvalue : ĠIr Expression ): ĠIr Expression Ġ= ĊĠĠĠĠĠĠĠ Ġtext Utils WriteTo Parcel ( value , Ġir Get ( parcel ), Ġir Get ( flags )) Ċ } Ċ Ċ // ĠParcel Ġserializer Ġfor ĠParcel ables Ġin Ġthe Ġsame Ġmodule , Ġwhich Ġaccesses Ġthe ĠwriteTo Parcel / createFrom Parcel Ġmethods Ġwithout Ġreflection . Ċ class ĠIr E fficient Parcelable Parcel Serializer ( private Ġval Ġir Class : ĠIr Class ) Ġ: ĠIr Parcel Serializer Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠAndroid Ir Builder . read Parcel ( parcel : ĠIr Value Declaration ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcreator : ĠIr Expression Ġ= Ġir Class . fields . find Ġ{ Ġit . name Ġ== ĠCRE ATOR _ NAME Ġ} ?. let Ġ{ Ġcreator Field Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir GetField ( null , Ġcreator Field ) ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġir Call ( ir Class . creator Getter !! ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġir GetObject (( ir Class . comp anion Object () !! Ġas ĠIr Class ). symbol ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġparcel able Creator CreateFrom Parcel ( creator , Ġir Get ( parcel )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠAndroid Ir Builder . write Parcel ( parcel : ĠIr Value Declaration , Ġflags : ĠIr Value Declaration , Ġvalue : ĠIr Expression ): ĠIr Expression Ġ= ĊĠĠĠĠĠĠĠ Ġparcel able WriteTo Parcel ( ir Class , Ġvalue , Ġir Get ( parcel ), Ġir Get ( flags )) Ċ } Ċ Ċ // ĠParcel Ġserializer Ġfor ĠParcel ables Ġusing Ġreflection . Ċ // ĠThis Ġneeds Ġa Ġreference Ġto Ġthe Ġparcel ize Ġtype Ġitself Ġin Ġorder Ġto Ġfind Ġthe Ġcorrect Ġclass Ġloader Ġto Ġuse , Ġsee ĠK T - 2 0 0 2 7 . Ċ class ĠIr Generic Parcelable Parcel Serializer ( private Ġval Ġparcel ize Type : ĠIr Type ) Ġ: ĠIr Parcel Serializer Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠAndroid Ir Builder . read Parcel ( parcel : ĠIr Value Declaration ): ĠIr Expression Ġ= ĊĠĠĠĠĠĠĠ Ġparcel Read Parcelable ( ir Get ( parcel ), Ġclass Get ClassLoader ( java Class Reference ( parcel ize Type ))) ĊĊĠĠĠ Ġoverride Ġfun ĠAndroid Ir Builder . write Parcel ( parcel : ĠIr Value Declaration , Ġflags : ĠIr Value Declaration , Ġvalue : ĠIr Expression ): ĠIr Expression Ġ= ĊĠĠĠĠĠĠĠ Ġparcel Write Parcelable ( ir Get ( parcel ), Ġvalue , Ġir Get ( flags )) Ċ } Ċ Ċ // ĠF allback Ġparcel Ġserializer Ġfor Ġunknown Ġtypes Ġusing ĠParcel . readValue / writeValue . Ċ // ĠThis Ġneeds Ġa Ġreference Ġto Ġthe Ġparcel ize Ġtype Ġitself Ġin Ġorder Ġto Ġfind Ġthe Ġcorrect Ġclass Ġloader Ġto Ġuse , Ġsee ĠK T - 2 0 0 2 7 . Ċ class ĠIr Generic Value Parcel Serializer ( private Ġval Ġparcel ize Type : ĠIr Type ) Ġ: ĠIr Parcel Serializer Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠAndroid Ir Builder . read Parcel ( parcel : ĠIr Value Declaration ): ĠIr Expression Ġ= ĊĠĠĠĠĠĠĠ Ġparcel Read Value ( ir Get ( parcel ), Ġclass Get ClassLoader ( java Class Reference ( parcel ize Type ))) ĊĊĠĠĠ Ġoverride Ġfun ĠAndroid Ir Builder . write Parcel ( parcel : ĠIr Value Declaration , Ġflags : ĠIr Value Declaration , Ġvalue : ĠIr Expression ): ĠIr Expression Ġ= ĊĠĠĠĠĠĠĠ Ġparcel Write Value ( ir Get ( parcel ), Ġvalue ) Ċ } Ċ Ċ // ĠParcel Ġserializer Ġusing Ġa Ġcustom ĠParcel er Ġobject . Ċ class ĠIr Custom Parcel Serializer ( private Ġval Ġparcel er Object : ĠIr Class ) Ġ: ĠIr Parcel Serializer Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠAndroid Ir Builder . read Parcel ( parcel : ĠIr Value Declaration ): ĠIr Expression Ġ= ĊĠĠĠĠĠĠĠ Ġparcel er Create ( parcel er Object , Ġparcel ) ĊĊĠĠĠ Ġoverride Ġfun ĠAndroid Ir Builder . write Parcel ( parcel : ĠIr Value Declaration , Ġflags : ĠIr Value Declaration , Ġvalue : ĠIr Expression ): ĠIr Expression Ġ= ĊĠĠĠĠĠĠĠ Ġparcel er Write ( parcel er Object , Ġparcel , Ġflags , Ġvalue ) Ċ } Ċ Ċ // ĠParcel Ġserializer Ġfor Ġarray Ġtypes . ĠThis Ġhandles Ġboth Ġprimitive Ġarray Ġtypes Ġ( for ĠShort Array Ġand Ġfor Ġprimitive Ġarrays Ġusing Ġcustom Ġelement Ċ // Ġparcel ers ) Ġas Ġwell Ġas Ġbox ed Ġarrays . Ċ // ĠTODO : ĠUnsigned Ġarray Ġtypes Ċ class ĠIr Array Parcel Serializer ( ĊĠĠĠ Ġprivate Ġval Ġarray Type : ĠIr Type , ĊĠĠĠ Ġprivate Ġval Ġelement Type : ĠIr Type , ĊĠĠĠ Ġprivate Ġval Ġelement Serializer : ĠIr Parcel Serializer Ċ ) Ġ: ĠIr Parcel Serializer Ġ{ ĊĠĠĠ Ġprivate Ġfun ĠAndroid Ir Builder . new Array ( size : ĠIr Expression ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarray Constructor : ĠIr Function Symbol Ġ= Ġif Ġ( array Type . is Boxed Array ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid Symbols . array Of Null s ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarray Type . class OrNull !!. construct ors . single Ġ{ Ġit . owner . value Parameters . size Ġ== Ġ 1 Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġir Call ( array Constructor , Ġarray Type ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Arguments Count Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Type Argument ( 0 , Ġelement Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( 0 , Ġsize ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠAndroid Ir Builder . read Parcel ( parcel : ĠIr Value Declaration ): ĠIr Expression Ġ= ĊĠĠĠĠĠĠĠ Ġir Block Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarray Size Ġ= Ġir Temporary ( parcel ReadInt ( ir Get ( parcel ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarray Temporary Ġ= Ġir Temporary ( new Array ( ir Get ( array Size ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Until ( ir Get ( array Size )) Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsetter Ġ= Ġarray Type . class OrNull !!. getSimple Function (" set ") !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Call ( setter ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġir Get ( array Temporary ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( 0 , Ġir Get ( index )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( 1 , Ġread Parcel With ( element Serializer , Ġparcel )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Get ( array Temporary ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠAndroid Ir Builder . write Parcel ( parcel : ĠIr Value Declaration , Ġflags : ĠIr Value Declaration , Ġvalue : ĠIr Expression ): ĠIr Expression Ġ= ĊĠĠĠĠĠĠĠ Ġir Block Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarray Temporary Ġ= Ġir Temporary ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarray Size Symbol Ġ= Ġarray Type . class OrNull !!. getProperty Getter (" size ") !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarray Size Ġ= Ġir Temporary ( ir Call ( array Size Symbol ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġir Get ( array Temporary ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+ parcel Write Int ( ir Get ( parcel ), Ġir Get ( array Size )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Until ( ir Get ( array Size )) Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgetter Ġ= Ġcontext . ir Built Ins . array Class . getSimple Function (" get ") !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġir Call ( getter ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġir Get ( array Temporary ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( 0 , Ġir Get ( index )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ write Parcel With ( element Serializer , Ġparcel , Ġflags , Ġelement ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ // ĠParcel Ġserializer Ġfor Ġandroid ĠSparse Arrays . ĠNote Ġthat Ġthis Ġalso Ġneeds Ġto Ġhandle ĠBoolean Sparse Array , Ġin Ġcase Ġof Ġa Ġcustom Ġelement Ġparcel er . Ċ class ĠIr Sparse Array Parcel Serializer ( ĊĠĠĠ Ġprivate Ġval Ġsparse Array Class : ĠIr Class , ĊĠĠĠ Ġprivate Ġval Ġelement Type : ĠIr Type , ĊĠĠĠ Ġprivate Ġval Ġelement Serializer : ĠIr Parcel Serializer Ċ ) Ġ: ĠIr Parcel Serializer Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠAndroid Ir Builder . read Parcel ( parcel : ĠIr Value Declaration ): ĠIr Expression Ġ= ĊĠĠĠĠĠĠĠ Ġir Block Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremaining Size Temporary Ġ= Ġir Temporary Var ( parcel ReadInt ( ir Get ( parcel ))) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsparse Array Constructor Ġ= Ġsparse Array Class . construct ors . first Ġ{ Ġir Constructor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Constructor . value Parameters . size Ġ== Ġ 1 Ġ&& Ġir Constructor . value Parameters . single (). type . is Int () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconstructor Call Ġ= Ġif Ġ( sparse Array Class . type Parameters . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Call ( sparse Array Constructor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Call Constructor ( sparse Array Constructor . symbol , ĠlistOf ( elementType )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarray Temporary Ġ= Ġir Temporary ( constructor Call . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( 0 , Ġir Get ( remaining Size Temporary )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir While (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcondition Ġ= Ġir Not Equals ( ir Get ( remaining Size Temporary ), Ġir Int ( 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= Ġir Block Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsparse Array Put Ġ= Ġsparse Array Class . functions . first Ġ{ Ġfunction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . name . asString () Ġ== Ġ" put " Ġ&& Ġfunction . value Parameters . size Ġ== Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Call ( sparse Array Put ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġir Get ( array Temporary ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( 0 , Ġparcel ReadInt ( ir Get ( parcel ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( 1 , Ġread Parcel With ( element Serializer , Ġparcel )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdec Ġ= Ġcontext . ir Built Ins . int Class . getSimple Function (" dec ") !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Set Var ( remaining Size Temporary . symbol , Ġir Call ( dec ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġir Get ( remaining Size Temporary ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Get ( array Temporary ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠAndroid Ir Builder . write Parcel ( parcel : ĠIr Value Declaration , Ġflags : ĠIr Value Declaration , Ġvalue : ĠIr Expression ): ĠIr Expression Ġ= ĊĠĠĠĠĠĠĠ Ġir Block Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Function Ġ= Ġsparse Array Class . functions . first Ġ{ Ġfunction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . name . asString () Ġ== Ġ" size " Ġ&& Ġfunction . value Parameters . isEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey At Function Ġ= Ġsparse Array Class . functions . first Ġ{ Ġfunction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . name . asString () Ġ== Ġ" key At " Ġ&& Ġfunction . value Parameters . size Ġ== Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue At Function Ġ= Ġsparse Array Class . functions . first Ġ{ Ġfunction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . name . asString () Ġ== Ġ" value At " Ġ&& Ġfunction . value Parameters . size Ġ== Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarray Temporary Ġ= Ġir Temporary ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Temporary Ġ= Ġir Temporary ( ir Call ( size Function ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġir Get ( array Temporary ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+ parcel Write Int ( ir Get ( parcel ), Ġir Get ( size Temporary )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Until ( ir Get ( size Temporary )) Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ parcel Write Int ( ir Get ( parcel ), Ġir Call ( key At Function ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġir Get ( array Temporary ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( 0 , Ġir Get ( index )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ write Parcel With ( element Serializer , Ġparcel , Ġflags , Ġir Call ( value At Function ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġir Get ( array Temporary ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( 0 , Ġir Get ( index )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ // ĠParcel Ġserializer Ġfor Ġall Ġlists Ġsupported Ġby ĠParcel ize . ĠList Ġinterfaces Ġuse Ġhard - coded Ġdefault Ġimplementations Ġfor Ġde serialization . Ċ // ĠList Ġmaps Ġto ĠArrayList , ĠSet Ġmaps Ġto ĠLinked HashSet , ĠNavig able Set Ġand ĠSorted Set Ġmap Ġto ĠTree Set . Ċ class ĠIr List Parcel Serializer ( private Ġval Ġir Class : ĠIr Class , Ġprivate Ġval Ġelement Serializer : ĠIr Parcel Serializer ) Ġ: ĠIr Parcel Serializer Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠAndroid Ir Builder . write Parcel ( parcel : ĠIr Value Declaration , Ġflags : ĠIr Value Declaration , Ġvalue : ĠIr Expression ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsize Function Ġ= Ġir Class . getProperty Getter (" size ") !! ĊĠĠĠĠĠĠĠ Ġval Ġiterator Function Ġ= Ġir Class . getMethod Without Arguments (" iterator ") ĊĠĠĠĠĠĠĠ Ġval Ġiterator Class Ġ= Ġiterator Function . returnType . er ased Upper Bound ĊĠĠĠĠĠĠĠ Ġval Ġiterator Has Next Ġ= Ġiterator Class . getMethod Without Arguments (" hasNext ") ĊĠĠĠĠĠĠĠ Ġval Ġiterator Next Ġ= Ġiterator Class . getMethod Without Arguments (" next ") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġir Block Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġir Temporary ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+ parcel Write Int ( ir Get ( parcel ), Ġir Call ( size Function ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġir Get ( list ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiterator Ġ= Ġir Temporary ( ir Call ( iterator Function ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġir Get ( list ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir While (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcondition Ġ= Ġir Call ( iterator Has Next ). apply Ġ{ Ġdispatch Receiver Ġ= Ġir Get ( iterator ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= Ġwrite Parcel With ( element Serializer , Ġparcel , Ġflags , Ġir Call ( iterator Next ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġir Get ( iterator ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlist Symbols ( symbols : ĠAndroid Symbols ): ĠPair < Ir Constructor Symbol , ĠIr Simple Function Symbol > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe ĠIr Class Ġrefers Ġto Ġa Ġconcrete Ġtype , Ġtry Ġto Ġfind Ġa Ġconstructor Ġwith Ġcap act iy Ġor Ġfall Ġback ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġthe Ġdefault Ġconstructor Ġif Ġnone Ġexist . ĊĠĠĠĠĠĠĠ Ġif Ġ(! ir Class . is Jvm Interface ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconstructor Ġ= Ġir Class . construct ors . find Ġ{ Ġconstructor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor . value Parameters . size Ġ== Ġ 1 Ġ&& Ġconstructor . value Parameters . single (). type . is Int () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġir Class . construct ors . first Ġ{ Ġconstructor Ġ-> Ġconstructor . value Parameters . isEmpty () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadd Ġ= Ġir Class . functions . first Ġ{ Ġfunction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . name . asString () Ġ== Ġ" add " Ġ&& Ġfunction . value Parameters . size Ġ== Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġconstructor . symbol Ġto Ġadd . symbol ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( ir Class . fq Name When Available ?. asString ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" kotlin . collections . Mutable List ", Ġ" kotlin . collections . List ", Ġ" java . util . List " Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbols . array List Constructor Ġto Ġsymbols . array List Add ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" kotlin . collections . Mutable Set ", Ġ" kotlin . collections . Set ", Ġ" java . util . Set " Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbols . linked HashSet Constructor Ġto Ġsymbols . linked HashSet Add ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" java . util . Navig able Set ", Ġ" java . util . Sorted Set " Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbols . tree Set Constructor Ġto Ġsymbols . tree Set Add ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Unknown Ġlist Ġinterface Ġtype : Ġ${ ir Class . render () }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠAndroid Ir Builder . read Parcel ( parcel : ĠIr Value Declaration ): ĠIr Expression Ġ= ĊĠĠĠĠĠĠĠ Ġir Block Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( constructor Symbol , Ġadd Symbol ) Ġ= Ġlist Symbols ( android Symbols ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Temporary Ġ= Ġir Temporary ( parcel ReadInt ( ir Get ( parcel ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġir Temporary ( ir Call ( constructor Symbol ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( constructor Symbol . owner . value Parameters . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( 0 , Ġir Get ( size Temporary )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Until ( ir Get ( size Temporary )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Call ( add Symbol ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġir Get ( list ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( 0 , Ġread Parcel With ( element Serializer , Ġparcel )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Get ( list ) ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ // ĠParcel Ġserializer Ġfor Ġall Ġmaps Ġsupported Ġby ĠParcel ize . ĠMap Ġinterfaces Ġuse Ġhard - coded Ġdefault Ġimplementations Ġfor Ġde serialization . Ċ // ĠMap Ġuses ĠLinkedHashMap , Ġwhile ĠNavig able Map Ġand ĠSorted Map Ġuse Ġto ĠTreeMap . Ċ class ĠIr Map Parcel Serializer ( ĊĠĠĠ Ġprivate Ġval Ġir Class : ĠIr Class , ĊĠĠĠ Ġprivate Ġval Ġkey Serializer : ĠIr Parcel Serializer , ĊĠĠĠ Ġprivate Ġval Ġvalue Serializer : ĠIr Parcel Serializer Ċ ) Ġ: ĠIr Parcel Serializer Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠAndroid Ir Builder . write Parcel ( parcel : ĠIr Value Declaration , Ġflags : ĠIr Value Declaration , Ġvalue : ĠIr Expression ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsize Function Ġ= Ġir Class . getProperty Getter (" size ") !! ĊĠĠĠĠĠĠĠ Ġval Ġentries Function Ġ= Ġir Class . getProperty Getter (" entries ") !! ĊĠĠĠĠĠĠĠ Ġval Ġentry Set Class Ġ= Ġentries Function . owner . returnType . er ased Upper Bound ĊĠĠĠĠĠĠĠ Ġval Ġiterator Function Ġ= Ġentry Set Class . getMethod Without Arguments (" iterator ") ĊĠĠĠĠĠĠĠ Ġval Ġiterator Class Ġ= Ġiterator Function . returnType . er ased Upper Bound ĊĠĠĠĠĠĠĠ Ġval Ġiterator Has Next Ġ= Ġiterator Class . getMethod Without Arguments (" hasNext ") ĊĠĠĠĠĠĠĠ Ġval Ġiterator Next Ġ= Ġiterator Class . getMethod Without Arguments (" next ") ĊĠĠĠĠĠĠĠ Ġval Ġelement Class Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( entries Function . owner . returnType Ġas ĠIr Simple Type ). arguments . single (). upper Bound ( context . ir Built Ins ). er ased Upper Bound ĊĠĠĠĠĠĠĠ Ġval Ġelement Key Ġ= Ġelement Class . getProperty Getter (" key ") !! ĊĠĠĠĠĠĠĠ Ġval Ġelement Value Ġ= Ġelement Class . getProperty Getter (" value ") !! ĊĊĠĠĠĠĠĠĠ Ġreturn Ġir Block Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġir Temporary ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+ parcel Write Int ( ir Get ( parcel ), Ġir Call ( size Function ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġir Get ( list ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiterator Ġ= Ġir Temporary ( ir Call ( iterator Function ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġir Call ( entries Function ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġir Get ( list ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir While (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcondition Ġ= Ġir Call ( iterator Has Next ). apply Ġ{ Ġdispatch Receiver Ġ= Ġir Get ( iterator ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= Ġir Block Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġir Temporary ( ir Call ( iterator Next ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġir Get ( iterator ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ write Parcel With ( key Serializer , Ġparcel , Ġflags , Ġir Call ( element Key ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġir Get ( element ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ write Parcel With ( value Serializer , Ġparcel , Ġflags , Ġir Call ( element Value ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġir Get ( element ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmap Symbols ( symbols : ĠAndroid Symbols ): ĠPair < Ir Constructor Symbol , ĠIr Simple Function Symbol > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe ĠIr Class Ġrefers Ġto Ġa Ġconcrete Ġtype , Ġtry Ġto Ġfind Ġa Ġconstructor Ġwith Ġcap act iy Ġor Ġfall Ġback ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġthe Ġdefault Ġconstructor Ġif Ġnone Ġexist . ĊĠĠĠĠĠĠĠ Ġif Ġ(! ir Class . is Jvm Interface ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconstructor Ġ= Ġir Class . construct ors . find Ġ{ Ġconstructor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor . value Parameters . size Ġ== Ġ 1 Ġ&& Ġconstructor . value Parameters . single (). type . is Int () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġir Class . construct ors . find Ġ{ Ġconstructor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor . value Parameters . isEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} !! ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġput Ġ= Ġir Class . functions . first Ġ{ Ġfunction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . name . asString () Ġ== Ġ" put " Ġ&& Ġfunction . value Parameters . size Ġ== Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġconstructor . symbol Ġto Ġput . symbol ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( ir Class . fq Name When Available ?. asString ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" kotlin . collections . Mutable Map ", Ġ" kotlin . collections . Map ", Ġ" java . util . Map " Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbols . linked HashMap Constructor Ġto Ġsymbols . linked HashMap Put ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" java . util . Sorted Map ", Ġ" java . util . Navig able Map " Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbols . tree Map Constructor Ġto Ġsymbols . tree Map Put ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Unknown Ġmap Ġinterface Ġtype : Ġ${ ir Class . render () }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠAndroid Ir Builder . read Parcel ( parcel : ĠIr Value Declaration ): ĠIr Expression Ġ= ĊĠĠĠĠĠĠĠ Ġir Block Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( constructor Symbol , Ġput Symbol ) Ġ= Ġmap Symbols ( android Symbols ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Temporary Ġ= Ġir Temporary ( parcel ReadInt ( ir Get ( parcel ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġir Temporary ( ir Call ( constructor Symbol ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( constructor Symbol . owner . value Parameters . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( 0 , Ġir Get ( size Temporary )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Until ( ir Get ( size Temporary )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Call ( put Symbol ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġir Get ( map ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( 0 , Ġread Parcel With ( key Serializer , Ġparcel )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( 1 , Ġread Parcel With ( value Serializer , Ġparcel )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Get ( map ) ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ