/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠSeb astian ĠK as par i Ċ Ġ* Ċ Ġ* Ġ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 Ġre compose . composer . visitor Ċ Ċ import Ġre compose . ast . Layout Ċ import Ġre compose . ast . values . Orientation Ċ import Ġre compose . ast . view . Button Node Ċ import Ġre compose . ast . view . CheckBox Node Ċ import Ġre compose . ast . view . EditText Node Ċ import Ġre compose . ast . view . ImageView Node Ċ import Ġre compose . ast . view . TextView Node Ċ import Ġre compose . ast . view . View Node Ċ import Ġre compose . ast . view group . Card View Node Ċ import Ġre compose . ast . view group . Constraint Layout Node Ċ import Ġre compose . ast . view group . Frame Layout Node Ċ import Ġre compose . ast . view group . LinearLayout Node Ċ import Ġre compose . ast . view group . Unknown Node Ċ import Ġre compose . composer . ext . find Ch ains Ċ import Ġre compose . composer . ext . find Refs Ċ import Ġre compose . composer . writer . Call Parameter Ċ import Ġre compose . composer . writer . Kotlin Writer Ċ import Ġre compose . composer . writer . Modifier Ċ import Ġre compose . composer . writer . Modifier Builder Ċ import Ġre compose . composer . writer . Parameter Value Ċ import Ġre compose . visitor . Visitor Ċ Ċ /** Ċ Ġ* Ġ[ Visitor ] Ġimplementation Ġthat Ġtra ver ses Ġthe Ġparsed Ġ[ Layout ] Ġand Ġtransforms Ġit Ġinto Ġ` Composable " Ġcalls . Ċ Ġ*/ Ċ @ Suppress (" Too Many Functions ") Ċ internal Ġclass ĠComp osing Visitor Ġ: ĠVisitor Ġ{ ĊĠĠĠ Ġprivate Ġval Ġwriter Ġ= ĠKotlin Writer () ĊĊĠĠĠ Ġfun Ġget Result (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwriter . getString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Layout ( layout : ĠLayout ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlayout . children . forEach Ġ{ Ġview Ġ-> Ġview . accept ( this ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit View ( node : ĠView Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodifier Ġ= ĠModifier Builder ( node ) ĊĊĠĠĠĠĠĠĠ Ġwriter . write Call ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Box ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier . to Call Parameter () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Button ( node : ĠButton Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodifier Ġ= ĠModifier Builder ( node ) ĊĊĠĠĠĠĠĠĠ Ġwriter . write Call ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" Button ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall Parameter ( name Ġ= Ġ" onClick ", Ġvalue Ġ= ĠParameter Value . Empty Lambda Value ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier . to Call Parameter () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Call ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" Text ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall Parameter ( name Ġ= Ġ" text ", Ġvalue Ġ= ĠParameter Value . StringValue ( node . text )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall Parameter ( name Ġ= Ġ" textAlign ", Ġvalue Ġ= ĠParameter Value . Raw Value (" Text Align . Center ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit TextView ( node : ĠTextView Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodifier Ġ= ĠModifier Builder ( node ) ĊĊĠĠĠĠĠĠĠ Ġwriter . write Call ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" Text ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall Parameter ( name Ġ= Ġ" text ", Ġvalue Ġ= ĠParameter Value . StringValue ( node . text )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . textColor ?. let Ġ{ ĠCall Parameter ( name Ġ= Ġ" color ", Ġvalue Ġ= ĠParameter Value . Color Value ( it )) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . text Size ?. let Ġ{ ĠCall Parameter ( name Ġ= Ġ" fontSize ", Ġvalue Ġ= ĠParameter Value . Size Value ( it )) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . max Lines ?. let Ġ{ ĠCall Parameter ( name Ġ= Ġ" max Lines ", Ġvalue Ġ= ĠParameter Value . Raw Value ( it )) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier . to Call Parameter () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit CheckBox ( node : ĠCheckBox Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrow Modifier Ġ= ĠModifier Builder ( node ) ĊĊĠĠĠĠĠĠĠ Ġwriter . write Call ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Row ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow Modifier . to Call Parameter () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Call ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" Checkbox ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall Parameter ( name Ġ= Ġ" checked ", Ġvalue Ġ= ĠParameter Value . Raw Value ( node . checked )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall Parameter ( name Ġ= Ġ" on Checked Change ", Ġvalue Ġ= ĠParameter Value . Empty Lambda Value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . text ?. let Ġ{ Ġtext Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Modifier Ġ= ĠModifier Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Modifier . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModifier ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" align ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall Parameter ( Parameter Value . Raw Value (" Alignment . Center Vert ically ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Call ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" Text ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall Parameter ( Parameter Value . StringValue ( text )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Modifier . to Call Parameter () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Card View ( node : ĠCard View Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodifier Ġ= ĠModifier Builder ( node ) ĊĊĠĠĠĠĠĠĠ Ġwriter . write Call ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" Card ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier . to Call Parameter () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . view Group . children . forEach Ġ{ Ġview Ġ-> Ġview . accept ( this @ Comp osing Visitor ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ImageView ( node : ĠImageView Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodifier Ġ= ĠModifier Builder ( node ) ĊĊĠĠĠĠĠĠĠ Ġwriter . write Call ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" Image ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . src ?. let Ġ{ ĠCall Parameter ( Parameter Value . Drawable Value ( it )) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier . to Call Parameter () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit LinearLayout ( node : ĠLinearLayout Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcomp osable Ġ= Ġwhen Ġ( node . orientation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOrientation . Vertical Ġ-> Ġ" Column " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOrientation . Horizontal Ġ-> Ġ" Row " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwriter . write Call ( comp osable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . view Group . children . forEach Ġ{ Ġview Ġ-> Ġview . accept ( this @ Comp osing Visitor ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Frame Layout ( node : ĠFrame Layout Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrow Modifier Ġ= ĠModifier Builder ( node ) ĊĠĠĠĠĠĠĠ Ġwriter . write Call ( name Ġ= Ġ" Box ", Ġparameters Ġ= ĠlistOf ( row Modifier . to Call Parameter ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . view Group . children . forEach Ġ{ Ġit . accept ( this @ Comp osing Visitor ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Constraint Layout ( node : ĠConstraint Layout Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodifier Ġ= ĠModifier Builder ( node ) ĊĊĠĠĠĠĠĠĠ Ġwriter . write Call ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" Constraint Layout ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier . to Call Parameter () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrefs Ġ= Ġnode . find Refs () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( refs . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . write Refs Declaration ( refs ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchains Ġ= Ġnode . find Ch ains () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( chains . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . write Ch ains ( chains ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . view Group . children . forEach Ġ{ Ġview Ġ-> Ġview . accept ( this @ Comp osing Visitor ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Unknown ( node : ĠUnknown Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġblock : Ġ( Kotlin Writer . () Ġ-> ĠUnit )? Ġ= Ġif Ġ( node . view Group . children . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġnode . view Group . children . forEach Ġ{ Ġview Ġ-> Ġview . accept ( this @ Comp osing Visitor ) Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmodifier Ġ= ĠModifier Builder ( node ) ĊĊĠĠĠĠĠĠĠ Ġwriter . write Call ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Ġ= ĠlistOf ( modifier . to Call Parameter ()), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline Prefix Ġ= Ġ"// Ġ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock Ġ= Ġblock ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit EditText ( node : ĠEditText Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodifier Ġ= ĠModifier Builder ( node ) ĊĊĠĠĠĠĠĠĠ Ġwriter . write Call ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" TextField ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall Parameter ( name Ġ= Ġ" value ", Ġvalue Ġ= ĠParameter Value . StringValue ( node . text )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall Parameter ( name Ġ= Ġ" on Value Change ", Ġvalue Ġ= ĠParameter Value . Empty Lambda Value ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall Parameter ( name Ġ= Ġ" keyboard Type ", Ġvalue Ġ= ĠParameter Value . Keyboard Type Value ( node . input Type )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier . to Call Parameter (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ