package Ġcom . p hel at . li ved at ad sl . processor Ċ Ċ import Ġcom . p hel at . li ved at ad sl . annotation . LiveData DSL Ċ import Ġcom . squareup . jav ap o et . ClassName Ċ import Ġcom . squareup . jav ap o et . Code Block Ċ import Ġcom . squareup . jav ap o et . Java File Ċ import Ġcom . squareup . jav ap o et . Method Spec Ċ import Ġcom . squareup . jav ap o et . Parameterized TypeName Ċ import Ġcom . squareup . jav ap o et . TypeName Ċ import Ġcom . squareup . jav ap o et . Type Spec Ċ import Ġcom . squareup . jav ap o et . Type Variable Name Ċ import Ġjava . io . IOException Ċ import Ġjava . util .* Ċ import Ġjavax . annotation . processing . Abstract Processor Ċ import Ġjavax . annotation . processing . F iler Ċ import Ġjavax . annotation . processing . Mess ager Ċ import Ġjavax . annotation . processing . Processing Environment Ċ import Ġjavax . annotation . processing . Round Environment Ċ import Ġjavax . lang . model . element . Annotation Mirror Ċ import Ġjavax . lang . model . element . Element Ċ import Ġjavax . lang . model . element . Element Kind Ċ import Ġjavax . lang . model . element . Executable Element Ċ import Ġjavax . lang . model . element . Modifier Ċ import Ġjavax . lang . model . element . Type Element Ċ import Ġjavax . lang . model . element . Variable Element Ċ import Ġjavax . lang . model . type . Declared Type Ċ import Ġjavax . lang . model . type . Type Mirror Ċ import Ġjavax . lang . model . type . Type Variable Ċ import Ġjavax . lang . model . util . Elements Ċ import Ġjavax . tools . Diagnostic Ċ Ċ abstract Ġclass ĠBase Processor Ġ: ĠAbstract Processor () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġf iler : ĠF iler ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmess ager : ĠMess ager ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġelement Utils : ĠElements ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġoverride Ġfun Ġinit ( processing Env : ĠProcessing Environment ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . init ( processing Env ) ĊĠĠĠĠĠĠĠ Ġf iler Ġ= Ġprocessing Env . filer ĊĠĠĠĠĠĠĠ Ġmess ager Ġ= Ġprocessing Env . mess ager ĊĠĠĠĠĠĠĠ Ġelement Utils Ġ= Ġprocessing Env . element Utils ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprocess ( ĊĠĠĠĠĠĠĠ Ġannotations : ĠMutable Set < out ĠType Element >, ĊĠĠĠĠĠĠĠ Ġround Environment : ĠRound Environment ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! round Environment . processing Over ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( type Element Ġin ĠgetType Elements ( round Environment . root Elements , Ġannotations )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Type Element ( type Element ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Type Element ( type Element : ĠType Element ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠpackageName Ġ= Ġelement Utils . get Package Of ( type Element ). qualified Name . toString () ĊĠĠĠĠĠĠĠ Ġval ĠtypeName Ġ= Ġtype Element . simple Name . toString () ĊĠĠĠĠĠĠĠ Ġval ĠclassName Ġ= ĠParameter ized TypeName . get ( type Element . as Type ()) ĊĠĠĠĠĠĠĠ Ġval Ġgenerated Class Ġ= ĠClass Name . get ( packageName , Ġ"${ typeName }_ DSL ") ĊĊĠĠĠĠĠĠĠ Ġval Ġclass Builder Ġ= ĠType Spec . class Builder ( generated Class ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Modifiers ( Modifier . PUBLIC ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuperclass ( className ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( className Ġis ĠParameter ized TypeName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( type Argument Ġin ĠclassName . type Arguments ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Argument Ġis ĠType Variable Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Type Variable ( type Argument ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Body Of Class ( type Element , Ġthis ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJava File . builder ( packageName , Ġclass Builder . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. writeTo ( filer ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmess ager . print Message ( Diagnostic . Kind . ERROR , Ġe . toString (), Ġtype Element ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Body Of Class ( type Element : ĠType Element , Ġclass Builder : ĠType Spec . Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġen closed Elements Ġ= Ġtype Element . enc losed Elements ĊĠĠĠĠĠĠĠ Ġen closed Elements . forEach Ġ{ Ġelement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element . kind Ġ== ĠElement Kind . CON STRUCTOR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Constructor ( element , Ġclass Builder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( element . kind Ġ== ĠElement Kind . FIELD ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate DSL s ( element , Ġclass Builder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Constructor ( element : ĠElement , Ġclass Builder : ĠType Spec . Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconstructor Ġ= Ġelement Ġas ĠExec utable Element ĊĠĠĠĠĠĠĠ Ġval Ġconstructor Parameters Ġ= Ġconstructor . parameters ĊĊĠĠĠĠĠĠĠ Ġval Ġconstructor Builder Ġ= ĠMethod Spec . constructor Builder (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Modifiers ( constructor . modifiers ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuper Call Ġ= ĠStringBuilder (" super (" ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor Parameters . forEach Indexed Ġ{ Ġindex , Ġvariable Element Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Parameter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType Name . get ( variable Element . as Type ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariable Element . simple Name . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* variable Element . modifiers . to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper Call . append ( variable Element . simple Name . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ< Ġconstructor Parameters . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper Call . append (", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper Call . append (" ); ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Code ( super Call . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġclass Builder . add Method ( constructor Builder . build ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate DSL s ( element : ĠElement , Ġclass Builder : ĠType Spec . Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvariable Ġ= Ġelement Ġas ĠVariable Element ĊĠĠĠĠĠĠĠ Ġval Ġvariable Name Ġ= Ġvariable . simple Name . toString () ĊĠĠĠĠĠĠĠ Ġval Ġlive Data Annotation Ġ= Ġvariable . getAnnotation ( LiveData DSL :: class . java ) ĊĠĠĠĠĠĠĠ Ġif Ġ( live Data Annotation Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( variable . as Type () Ġis ĠDecl ared Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeclared Type Ġ= Ġvariable . as Type () Ġas ĠDecl ared Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeclared Type Inheritance Ġ= ĠDecl ared Type Inheritance ( null , Ġdeclared Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmutable LiveData Gener ics Ġ= Ġget Mutable LiveData Generic ( declared Type Inheritance ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobserver Gener ics Ġ= Ġgenerate Observer Gener ics ( mutable LiveData Gener ics ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunction Gener ics Ġ= Ġgenerate Function Gener ics ( observer Gener ics ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlive Data FieldName Ġ= Ġ" get ${ variable Name . substring ( 0 , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toUpperCase ()} ${ variable Name . substring ( 1 )}" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobserver Ġ= ĠClass Name . get ( get Life Cycle Package (), Ġ" Observer ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġraw LiveData Ġ= ĠClass Name . get ( get Life Cycle Package (), Ġ" LiveData ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlive Data Ġ= ĠParameter ized TypeName . get ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġraw LiveData , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* mutable LiveData Gener ics . to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġraw Function Result Ġ= ĠClass Name . get ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" com . p hel at . li ved at ad sl . model ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Function Result " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlive Data Observation Code Ġ= Ġgenerate LiveData Observation Code ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlive Data FieldName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver Gener ics , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġraw Function Result ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlive Data Ob serve For E ver Code Ġ= Ġgenerate LiveData Ob serve For E ver Code ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlive Data FieldName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver Gener ics , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġraw Function Result ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate DSL Function ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( live Data Annotation . name . isBlank ()) Ġvariable Name Ġelse Ġlive Data Annotation . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Gener ics , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlive Data , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlive Data Observation Code , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlive Data Ob serve For E ver Code , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmutable LiveData Gener ics , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġraw Function Result , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Builder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Observer Gener ics ( type Names : ĠList < TypeName >): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgener ics Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġtype Names . forEach Indexed Ġ{ Ġindex , ĠtypeName Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgener ics . append ( typeName . box (). toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ< Ġtype Names . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgener ics . append (", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġgener ics . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget GenericType Names ( type Arguments : ĠList < Type Mirror >): ĠList < TypeName > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgener ics Ġ= Ġmutable ListOf < TypeName >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( type Argument Ġin Ġtype Arguments ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeclared Type Ġ= Ġif Ġ( type Argument Ġis ĠDecl ared Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Argument ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( type Argument Ġis ĠType Variable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Argument . upper Bound Ġas ĠDecl ared Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Element Ġ= Ġdeclared Type . as Element () Ġas ĠType Element ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpackageName Ġ= Ġelement Utils . get Package Of ( type Element ). qualified Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠtypeName Ġ= Ġdeclared Type . as Element (). simple Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgeneric ClassName Ġ= ĠClass Name . get ( packageName . toString (), ĠtypeName . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( declared Type . type Arguments . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameter ized TypeName Ġ= ĠParameter ized TypeName . get ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgeneric ClassName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* get GenericType Names ( declared Type . type Arguments ). to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgener ics . add ( parameter ized TypeName . box ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgener ics . add ( generic ClassName . box ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġgener ics ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Mutable LiveData Generic ( declared Type : ĠDecl ared Type Inheritance ): ĠList < TypeName > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Element Ġ= Ġdeclared Type . self . as Element () Ġas ĠType Element ĊĠĠĠĠĠĠĠ Ġif Ġ( is Declared Type LiveData ( declared Type . self )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgener ics Ġ= Ġget GenericType Names ( declared Type . self . type Arguments ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġraw Generic Ġ= Ġgener ics [ 0 ]. box () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgeneric Class Ġ= Ġif Ġ( raw Generic Ġis ĠParameter ized TypeName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġraw Generic . raw Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġraw Generic Ġas ĠClass Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Generic Name Object Ġ= Ġgeneric Class . simple Name () Ġ== Ġ" Object " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Generic Package Object Ġ= Ġgeneric Class . packageName () Ġ== Ġ" java . lang " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is Generic Name Object Ġ&& Ġis Generic Package Object Ġ&& Ġdeclared Type . son Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlive Data GenericType Ġ= Ġ( declared Type . self . type Arguments [ 0 ] Ġas ĠType Variable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlive Data Generic Name Ġ= Ġlive Data GenericType . as Element (). simple Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget GenericType From Son ( declared Type , Ġlive Data Generic Name . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgener ics ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval ĠsuperClass Declared Type Ġ= Ġtype Element . super class Ġas ĠDecl ared Type ĊĠĠĠĠĠĠĠ Ġreturn Ġget Mutable LiveData Generic ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDecl ared Type Inheritance ( declared Type , ĠsuperClass Declared Type ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget GenericType From Son ( ĊĠĠĠĠĠĠĠ Ġdeclared Type : ĠDecl ared Type Inheritance , ĊĠĠĠĠĠĠĠ Ġgeneric Name : ĠString ĊĠĠĠ Ġ): ĠList < TypeName > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( declared Type . son Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġson TypeName Ġ= ĠParameter ized TypeName . get ( declared Type . son . self . as Element (). as Type ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġson Type Arguments Ġ= Ġ( son TypeName Ġas ĠParameter ized TypeName ). type Arguments ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( index , Ġson Type Argument ) Ġin Ġson Type Arguments . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġson Generic Name Ġ= Ġ( son Type Argument Ġas ĠType Variable Name ). name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( generic Name . content Equals ( son Generic Name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgeneric Ġ= Ġdeclared Type . son . self . type Arguments [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġson GenericType Ġ= Ġif Ġ( generic Ġis ĠDecl ared Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgeneric ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget GenericType From Son ( declared Type . son , Ġson Generic Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġson Type Element Ġ= Ġson GenericType . as Element () Ġas ĠType Element ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpackageName Ġ= Ġelement Utils . get Package Of ( son Type Element ). qualified Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠtypeName Ġ= Ġson GenericType . as Element (). simple Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġson Generic ClassName Ġ= ĠClass Name . get ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠpackageName . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtypeName . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( son GenericType . type Arguments . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameter ized TypeName Ġ= ĠParameter ized TypeName . get ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġson Generic ClassName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* get GenericType Names ( son GenericType . type Arguments ). to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( parameter ized TypeName . box ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( son Generic ClassName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget GenericType From Son ( declared Type . son , Ġgeneric Name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġget GenericType Names ( declared Type . self . type Arguments ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Declared Type LiveData ( declared Type : ĠDecl ared Type ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Element Ġ= Ġdeclared Type . as Element () Ġas ĠType Element ĊĠĠĠĠĠĠĠ Ġval ĠpackageName Ġ= Ġelement Utils . get Package Of ( type Element ). qualified Name ĊĠĠĠĠĠĠĠ Ġval Ġvariable TypeName Ġ= Ġdeclared Type . as Element (). simple Name ĊĠĠĠĠĠĠĠ Ġval Ġis Package Arch Ġ= ĠpackageName . content Equals ( get Life Cycle Package ()) ĊĠĠĠĠĠĠĠ Ġval Ġis Class LiveData Ġ= Ġvariable TypeName . content Equals (" LiveData ") ĊĠĠĠĠĠĠĠ Ġval Ġis Class Mutable LiveData Ġ= Ġvariable TypeName . content Equals (" Mutable LiveData ") ĊĠĠĠĠĠĠĠ Ġreturn Ġis Package Arch Ġ&& Ġ( is Class LiveData Ġ|| Ġis Class Mutable LiveData ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate LiveData Observation Code ( ĊĠĠĠĠĠĠĠ Ġlive Data FieldName : ĠString , ĊĠĠĠĠĠĠĠ Ġobserver Gener ics : ĠString , ĊĠĠĠĠĠĠĠ Ġobserver : ĠClass Name , ĊĠĠĠĠĠĠĠ Ġraw Function Result : ĠClass Name ĊĠĠĠ Ġ): ĠCode Block Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCode Block . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ $ T Ġobserver Ġ= Ġnew Ġ\$ T <$ observer Gener ics >() {" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"@ Override Ġpublic Ġvoid ĠonChanged ($ observer Gener ics Ġparam ) Ġ{ function . invoke (${ if Ġ( observer Gener ics Ġ== Ġ" kotlin . Unit ") Ġ")" Ġelse Ġ" param )" }; }" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" }; ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver , Ġobserver ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ live Data FieldName (). observe ( lifecycle Owner , Ġobserver );" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" return Ġnew Ġ\$ T ( observer , Ġ$ live Data FieldName ()); ", Ġraw Function Result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate LiveData Ob serve For E ver Code ( ĊĠĠĠĠĠĠĠ Ġlive Data FieldName : ĠString , ĊĠĠĠĠĠĠĠ Ġobserver Gener ics : ĠString , ĊĠĠĠĠĠĠĠ Ġobserver : ĠClass Name , ĊĠĠĠĠĠĠĠ Ġraw Function Result : ĠClass Name ĊĠĠĠ Ġ): ĠCode Block Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCode Block . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ $ T Ġobserver Ġ= Ġnew Ġ\$ T <$ observer Gener ics >() {" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"@ Override Ġpublic Ġvoid ĠonChanged ($ observer Gener ics Ġparam ) Ġ{ function . invoke (${ if Ġ( observer Gener ics Ġ== Ġ" kotlin . Unit ") Ġ")" Ġelse Ġ" param )" }; }" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" }; ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver , Ġobserver ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ live Data FieldName (). observe Fore ver ( observer );" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" return Ġnew Ġ\$ T ( observer , Ġ$ live Data FieldName ()); ", Ġraw Function Result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Function Gener ics ( observer Gener ics : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgener ics Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġif Ġ( observer Gener ics . isEmpty () Ġ|| Ġobserver Gener ics Ġ== Ġ" kotlin . Unit ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgener ics . append (" kotlin . Unit ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgener ics . append ("$ observer Gener ics , Ġkotlin . Unit ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġgener ics . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate DSL Function ( ĊĠĠĠĠĠĠĠ Ġvariable Name : ĠString , ĊĠĠĠĠĠĠĠ Ġfunction Gener ics : ĠString , ĊĠĠĠĠĠĠĠ Ġlive Data : ĠParameter ized TypeName , ĊĠĠĠĠĠĠĠ Ġlive Data Observation Code : ĠCode Block , ĊĠĠĠĠĠĠĠ Ġlive Data Ob serve For E ver Code : ĠCode Block , ĊĠĠĠĠĠĠĠ Ġobserver Gener ics : ĠList < TypeName >, ĊĠĠĠĠĠĠĠ Ġraw Observer : ĠClass Name , ĊĠĠĠĠĠĠĠ Ġraw Function Result : ĠClass Name , ĊĠĠĠĠĠĠĠ Ġclass Builder : ĠType Spec . Builder ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfunction Ġ= ĠClass Name . get ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" kotlin . jvm . functions ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( function Gener ics Ġ== Ġ" kotlin . Unit ") Ġ" Function 0 " Ġelse Ġ" Function 1 " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġlifecycle Owner Ġ= ĠClass Name . get ( get Life Cycle Package (), Ġ" Lifecycle Owner ") ĊĊĠĠĠĠĠĠĠ Ġval Ġobserver Ġ= ĠParameter ized TypeName . get ( raw Observer , Ġ* observer Gener ics . to Typed Array ()) ĊĠĠĠĠĠĠĠ Ġval Ġfunction Result Ġ= ĠParameter ized TypeName . get ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġraw Function Result , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . box (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlive Data . box () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġd sl With Life Cycle Ġ= ĠMethod Spec . method Builder ( variable Name ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Modifiers ( Modifier . PUBLIC ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturns ( function Result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Parameter ( lifecycle Owner , Ġ" lifecycle Owner ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Parameter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType Variable Name . get (" final Ġ${ function . packageName ()}. ${ function . simple Name ()} <$ function Gener ics > "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" function " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Code ( live Data Observation Code ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġd sl Without Life Cycle Ġ= ĠMethod Spec . method Builder ( variable Name ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Modifiers ( Modifier . PUBLIC ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturns ( function Result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Parameter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType Variable Name . get (" final Ġ${ function . packageName ()}. ${ function . simple Name ()} <$ function Gener ics > "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" function " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Code ( live Data Ob serve For E ver Code ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclass Builder . add Method ( dsl With Life Cycle . build ()) ĊĠĠĠĠĠĠĠ Ġclass Builder . add Method ( dsl Without Life Cycle . build ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetType Elements ( ĊĠĠĠĠĠĠĠ Ġelements : ĠSet < Element >, ĊĠĠĠĠĠĠĠ Ġsupported Annotations : ĠSet < Element > ĊĠĠĠ Ġ): ĠSet < Type Element > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Elements Ġ= ĠHashSet < Type Element >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( element Ġin Ġelements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element Ġis ĠType Element Ġ&& Ġprocess Sub Elements ( element , Ġsupported Annotations )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Elements . add ( element ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtype Elements ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Sub Elements ( ĊĠĠĠĠĠĠĠ Ġelement : ĠType Element , ĊĠĠĠĠĠĠĠ Ġsupported Annotations : ĠSet < Element > ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( sub Element Ġin Ġelement . enc losed Elements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( process Element Annotations ( sub Element , Ġsupported Annotations )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Element Annotations ( ĊĠĠĠĠĠĠĠ Ġsub Element : ĠElement , ĊĠĠĠĠĠĠĠ Ġsupported Annotations : ĠSet < Element > ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( mirror Ġin Ġsub Element . annotation Mir rors ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( process Annotation ( supported Annotations , Ġmirror )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Annotation ( ĊĠĠĠĠĠĠĠ Ġsupported Annotations : ĠSet < Element >, ĊĠĠĠĠĠĠĠ Ġmirror : ĠAnnotation Mirror ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( annotation Ġin Ġsupported Annotations ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mirror . annotation Type . as Element () Ġ== Ġannotation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Supported Annotation Types (): ĠSet < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġset Of ( LiveData DSL :: class . java . canonical Name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun Ġget Life Cycle Package (): ĠString Ċ Ċ } Ċ