package Ġcom . ram cost a . compose dest inations . codegen . writ ers Ċ Ċ import Ġcom . ram cost a . compose dest inations . codegen . code Gen Base PackageName Ċ import Ġcom . ram cost a . compose dest inations . codegen . commons . CORE _ PACKAGE _ NAME Ċ import Ġcom . ram cost a . compose dest inations . codegen . commons . is Complex Type Nav Arg Ċ import Ġcom . ram cost a . compose dest inations . codegen . commons . plus Assign Ċ import Ġcom . ram cost a . compose dest inations . codegen . fac ades . Code OutputStream Maker Ċ import Ġcom . ram cost a . compose dest inations . codegen . fac ades . Logger Ċ import Ġcom . ram cost a . compose dest inations . codegen . model .* Ċ import Ġcom . ram cost a . compose dest inations . codegen . templates .* Ċ import Ġjava . io . OutputStream Ċ import Ġjava . util .* Ċ Ċ class ĠCustom Nav Types Writer ( ĊĠĠĠ Ġprivate Ġval Ġcode Generator : ĠCode OutputStream Maker , ĊĠĠĠ Ġprivate Ġval Ġlogger : ĠLogger Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġtypes For Nav TypeName : ĠMutable Map < Custom Nav Type , ĠClass Type > Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġfun Ġwrite ( ĊĠĠĠĠĠĠĠ Ġdest inations : ĠList < Destination Generating Params With Nav Args >, ĊĠĠĠĠĠĠĠ Ġnav Type Serial izers : ĠList < Nav Type Serializer > ĊĠĠĠ Ġ): ĠMap < ClassType , ĠCustom Nav Type > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġserializers ByType : ĠMap < ClassType , ĠNav Type Serializer > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav Type Serial izers . associate By Ġ{ Ġit . generic Type Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġall Nav Type Params : ĠSet < Type > Ġ= Ġdest inations ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . nav Args ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . is Complex Type Nav Arg () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// we Ġdon 't Ġwant Ġto Ġconsider Ġtypes Ġdifferent Ġdue Ġto Ġdifferent Ġnull ability Ġhere ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . type . copy ( is Nullable Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatten () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toSet () ĊĊĠĠĠĠĠĠĠ Ġall Nav Type Params ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġwe Ġhave Ġmultiple Ġclasses Ġwith Ġequal Ġsimple Ġname , Ġordering Ġby Ġthe Ġpackage Ġlength , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwill Ġmake Ġit Ġso Ġwe Ġfirst Ġcreate Ġthe Ġone Ġwith Ġthe Ġsimplest Ġpackage Ġname , Ġthen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġother Ġone Ġwill Ġhave Ġa Ġmore Ġmeaningful Ġname Ġde duced Ġfrom Ġthe Ġpackage Ġ( since Ġit Ġis Ġlonger ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĠsortBy Ġ{ Ġit . class Type . qualified Name . length Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġtype Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype . generate Custom Nav Type ( serializers ByType [ type . class Type ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtypes For Nav TypeName . entries . associate Ġ{ Ġit . value Ġto Ġit . key Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠType . generate Custom Nav Type ( nav Type Serializer : ĠNav Type Serializer ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnav TypeName Ġ= Ġget Nav TypeName () ĊĊĠĠĠĠĠĠĠ Ġval ĠclassName Ġ= Ġnav TypeName . replace First Char Ġ{ Ġit . uppercase ( Locale . US ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġout : ĠOutputStream Ġ= Ġcode Generator . make File ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠclassName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ code Gen Base PackageName . nav type ", ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġtypes For Nav TypeName [ Custom Nav Type ( nav TypeName , Ġnav Type Serializer )] Ġ= Ġclass Type ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Serializable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Serializable Custom Nav Type ( className , Ġnav Type Serializer , Ġout , Ġnav TypeName ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( is Parcelable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Parcelable Custom Nav Type ( className , Ġnav Type Serializer , Ġout , Ġnav TypeName ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠType . generate Serializable Custom Nav Type ( ĊĠĠĠĠĠĠĠ Ġnav Type ClassName : ĠString , ĊĠĠĠĠĠĠĠ Ġnav Type Serializer : ĠNav Type Serializer ?, ĊĠĠĠĠĠĠĠ Ġout : ĠOutputStream , ĊĠĠĠĠĠĠĠ Ġnav TypeName : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġout Ġ+= Ġserial izable Nav Type Template ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( NAV _ TYPE _ NAME , Ġnav TypeName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( NAV _ TYPE _ CLASS _ SIMPLE _ NAME , Ġnav Type ClassName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSERIAL IZER _ SIMPLE _ CLASS _ NAME , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserial izable Nav Type Serializer Code ( nav Type Serializer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( CLASS _ SIMPLE _ NAME _ C AME L _ CASE , Ġclass Type . simple Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPAR SE _ VALUE _ CAST _ TO _ CLASS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( nav Type Serializer Ġ== Ġnull ) Ġ" Ġas Ġ${ class Type . simple Name }" Ġelse Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSERIAL IZE _ VALUE _ CAST _ TO _ CLASS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( nav Type Serializer Ġ== Ġnull ) Ġ"" Ġelse Ġ" Ġas Ġ${ class Type . simple Name }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDEST IN ATIONS _ NAV _ TYPE _ SERIAL IZER _ TYPE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( nav Type Serializer Ġ== Ġnull ) Ġ" Serializable " Ġelse Ġclass Type . simple Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( AD DITION AL _ IMPORT S , Ġserial izable Additional Imports ( this , Ġnav Type Serializer )) ĊĊĠĠĠĠĠĠĠ Ġout . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠType . generate Parcelable Custom Nav Type ( ĊĠĠĠĠĠĠĠ Ġnav Type ClassName : ĠString , ĊĠĠĠĠĠĠĠ Ġnav Type Serializer : ĠNav Type Serializer ?, ĊĠĠĠĠĠĠĠ Ġout : ĠOutputStream , ĊĠĠĠĠĠĠĠ Ġnav TypeName : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġout Ġ+= Ġparcel able Nav Type Template ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( NAV _ TYPE _ NAME , Ġnav TypeName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( NAV _ TYPE _ CLASS _ SIMPLE _ NAME , Ġnav Type ClassName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSERIAL IZER _ SIMPLE _ CLASS _ NAME , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparcel able Nav Type Serializer Code ( nav Type Serializer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( CLASS _ SIMPLE _ NAME _ C AME L _ CASE , Ġclass Type . simple Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPAR SE _ VALUE _ CAST _ TO _ CLASS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( nav Type Serializer Ġ== Ġnull ) Ġ" Ġas Ġ${ class Type . simple Name }" Ġelse Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSERIAL IZE _ VALUE _ CAST _ TO _ CLASS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( nav Type Serializer Ġ== Ġnull ) Ġ"" Ġelse Ġ" Ġas Ġ${ class Type . simple Name }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDEST IN ATIONS _ NAV _ TYPE _ SERIAL IZER _ TYPE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( nav Type Serializer Ġ== Ġnull ) Ġ" Parcelable " Ġelse Ġclass Type . simple Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( AD DITION AL _ IMPORT S , Ġparcel able Additional Imports ( this , Ġnav Type Serializer )) ĊĊĠĠĠĠĠĠĠ Ġout . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparcel able Nav Type Serializer Code ( nav Type Serializer : ĠNav Type Serializer ?): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( nav Type Serializer Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" Default Parcelable Nav Type Serializer ()" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsimple Name Ġ= Ġnav Type Serializer . serializer Type . simple Name ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( nav Type Serializer . class Kind Ġ== ĠClass Kind . CLASS ) Ġ"$ simple Name ()" Ġelse Ġsimple Name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġserial izable Nav Type Serializer Code ( nav Type Serializer : ĠNav Type Serializer ?): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( nav Type Serializer Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" Default Serializable Nav Type Serializer ()" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsimple Name Ġ= Ġnav Type Serializer . serializer Type . simple Name ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( nav Type Serializer . class Kind Ġ== ĠClass Kind . CLASS ) Ġ"$ simple Name ()" Ġelse Ġsimple Name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparcel able Additional Imports ( ĊĠĠĠĠĠĠĠ Ġtype : ĠType , ĊĠĠĠĠĠĠĠ Ġcustom Serializer : ĠNav Type Serializer ? ĊĠĠĠ Ġ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġimports Ġ= Ġ"\ n import Ġ${ type . class Type . qualified Name }" ĊĠĠĠĠĠĠĠ Ġimports Ġ+= Ġif Ġ( custom Serializer Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ n import Ġ${ custom Serializer . serializer Type . qualified Name }" ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ n import Ġ$ CORE _ PACKAGE _ NAME . nav args . parcel able . Default Parcelable Nav Type Serializer " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġimports ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġserial izable Additional Imports ( ĊĠĠĠĠĠĠĠ Ġtype : ĠType , ĊĠĠĠĠĠĠĠ Ġcustom Serializer : ĠNav Type Serializer ? ĊĠĠĠ Ġ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġimports Ġ= Ġ"\ n import Ġ${ type . class Type . qualified Name }" ĊĠĠĠĠĠĠĠ Ġimports Ġ+= Ġif Ġ( custom Serializer Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ n import Ġ${ custom Serializer . serializer Type . qualified Name }" ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ n import Ġ$ CORE _ PACKAGE _ NAME . nav args . serial izable . Default Serializable Nav Type Serializer " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġimports ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠType . get Nav TypeName (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnav TypeName Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ class Type . simple Name . replace First Char Ġ{ Ġit . lowercase ( Locale . US ) Ġ}} Nav Type " ĊĊĠĠĠĠĠĠĠ Ġval Ġduplicate Type Ġ= Ġtypes For Nav TypeName . entries . find Ġ{ Ġit . key . name Ġ== Ġnav TypeName Ġ} ?. value ĊĊĠĠĠĠĠĠĠ Ġval Ġprefix Ġ= Ġif Ġ( duplicate Type Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġqualified Name Parts Ġ= Ġclass Type . qualified Name . split (". "). reversed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġduplicate QualifiedName Parts Ġ= Ġduplicate Type . qualified Name . split (". "). reversed () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfound : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( qualified Name Part Ġin Ġqualified Name Parts . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( qualified Name Part . value Ġ!= Ġduplicate QualifiedName Parts [ qualified Name Part . index ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfound Ġ= Ġqualified Name Part . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfound !! ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġprefix Ġ+ Ġif Ġ( prefix . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav TypeName . replace First Char Ġ{ Ġit . uppercase ( Locale . US ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav TypeName ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }