package Ġcom . air bnb . e po xy Ċ Ċ import Ġcom . air bnb . e po xy . Utils . is E po xy Model Ċ import Ġcom . squareup . jav ap o et . ClassName Ċ import Ġcom . squareup . jav ap o et . Parameterized TypeName Ċ import Ġcom . squareup . jav ap o et . TypeName Ċ import Ġjavax . lang . model . element . Element Ċ import Ġjavax . lang . model . element . Executable Element Ċ import Ġjavax . lang . model . element . Modifier Ċ import Ġjavax . lang . model . element . Parameter izable Ċ import Ġjavax . lang . model . element . Type Element Ċ import Ġjavax . lang . model . type . Declared Type Ċ import Ġjavax . lang . model . type . Mir rored Type Exception Ċ import Ġjavax . lang . model . type . Type Mirror Ċ import Ġjavax . lang . model . util . Elements Ċ import Ġjavax . lang . model . util . Types Ċ import Ġkotlinx . metadata . Flag . Value Parameter . DECLARE S _ DEFAULT _ VALUE Ċ import Ġkotlinx . metadata . Km Classifier Ċ import Ġkotlinx . metadata . Km Function Ċ import Ġkotlinx . metadata . Km Type Ċ import Ġkotlinx . metadata . jvm . Kotlin Class Header Ċ import Ġkotlinx . metadata . jvm . Kotlin Class Metadata Ċ Ċ internal Ġclass ĠModel View Info ( ĊĠĠĠ Ġval Ġview Element : ĠType Element , ĊĠĠĠ Ġval Ġtype Utils : ĠTypes , ĊĠĠĠ Ġval Ġelements : ĠElements , ĊĠĠĠ Ġval Ġerror Logger : ĠError Logger , ĊĠĠĠ Ġprivate Ġval Ġconfig Manager : ĠConfig Manager , ĊĠĠĠ Ġprivate Ġval Ġresource Processor : ĠResource Processor Ċ ) Ġ: ĠGenerated Model Info () Ġ{ ĊĠĠĠ Ġval Ġreset Method Names Ġ= Ġmutable ListOf < String >() ĊĠĠĠ Ġval Ġvisibility StateChanged Method Names Ġ= Ġmutable ListOf < String >() ĊĠĠĠ Ġval Ġvisibility Changed Method Names Ġ= Ġmutable ListOf < String >() ĊĠĠĠ Ġval Ġafter Props Set Method Names Ġ= Ġmutable ListOf < String >() ĊĠĠĠ Ġval Ġsave ViewState : ĠBoolean ĊĠĠĠ Ġprivate Ġval Ġview Annotation : ĠModel View Ġ= Ġview Element . getAnnotation ( Model View :: class . java ) ĊĠĠĠ Ġval Ġfull Span Size : ĠBoolean ĊĠĠĠ Ġprivate Ġval Ġgenerated Model Suffix : ĠString ĊĠĠĠ Ġval Ġkotlin Metadata : ĠKotlin Class Metadata ? Ġ= Ġview Element . kotlin Metadata () ĊĊĠĠĠ Ġ/** ĠAll Ġinterfaces Ġthe Ġview Ġimplements Ġthat Ġhave Ġat Ġleast Ġone Ġprop Ġset Ġby Ġthe Ġinterface . Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġview Interfaces : ĠList < Type Element > ĊĊĠĠĠ Ġval Ġview Attributes : ĠList < View Attribute Info > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġattribute Info . filter Is Instance < View Attribute Info >() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠsuperClass Element Ġ= Ġlook Up Super Class Element () ĊĠĠĠĠĠĠĠ Ġthis . super ClassName Ġ= ĠParameter ized TypeName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get ( ClassName . get ( super Class Element ), ĠType Name . get ( view Element . as Type ())) ĊĊĠĠĠĠĠĠĠ Ġgenerated Model Suffix Ġ= Ġconfig Manager . generated Model Suffix ( view Element ) ĊĠĠĠĠĠĠĠ Ġgenerated ClassName Ġ= Ġbuild Generated ModelName ( view Element , Ġelements ) ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġdon 't Ġhave Ġany Ġtype Ġparameters Ġon Ġour Ġgenerated Ġmodel ĊĠĠĠĠĠĠĠ Ġthis . parametri zed ClassName Ġ= Ġgenerated ClassName ĊĠĠĠĠĠĠĠ Ġshould Generate Model Ġ= ĠModifier . AB STR ACT Ġ! in Ġview Element . modifiers ĊĊĠĠĠĠĠĠĠ Ġif Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsuperClass Element . simple Name . toString () Ġ!= ĠClass Names . E PO XY _ MODEL _ UN TYPE D . simple Name () ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġview Ġhas Ġa Ġcustom Ġbase Ġmodel Ġthen Ġwe Ġcopy Ġany Ġcustom Ġconstructors Ġon Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconstructors . addAll ( getClass Construct ors ( super Class Element )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcollect Methods Return ing ClassType ( super Class Element , Ġtype Utils ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġbound Ġtype Ġis Ġthe Ġtype Ġof Ġthis Ġview ĊĠĠĠĠĠĠĠ Ġbound Object TypeName Ġ= ĠClass Name . get ( view Element . as Type ()) ĊĊĠĠĠĠĠĠĠ Ġsave ViewState Ġ= Ġview Annotation . save ViewState ĊĠĠĠĠĠĠĠ Ġlayout Params Ġ= Ġview Annotation . auto Layout ĊĠĠĠĠĠĠĠ Ġfull Span Size Ġ= Ġview Annotation . full Span ĊĠĠĠĠĠĠĠ Ġinclude Other Layout Options Ġ= Ġconfig Manager . include Alternate Layouts For Views ( view Element ) ĊĊĠĠĠĠĠĠĠ Ġval Ġmethods On View Ġ= Ġview Element . executable Elements () ĊĠĠĠĠĠĠĠ Ġview Interfaces Ġ= Ġview Element ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. interfaces ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Is Instance < Declared Type >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . as Element () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Is Instance < Type Element >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġinterface Element Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOnly Ġinclude Ġthe Ġinterface Ġif Ġthe Ġview Ġhas Ġone Ġof Ġthe Ġinterface Ġmethods Ġannotated Ġwith Ġa Ġprop Ġannotation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethods On View . any Ġ{ Ġview Method Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Method . has Any Annotation ( Model View Processor . model Prop Annotations ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinterface Element . executable Elements (). any Ġ{ Ġinterface Method Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTo Ġkeep Ġthis Ġsimple Ġwe Ġonly Ġcompare Ġname Ġand Ġignore Ġparameters , Ġshould Ġbe Ġclose Ġenough ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Method . simple Name . toString () Ġ== ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinterface Method . simple Name . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠPass Ġdeprecated Ġannotations Ġon Ġto Ġthe Ġgenerated Ġmodel ĊĠĠĠĠĠĠĠ Ġannotations . addAll ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Element . build Annotation Specs Ġ{ ĠDE PRECATED Ġ== Ġit . simple Name () Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠWe Ġgenerate Ġan Ġinterface Ġon Ġthe Ġmodel Ġto Ġrepresent Ġeach Ġinterface Ġon Ġthe Ġview . ĊĠĠĠĠ Ġ* ĠThis Ġlets Ġmodels Ġwith Ġthe Ġsame Ġview Ġinterface Ġbe Ġgrouped Ġtogether . Ġ*/ ĊĠĠĠ Ġval Ġgenerated View Interface Names : ĠList < ClassName > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġview Interfaces . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClass Name . get ( it ). appendTo Name (" Model _ ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠElement . kotlin Metadata (): ĠKotlin Class Metadata ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġhttps :// github . com / Jet Brains / kotlin / tree / master / libraries / kotlin x - metadata / jvm ĊĠĠĠĠĠĠĠ Ġval Ġkotlin Metadata Annotation Ġ= Ġget Annotation ( Metadata :: class . java ) Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġheader Ġ= ĠKotlin Class Header ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkind Ġ= Ġkotlin Metadata Annotation . kind , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmetadata Version Ġ= Ġkotlin Metadata Annotation . metadata Version , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbytecode Version Ġ= Ġkotlin Metadata Annotation . byte code Version , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata 1 Ġ= Ġkotlin Metadata Annotation . data 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata 2 Ġ= Ġkotlin Metadata Annotation . data 2 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextra String Ġ= Ġkotlin Metadata Annotation . extra String , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠpackageName Ġ= Ġkotlin Metadata Annotation . packageName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextra Int Ġ= Ġkotlin Metadata Annotation . extra Int ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠKotlin Class Metadata . read ( header ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlook Up Super Class Element (): ĠType Element Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdefault Super Ġ= ĠUtils . getElement ByName ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClass Names . E PO XY _ MODEL _ UN TYPE D , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelements , Ġtype Utils ĊĠĠĠĠĠĠĠ Ġ) Ġas ĠType Element ĊĊĠĠĠĠĠĠĠ Ġ// ĠUnfortunately Ġwe Ġhave Ġto Ġdo Ġthis Ġweird Ġtry / catch Ġto Ġget Ġthe Ġclass Ġtype ĊĠĠĠĠĠĠĠ Ġvar Ġclass To Extend : ĠType Mirror ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Annotation . base Model Class Ġ// Ġthis Ġshould Ġthrow ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( m te : ĠMir rored Type Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass To Extend Ġ= Ġm te . type Mirror ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( class To Extend Ġ== Ġnull Ġ|| Ġclass To Extend . toString () Ġ== ĠVoid :: class . java . canonical Name ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdefault BaseModel Ġ= Ġconfig Manager . getDefault BaseModel ( view Element ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( default BaseModel Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass To Extend Ġ= Ġdefault BaseModel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdefault Super ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! is E po xy Model ( class To Extend )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Logger ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. log Error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġbase Ġmodel Ġprovided Ġto Ġan Ġ% s Ġmust Ġextend ĠE po xy Model , Ġbut Ġwas Ġ% s Ġ(% s ). ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModel View :: class . java . simple Name , Ġclass To Extend , Ġview Element . simple Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdefault Super ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! validate Super Class Is Typed Correct ly ( class To Extend )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Logger . log Error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġbase Ġmodel Ġprovided Ġto Ġan Ġ% s Ġmust Ġhave ĠView Ġas Ġits Ġtype Ġ(% s ). ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModel View :: class . java . simple Name , Ġview Element . simple Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdefault Super ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtype Utils . as Element ( class To Extend ) Ġas ĠType Element ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠThe Ġsuper Ġclass Ġthat Ġour Ġgenerated Ġmodel Ġextends Ġfrom Ġmust Ġhave ĠView Ġas Ġits Ġonly Ġtype . Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġvalidate Super Class Is Typed Correct ly ( class Type : ĠType Mirror ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclass Element Ġ= Ġtype Utils . as Element ( class Type ) Ġas ? ĠParameter izable Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġtype Parameters Ġ= Ġclass Element . type Parameters ĊĠĠĠĠĠĠĠ Ġif Ġ( type Parameters . size Ġ!= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġ( eli _ h art Ġ 6 / 1 5 / 1 7 ) ĠIt Ġshould Ġbe Ġvalid Ġto Ġhave Ġmultiple Ġor Ġno Ġtypes Ġas Ġlong Ġas Ġthey ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġare Ġcorrect , Ġbut Ġthat Ġshould Ġbe Ġa Ġrare Ġcase ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtype Param Ġ= Ġtype Parameters [ 0 ] ĊĠĠĠĠĠĠĠ Ġval Ġbounds Ġ= Ġtype Param . bounds ĊĠĠĠĠĠĠĠ Ġif Ġ( bounds . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAny Ġtype Ġis Ġallowed , Ġso ĠView Ġw il Ġwork ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtype Mirror Ġ= Ġbounds [ 0 ] ĊĠĠĠĠĠĠĠ Ġval Ġview Type Ġ= ĠgetType Mirror ( ClassNames . ANDROID _ VIEW , Ġelements , Ġtype Utils ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtype Utils . is Assignable ( view Type , Ġtype Mirror ) Ġ|| Ġtype Utils . is Subtype ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Mirror , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Type ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Generated ModelName ( ĊĠĠĠĠĠĠĠ Ġview Element : ĠType Element , ĊĠĠĠĠĠĠĠ Ġelement Utils : ĠElements ĊĠĠĠ Ġ): ĠClass Name Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠpackageName Ġ= Ġelement Utils . get Package Of ( view Element ). qualified Name . toString () ĊĊĠĠĠĠĠĠĠ Ġvar ĠclassName Ġ= Ġview Element . simple Name . toString () ĊĠĠĠĠĠĠĠ ĠclassName Ġ+= Ġgenerated Model Suffix ĊĊĠĠĠĠĠĠĠ Ġreturn ĠClass Name . get ( packageName , ĠclassName ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Prop ( prop : ĠElement ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġhas Default Kotlin Value Ġ= Ġprop Ġis ĠExec utable Element Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin Metadata ?. find Matching Setter ( prop )?. has Single Default Parameter () Ġ== Ġtrue ĊĊĠĠĠĠĠĠĠ Ġ// ĠSince Ġour Ġgenerated Ġcode Ġis Ġjava Ġwe Ġneed Ġj v mo ver loads Ġso Ġthat Ġa Ġno Ġarg ĊĠĠĠĠĠĠĠ Ġ// Ġversion Ġof Ġthe Ġfunction Ġis Ġgenerated . ĠHowever , Ġthe ĠJ vm Over loads Ġannotation ĊĠĠĠĠĠĠĠ Ġ// Ġis Ġstripped Ġwhen Ġgenerating Ġthe Ġjava Ġcode Ġso Ġwe Ġcan 't Ġcheck Ġit Ġdirectly . ĊĠĠĠĠĠĠĠ Ġ// ĠInstead , Ġwe Ġverify Ġthat Ġa Ġno Ġarg Ġfunction Ġof Ġthe Ġsame Ġname Ġexists ĊĠĠĠĠĠĠĠ Ġval Ġhas No Arg Equivalent Ġ= Ġhas Default Kotlin Value Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprop Ġis ĠExec utable Element Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Element . has Over load ( prop , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( has Default Kotlin Value Ġ&& Ġ! has No Arg Equivalent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Logger . log Error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Model Ġview Ġfunction Ġwith Ġdefault Ġargument Ġmust Ġbe Ġannotated Ġwith Ġ@ Jvm Over loads : Ġ% s # % s ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Element . simple Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprop . simple Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġadd Attribute ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠView Attribute Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel Info Ġ= Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Default Kotlin Value Ġ= Ġhas Default Kotlin Value Ġ&& Ġhas No Arg Equivalent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Attribute Element Ġ= Ġprop , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtypes Ġ= Ġtype Utils , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelements Ġ= Ġelements , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Logger Ġ= Ġerror Logger , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresource Processor Ġ= Ġresource Processor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Prop IfNot Exists ( prop : ĠElement ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Attribute IfNot Exists ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠView Attribute Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel Info Ġ= Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Default Kotlin Value Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Attribute Element Ġ= Ġprop , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtypes Ġ= Ġtype Utils , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelements Ġ= Ġelements , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Logger Ġ= Ġerror Logger , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresource Processor Ġ= Ġresource Processor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd On Re cycle Method IfNot Exists ( reset Method : ĠElement ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠmethodName Ġ= Ġreset Method . simple Name . toString () ĊĠĠĠĠĠĠĠ Ġif Ġ(! reset Method Names . contains ( methodName )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset Method Names . add ( methodName ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd On Visibility StateChanged Method IfNot Exists ( visibility Method : ĠElement ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠmethodName Ġ= Ġvisibility Method . simple Name . toString () ĊĠĠĠĠĠĠĠ Ġif Ġ(! visibility StateChanged Method Names . contains ( methodName )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility StateChanged Method Names . add ( methodName ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd On Visibility Changed Method IfNot Exists ( visibility Method : ĠElement ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠmethodName Ġ= Ġvisibility Method . simple Name . toString () ĊĠĠĠĠĠĠĠ Ġif Ġ(! visibility Changed Method Names . contains ( methodName )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Changed Method Names . add ( methodName ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd After Props Set Method IfNot Exists ( after Props Set Method : ĠElement ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠmethodName Ġ= Ġafter Props Set Method . simple Name . toString () ĊĠĠĠĠĠĠĠ Ġif Ġ(! after Props Set Method Names . contains ( methodName )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġafter Props Set Method Names . add ( methodName ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Layout Resource ( resource Processor : ĠResource Processor ): ĠResource Value Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġannotation Ġ= Ġview Element . getAnnotation ( Model View :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġlayout Value Ġ= Ġannotation . default Layout ĊĠĠĠĠĠĠĠ Ġif Ġ( layout Value Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresource Processor . get Layout In Annotation ( view Element , ĠModel View :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmodel View Config Ġ= Ġconfig Manager . getModel View Config ( view Element ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( model View Config Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmodel View Config . getName For View ( view Element ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġerror Logger . log Error (" Unable Ġto Ġget Ġlayout Ġresource Ġfor Ġview Ġ% s ", Ġview Element . simple Name ) ĊĠĠĠĠĠĠĠ Ġreturn ĠResource Value ( 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠKotlin Class Metadata . find Matching Setter ( function Element : ĠExec utable Element ): ĠK m Function ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ! is ĠKotlin Class Metadata . Class ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġ// ĠGiven Ġan Ġelement Ġrepresenting Ġa Ġfunction Ġwe Ġwant Ġto Ġfind Ġthe Ġcorresponding Ġfunction Ġinformation ĊĠĠĠĠĠĠĠ Ġ// Ġin Ġthe Ġkotlin Ġmetadata Ġof Ġthis Ġclass . ĠWe Ġdo Ġthis Ġby Ġsearching Ġfor Ġa Ġfunction Ġmatching Ġthe Ġsame ĊĠĠĠĠĠĠĠ Ġ// Ġname , Ġparam Ġcount , Ġparam Ġname , Ġand Ġparam Ġtype . ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġassumes Ġthe Ġparam Ġcount Ġwe 're Ġlooking Ġfor Ġis Ġ 1 Ġsince Ġthis Ġis Ġan Ġe po xy Ġsetter . ĊĠĠĠĠĠĠĠ Ġrequire ( function Element . parameters . size Ġ== Ġ 1 ) Ġ{ Ġ" Expected Ġfunction Ġ$ function Element Ġto Ġhave Ġexactly Ġ 1 Ġparameter " Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġparam Name Ġ= Ġfunction Element . parameters . single (). simple Name . toString () ĊĠĠĠĠĠĠĠ Ġval Ġfunction Name Ġ= Ġfunction Element . simple Name . toString () ĊĊĠĠĠĠĠĠĠ Ġval Ġprop Type ClassName Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Element . parameters . single (). as Type (). toString (). let Ġ{ ĠClass Name Data . from ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠChecking Ġfunction Ġname , Ġparam Ġcount , Ġand Ġparam Ġname Ġare Ġeasy ĊĠĠĠĠĠĠĠ Ġval Ġmatching Functions Ġ= Ġto Km Class (). functions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . name Ġ== Ġfunction Name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparam Ġ= Ġit . value Parameters . single OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam ?. name Ġ== Ġparam Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠHowever , Ġchecking Ġparam Ġtype Ġis Ġhard . ĠIf Ġthere Ġare Ġfunction Ġover loads Ġthat Ġhave Ġthe Ġsame ĊĠĠĠĠĠĠĠ Ġ// Ġnaming , Ġbut Ġwith Ġdifferent Ġparam Ġtypes , Ġthen Ġwe Ġneed Ġto Ġbe Ġable Ġto Ġdistinguish Ġbetween ĊĠĠĠĠĠĠĠ Ġ// Ġthem . ĠThis Ġis Ġdifficult Ġbecause Ġthe Ġtype Ġinformation Ġfrom Ġthe ĠKotlin Ġmetadata Ġdoesn 't ĊĠĠĠĠĠĠĠ Ġ// Ġhave Ġa Ġclear Ġmapping Ġto Ġthe ĠElement Ġtype Ġinformation . ĊĠĠĠĠĠĠĠ Ġif Ġ( matching Functions . size Ġ<= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmatching Functions . first OrNull () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmatching Functions . map NotNull Ġ{ Ġfunction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠclassName Ġ= ĠClass Name Data . from ( function . value Parameters . single (). type ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( className Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Ġto ĠclassName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. sorted With ( Comparator Ġ{ Ġp 0 , Ġp 1 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGiven Ġtwo Ġkotlin Ġmetadata Ġfunctions Ġand Ġtheir Ġclass Ġnames , Ġthis Ġcomparator ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcomp ares Ġthem Ġto Ġsee Ġwhich Ġis Ġmore Ġlikely Ġto Ġbe Ġthe Ġsame Ġas Ġthe Ġfunction ĠElement ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġare Ġtrying Ġto Ġmatch Ġwith . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompare Names ( prop Type ClassName , Ġp 0 . second , Ġp 1 . second ) ĊĠĠĠĠĠĠĠ Ġ}). last OrNull ()?. first ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠK m Function . has Single Default Parameter (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparam Ġ= Ġvalue Parameters . single OrNull () Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn ĠDECLARE S _ DEFAULT _ VALUE ( param . flags ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcompare Names ( ĊĠĠĠĠĠĠĠ Ġtarget Type : ĠClass Name Data , ĊĠĠĠĠĠĠĠ Ġleft Type : ĠClass Name Data , ĊĠĠĠĠĠĠĠ Ġright Type : ĠClass Name Data ĊĠĠĠ Ġ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġpackage Ġnames Ġof Ġkotlin Ġmetadata Ġtypes Ġuse Ġkotlin Ġversions Ġof Ġthings Ġ( ie Ġkotlin . String ) ĊĠĠĠĠĠĠĠ Ġ// Ġwhereas Ġthe Ġjava ĠElement Ġtypes Ġuse Ġthe ĠJava Ġpackage Ġnames . ĠThis Ġmakes Ġit Ġhard Ġto Ġdirectly ĊĠĠĠĠĠĠĠ Ġ// Ġcompare Ġtypes . ĠAdditionally , Ġgeneric Ġinformation Ġis Ġpresented Ġin Ġslightly Ġdifferent Ġformats ĊĠĠĠĠĠĠĠ Ġ// ĠTo Ġavoid Ġerrors Ġwhere Ġwe Ġdon 't Ġcompare Ġtypes Ġcorrectly , Ġwe Ġinstead Ġlook Ġfor Ġthe Ġclosest ĊĠĠĠĠĠĠĠ Ġ// Ġmatching Ġtypes , Ġand Ġsort Ġto Ġsee Ġwhich Ġtype Ġwe Ġthink Ġmatches Ġthe Ġbest . ĊĊĠĠĠĠĠĠĠ Ġ// ĠSan ity Ġcheck Ġthat Ġgeneric Ġtype Ġcounts Ġare Ġcorrect . ĊĠĠĠĠĠĠĠ Ġ// ĠBecause Ġof Ġtype Ġer asure Ġa Ġfunction Ġcan 't Ġhave Ġthe Ġsame Ġsignature Ġwith Ġsomething Ġof Ġthe Ġsame ĊĠĠĠĠĠĠĠ Ġ// Ġclass Ġand Ġdifferent Ġgeneric Ġtypes , Ġso Ġwe Ġdon 't Ġhave Ġto Ġcheck Ġgeneric Ġtypes ĊĠĠĠĠĠĠĠ Ġif Ġ( left Type . type Names . size Ġ== Ġright Type . type Names . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left Type . type Names . size Ġ!= Ġtarget Type . type Names . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNeither Ġof Ġthe Ġtypes Ġhas Ġthe Ġright Ġgeneric Ġinformation , Ġso Ġthey Ġare Ġequ ally Ġun fit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Type . type Names . size Ġ== Ġtarget Type . type Names . size Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright Type . type Names . size Ġ== Ġtarget Type . type Names . size Ġ-> Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtarget Type . package Names . forEach Indexed Ġ{ Ġindex , Ġname Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft Name Ġ= Ġleft Type . package Names . get OrNull ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġright Name Ġ= Ġright Type . package Names . get OrNull ( index ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Name Ġ== Ġname Ġ&& Ġright Name Ġ!= Ġname Ġ-> Ġreturn Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Name Ġ!= Ġname Ġ&& Ġright Name Ġ== Ġname Ġ-> Ġreturn Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠClass Name Data ( ĊĠĠĠĠĠĠĠ Ġval ĠfullName Without Types : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġtype Names : ĠList < ClassName Data ?> ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpackage Names : ĠList < String > Ġ= ĠfullName Without Types . split (". "). reversed () ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġfrom ( km Type : ĠK m Type ?): ĠClass Name Data ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( km Type Ġ== Ġnull ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfully QualifiedName Ġ= Ġwhen Ġ( val Ġclassifier Ġ= Ġkm Type . classifier ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK m Classifier . Class Ġ-> Ġclassifier . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK m Classifier . Type Parameter Ġ-> Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK m Classifier . Type Alias Ġ-> Ġclassifier . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġpackage Ġparts Ġare Ġseparate Ġwith Ġ"/" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ("/", Ġ". ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠClass Name Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfully QualifiedName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Names Ġ= Ġkm Type . arguments . map Ġ{ ĠClass Name Data . from ( it . type ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġfrom ( reflection Name : ĠString ): ĠClass Name Data Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfullName Without Types Ġ= Ġreflection Name . substring Before ("< ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Names Ġ= Ġreflection Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take If Ġ{ Ġit . contains ("< ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . substring After ("< ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . substring Before Last ("> ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . split (",") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . map Ġ{ Ġit . trim () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . filter Ġ{ Ġit . isNotBlank () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . take If Ġ{ Ġit . isNotEmpty () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ== Ġ"? ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRepresent Ġa Ġstar Ġprojection Ġas Ġnull , Ġwhich Ġis Ġwhat Ġthe Ġkotlin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmetadata Ġdoes Ġtoo . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass Name Data . from ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġempty List () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠClass Name Data ( fullName Without Types , Ġtype Names ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ