/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 2 ĠT ern op ol ĠLe on id . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġcom . fire l ion . dsl gen . generator . generation Ċ Ċ import Ġcom . fire l ion . dsl gen . Generation Parameters Ċ import Ġcom . fire l ion . dsl gen . generator . util . Data Ċ import Ġcom . fire l ion . dsl gen . generator . process Function Ċ import Ġcom . fire l ion . dsl gen . generator . util . make Inline If Requested Ċ import Ġcom . fire l ion . dsl gen . util . to TypeName Fix Ċ import Ġcom . google . devtools . k sp . symbol . KS Function Declaration Ċ import Ġcom . google . devtools . k sp . symbol . KS Type Ċ import Ġcom . squareup . kotlin po et .* Ċ import Ġcom . squareup . kotlin po et . Parameterized TypeName . Companion . parameter ized By Ċ import Ġcom . squareup . kotlin po et . k sp . Type Parameter Resolver Ċ Ċ /** Ċ Ġ* ĠGenerates Ġcontext Ġclass Ġproperty Ġsetter Ġwith Ġsyntax Ġ` name ( value )`. Ċ Ġ*/ Ċ internal Ġfun ĠFile Spec . Builder . generate Function Setter ( ĊĠĠĠ Ġname : ĠString , ĊĠĠĠ Ġbacking PropertyName : ĠString , ĊĠĠĠ Ġbacking PropertyType : ĠK S Type , ĊĠĠĠ Ġbacking Property Index : ĠInt , ĊĠĠĠ Ġrequires No Initialization : ĠBoolean , ĊĠĠĠ Ġgeneration Parameters : ĠGeneration Parameters , ĊĠĠĠ Ġtype Variables : ĠList < Type Variable Name >, ĊĠĠĠ Ġcontext ClassName : ĠType Name , ĊĠĠĠ Ġtype Parameter Resolver : ĠType Parameter Resolver , ĊĠĠĠ Ġd sl Marker : ĠAnnotation Spec , Ċ ) Ġ{ ĊĠĠĠ ĠFun Spec . builder ( name ) ĊĠĠĠĠĠĠĠ Ġ. add Annotation ( dsl Marker ) ĊĠĠĠĠĠĠĠ Ġ. make Inline If Requested ( generation Parameters ) ĊĠĠĠĠĠĠĠ Ġ. add Type Variables ( type Variables ) ĊĠĠĠĠĠĠĠ Ġ. receiver ( context ClassName ) ĊĠĠĠĠĠĠĠ Ġ. add Parameter ( name , Ġbacking PropertyType . to TypeName Fix ( type Parameter Resolver )) ĊĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( requires No Initialization ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Code ( check No Initialization ( back ing Property Index , Ġbacking PropertyName )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Code ( initialize ( back ing Property Index )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Code (" this .% N Ġ= Ġ% N \ n ", Ġ"\ $\ $$ back ing PropertyName \ $\ $", Ġname ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ. run ( this :: addFunction ) Ċ Ċ } Ċ Ċ /** Ċ Ġ* ĠGenerates Ġcontext Ġclass Ġproperty Ġsetter Ġwith Ġsyntax Ġ` name Ġ{ Ġ/* Ġsub DSL Ġ*/ Ġ} `. Ċ Ġ*/ Ċ internal Ġfun ĠFile Spec . Builder . generate Dsl Function Setter ( ĊĠĠĠ Ġname : ĠString , ĊĠĠĠ Ġbacking PropertyName : ĠString , ĊĠĠĠ Ġbacking PropertyType : ĠK S Type , ĊĠĠĠ Ġbacking Property Index : ĠInt , ĊĠĠĠ Ġexit Function : ĠK S Function Declaration , ĊĠĠĠ Ġrequires No Initialization : ĠBoolean , ĊĠĠĠ Ġgeneration Parameters : ĠGeneration Parameters , ĊĠĠĠ Ġtype Variables : ĠList < Type Variable Name >, ĊĠĠĠ Ġcontext ClassName : ĠType Name , ĊĠĠĠ Ġtype Parameter Resolver : ĠType Parameter Resolver , ĊĠĠĠ Ġd sl Marker : ĠAnnotation Spec , ĊĠĠĠ Ġdata : ĠData , Ċ ) Ġ{ ĊĠĠĠ Ġval Ġinner Context ClassName Ġ= ĊĠĠĠĠĠĠĠ Ġprocess Function ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Function , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgeneration Parameters , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd sl Marker , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Variables , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbacking PropertyType . arguments ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġinner Context TypeName Ġ= ĊĠĠĠĠĠĠĠ Ġbacking PropertyType . arguments ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . to TypeName Fix ( type Parameter Resolver ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . isEmpty ()) Ġinner Context ClassName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġinner Context ClassName . parameter ized By ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġit . copy ( annotations Ġ= Ġit . annotations Ġ+ ĠlistOf ( dsl Marker )) Ġ} ĊĊĠĠĠ Ġadd Import ( inner Context ClassName . packageName , ĠCREATE ) ĊĊĠĠĠ ĠFun Spec . builder ( name ) ĊĠĠĠĠĠĠĠ Ġ. add Annotation ( dsl Marker ) ĊĠĠĠĠĠĠĠ Ġ. make Inline If Requested ( generation Parameters , Ġsuppress Warning Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ. add Type Variables ( type Variables ) ĊĠĠĠĠĠĠĠ Ġ. receiver ( context ClassName ) ĊĠĠĠĠĠĠĠ Ġ. add Parameter ("\ $ builder \ $", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLambda TypeName . get ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceiver Ġ= Ġinner Context TypeName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Ġ= ĠUNIT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( requires No Initialization ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Code ( check No Initialization ( back ing Property Index , Ġbacking PropertyName )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Code ( initialize ( back ing Property Index )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Code ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" this .% N Ġ= Ġ% T ()\ n . apply Ġ{ `\ $ builder \$ `() Ġ}\ n .% N ()\ n ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ $\ $$ back ing PropertyName \ $\ $", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinner Context TypeName . copy ( annotations Ġ= Ġempty List ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCREATE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ. run ( this :: addFunction ) Ċ Ċ }