package Ġcom . sab gil . processor . analyzer Ċ Ċ import Ġcom . sab gil . processor . common . ext .* Ċ import Ġcom . sab gil . processor . common . model .* Ċ import Ġcom . sab gil . processor . common . model . result . Annotated Class Analyze Result Ċ import Ġcom . squareup . kotlin po et . metadata . specs . to Type Spec Ċ import Ġjava . util .* Ċ import Ġjavax . annotation . processing . Processing Environment Ċ import Ġjavax . lang . model . element . Element Ċ import Ġjavax . lang . model . element . Executable Element Ċ import Ġjavax . lang . model . element . Type Element Ċ import Ġjavax . lang . model . element . Variable Element Ċ import Ġjavax . lang . model . type . Type Mirror Ċ Ċ class ĠAnnot ated Class Analyzer ( private Ġval Ġenv : ĠProcessing Environment ) Ġ{ ĊĊĠĠĠ Ġfun Ġanalyze ( annotated Element : ĠType Element ): ĠAnnot ated Class Analyze Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinheritance Type Ġ= Ġcheck Inheritance ( annotated Element ) ĊĠĠĠĠĠĠĠ Ġval Ġproperties Map Ġ= Ġcheck Properties ( annotated Element ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠAnnot ated Class Analyze Result ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAnnot ated Class ( annotated Element , Ġinheritance Type ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperties Map ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Inheritance ( annotated Element : ĠType Element ): ĠInherit ance Type Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġelement Type Mirror Ġ= Ġannotated Element . as Type () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenv . is Assignable ( elementType Mirror , Ġactivity ClassName ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInherit ance Type . ACTIVITY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenv . is Assignable ( elementType Mirror , Ġfragment ClassName ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInherit ance Type . FRAGMENT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreport Inheritance Error ( annotated Element ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Properties ( annotated Element : ĠType Element ): ĠMap < String , ĠProperty > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdelegate Fields Ġ= Ġfilter Delegate Properties ( annotated Element ) ĊĠĠĠĠĠĠĠ Ġval Ġgetters Ġ= Ġfilter Get ters ( annotated Element ) ĊĠĠĠĠĠĠĠ Ġval Ġproperties Ġ= Ġfilter Kotlin Delegate Properties ( annotated Element ) ĊĊĠĠĠĠĠĠĠ Ġval Ġproperties Map Ġ= Ġmutable Map Of < String , ĠProperty >() ĊĊĠĠĠĠĠĠĠ Ġdelegate Fields . forEach Ġ{ Ġfield Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġraw FieldName Ġ= Ġto FieldName ( field ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperty Ġ= Ġproperties . first Ġ{ Ġit . name Ġ== Ġraw FieldName Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgetter Ġ= Ġgetters . first Ġ{ Ġit . name Ġ== Ġto Getter Name ( raw FieldName ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! env . is Serializable Or Parcelable ( getter . returnType )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreport Property TypeError ( getter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperties Map [ raw FieldName ] Ġ= ĠProperty ( property , Ġfield , Ġgetter ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġproperties Map ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfilter Delegate Properties ( element : ĠType Element ): ĠList < Variable Element > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbundle Extra Holder Type Mirror Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenv . er asure ( env . parse To Type Element ( bundle Value Holder ClassName ). as Type ()) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġelement . enc losed Elements ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Is Instance < Variable Element >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . simple Name . toString (). endsWith ( DE LEG ATE _ SUFFIX ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . as Type () Ġ== Ġbundle Extra Holder Type Mirror Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfilter Get ters ( ĊĠĠĠĠĠĠĠ Ġelement : ĠType Element ĊĠĠĠ Ġ) Ġ= Ġelement . enc losed Elements . filter Is Instance < Executable Element >() ĊĊĠĠĠ Ġprivate Ġfun Ġfilter Kotlin Delegate Properties ( ĊĠĠĠĠĠĠĠ Ġelement : ĠType Element ĊĠĠĠ Ġ) Ġ= Ġelement . to Type Spec () ĊĠĠĠĠĠĠĠ Ġ. property Specs ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . deleg ated ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġto FieldName ( delegate Field : ĠElement ) Ġ= Ġdelegate Field ĊĠĠĠĠĠĠĠ Ġ. simple Name ĊĠĠĠĠĠĠĠ Ġ. remove Suffix ( DE LEG ATE _ SUFFIX ) ĊĠĠĠĠĠĠĠ Ġ. toString () ĊĊĠĠĠ Ġprivate Ġfun Ġto Getter Name ( raw FieldName : ĠString ) Ġ= Ġ" get " Ġ+ Ġraw FieldName . capitalize ( Locale . ROOT ) ĊĊĠĠĠ Ġprivate Ġfun ĠProcessing Environment . is Serializable Or Parcelable ( type : ĠType Mirror ) Ġ= ĊĠĠĠĠĠĠĠ Ġis Assignable ( type , Ġserial izable ClassName ) Ġ|| Ġis Assignable ( type , Ġparcel able ClassName ) ĊĊĠĠĠ Ġprivate Ġfun Ġreport Inheritance Error ( element : ĠElement ): ĠNothing Ġ{ ĊĠĠĠĠĠĠĠ Ġenv . error (" Safe Bundle Ġannotated Ġclass Ġmust Ġassignable Ġto Ġactivity Ġor Ġfragment ", Ġelement ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreport Property TypeError ( element : ĠElement ) Ġ{ ĊĠĠĠĠĠĠĠ Ġenv . error (" Bundle Ġproperties Ġmust Ġbe ĠSerializable Ġor ĠParcel able ", Ġelement ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDE LEG ATE _ SUFFIX Ġ= Ġ"\ $ delegate " ĊĠĠĠ Ġ} Ċ }