/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 7 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġandroid . arch . lifecycle Ċ Ċ import Ġandroid . arch . lifecycle . model . Adapter Class Ċ import Ġandroid . arch . lifecycle . model . Event Method Ċ import Ġandroid . arch . lifecycle . model . Event MethodCall Ċ import Ġandroid . arch . lifecycle . model . Lifecycle Observer Info Ċ import Ġcom . google . auto . common . More Types Ċ import Ġcom . google . common . collect . Hash Multimap Ċ import Ġjava . util . LinkedList Ċ import Ġjavax . annotation . processing . Processing Environment Ċ import Ġjavax . lang . model . element . Type Element Ċ import Ġjavax . lang . model . type . No Type Ċ import Ġjavax . lang . model . type . Type Mirror Ċ import Ġjavax . tools . Diagnostic ĊĊ Ċ private Ġfun Ġsuper Observer s ( world : ĠMap < Type Element , ĠLifecycle Observer Info >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver : ĠLifecycle Observer Info ): ĠList < Lifecycle Observer Info > Ġ{ ĊĠĠĠ Ġval Ġstack Ġ= ĠLinkedList < Type Mirror >() ĊĠĠĠ Ġstack Ġ+= Ġobserver . type . interfaces . reversed () ĊĠĠĠ Ġstack Ġ+= Ġobserver . type . super class ĊĠĠĠ Ġval Ġresult Ġ= Ġmutable ListOf < Lifecycle Observer Info >() ĊĠĠĠ Ġwhile Ġ( stack . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Mirror Ġ= Ġstack . remove Last () ĊĠĠĠĠĠĠĠ Ġif Ġ( type Mirror Ġis ĠNo Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= ĠMore Types . as Type Element ( type Mirror ) ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Observer Ġ= Ġworld [ type ] ĊĠĠĠĠĠĠĠ Ġif Ġ( current Observer Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( current Observer ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack Ġ+= Ġtype . interfaces . reversed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack Ġ+= Ġtype . super class ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ private Ġfun Ġmerge And Verify Methods ( processing Env : ĠProcessing Environment , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype : ĠType Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Methods : ĠList < Event Method >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Methods : ĠList < Event Method >): ĠList < Event Method > Ġ{ ĊĠĠĠ Ġ// Ġneed Ġto Ġupdate Ġparent Ġmethods Ġlike Ġthat Ġbecause : ĊĠĠĠ Ġ// Ġ 1 . Ġvisibility Ġcan Ġbe Ġexpanded ĊĠĠĠ Ġ// Ġ 2 . Ġwe Ġwant Ġto Ġpreserve Ġorder ĊĠĠĠ Ġval Ġupdated Parent Methods Ġ= Ġparent Methods . map Ġ{ Ġparent Method Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġoverride Method Ġ= Ġclass Methods . find Ġ{ Ġ( method ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessing Env . element Utils . overrides ( method , Ġparent Method . method , Ġtype ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( override Method Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( override Method . on Lifecycle Event Ġ!= Ġparent Method . on Lifecycle Event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocessing Env . mess ager . print Message ( Diagnostic . Kind . ERROR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠError Messages . INVALID _ STATE _ OVERRIDE _ METHOD , Ġoverride Method . method ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Method ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Method ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġupdated Parent Methods Ġ+ Ġclass Methods . filter Not Ġ{ Ġupdated Parent Methods . contains ( it ) Ġ} Ċ } Ċ Ċ fun Ġflatten Observer s ( processing Env : ĠProcessing Environment , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworld : ĠMap < Type Element , ĠLifecycle Observer Info >): ĠList < Lifecycle Observer Info > Ġ{ ĊĠĠĠ Ġval Ġflatten ed : ĠMutable Map < Lifecycle Observer Info , ĠLifecycle Observer Info > Ġ= Ġmutable Map Of () ĊĠĠĠ Ġval Ġsuper Observer s Ġ= Ġworld . map Values Ġ{ Ġsuper Observer s ( world , Ġit . value ) Ġ} ĊĊĠĠĠ Ġfun Ġtraverse ( observer : ĠLifecycle Observer Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( observer Ġin Ġflatten ed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġob servers Ġ= Ġsuper Observer s [ observer . type ] !! ĊĠĠĠĠĠĠĠ Ġif Ġ( ob servers . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflatten ed [ observer ] Ġ= Ġobserver ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġob servers . filter Ġ{ Ġit Ġ! in Ġflatten ed Ġ}. forEach (:: traverse ) ĊĠĠĠĠĠĠĠ Ġval Ġmethods Ġ= Ġob servers ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map ( flatten ed :: get ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fold ( emptyList < Event Method >()) Ġ{ Ġlist , Ġparent Observer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmerge And Verify Methods ( processing Env , Ġobserver . type , Ġparent Observer !!. methods , Ġlist ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġflatten ed [ observer ] Ġ= ĠLifecycle Observer Info ( observer . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmerge And Verify Methods ( processing Env , Ġobserver . type , Ġobserver . methods , Ġmethods )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġworld . values . forEach (:: traverse ) ĊĠĠĠ Ġreturn Ġflatten ed . values . toList () Ċ } Ċ Ċ fun Ġtransform To Output ( processing Env : ĠProcessing Environment , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworld : ĠMap < Type Element , ĠLifecycle Observer Info >): ĠList < Adapter Class > Ġ{ ĊĠĠĠ Ġval Ġflat Observer s Ġ= Ġflatten Observer s ( processing Env , Ġworld ) ĊĠĠĠ Ġval Ġsynthetic Methods Ġ= ĠHash Multimap . create < Type Element , ĠEvent MethodCall >() ĊĠĠĠ Ġval Ġadapter Calls Ġ= Ġflat Observer s . map Ġ{ Ġ( type , Ġmethods ) Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġcalls Ġ= Ġmethods . map Ġ{ Ġevent Method Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexecutable Ġ= Ġevent Method . method ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type . get Package QName () Ġ!= Ġevent Method . packageName () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ( executable . is Package Private () Ġ|| Ġexecutable . is Protected ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEvent MethodCall ( event Method , Ġevent Method . type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEvent MethodCall ( event Method ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcalls . filter Ġ{ Ġit . synt hetic Access Ġ!= Ġnull Ġ}. forEach Ġ{ Ġevent Method Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynthetic Methods . put ( event Method . method . type , Ġevent Method ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtype Ġto Ġcalls ĊĠĠĠ Ġ}. toMap () ĊĊĠĠĠ Ġreturn Ġadapter Calls . map Ġ{ Ġ( type , Ġcalls ) Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġmethods Ġ= Ġsynthetic Methods . get ( type ) Ġ?: Ġset Of () ĊĠĠĠĠĠĠĠ Ġval Ġsynthetic Ġ= Ġmethods . map Ġ{ Ġevent Method Ġ-> Ġevent Method !!. method . method Ġ}. toSet () ĊĠĠĠĠĠĠĠ ĠAdapter Class ( type , Ġcalls , Ġsynthetic ) ĊĠĠĠ Ġ} Ċ } Ċ