import Ġcom . google . devtools . k sp . processing . Code Generator Ċ import Ġcom . google . devtools . k sp . processing . K SP Logger Ċ import Ġcom . google . devtools . k sp . processing . Resolver Ċ import Ġcom . google . devtools . k sp . processing . Symbol Processor Ċ import Ġcom . google . devtools . k sp . processing . Symbol Processor Environment Ċ import Ġcom . google . devtools . k sp . processing . Symbol Processor Provider Ċ import Ġcom . google . devtools . k sp . symbol . KS Annotated Ċ import Ġcom . google . devtools . k sp . symbol . KS Class Declaration Ċ import Ġcom . google . devtools . k sp . symbol . KS Function Declaration Ċ import Ġcom . google . devtools . k sp . symbol . KS Property Declaration Ċ import Ġcom . google . devtools . k sp . symbol . KS Visitor Void Ċ import Ġcom . google . devtools . k sp . validate Ċ Ċ class ĠProcessor ( ĊĠĠĠ Ġprivate Ġval Ġcode Generator : ĠCode Generator , ĊĠĠĠ Ġprivate Ġval Ġlogger : ĠK SP Logger Ċ ) Ġ: ĠSymbol Processor Ġ{ ĊĊĠĠĠ Ġval Ġall Properties Ġ= Ġmutable Set Of < KS Property Declaration >() ĊĊĠĠĠ Ġoverride Ġfun Ġprocess ( resolver : ĠResolver ): ĠList < KS Annotated > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsymbols Ġ= Ġresolver . getS ymbols With Annotation (" com . example . annotation . Sc rub ") ĊĠĠĠĠĠĠĠ Ġval Ġret Ġ= Ġsymbols . filter Ġ{ Ġ! it . validate () Ġ}. toList () ĊĠĠĠĠĠĠĠ Ġsymbols ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġis ĠK S Class Declaration Ġ|| Ġit Ġis ĠK S Property Declaration Ġ&& Ġit . validate () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġit . accept ( Builder Visitor (), ĠUnit ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġret ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfinish () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġtime Ġto Ġgenerate Ġthe Ġdata ĊĠĠĠĠĠĠĠ ĠGenerator . write Sc rub ber ( all Properties , Ġcode Generator ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġinner Ġclass ĠBuilder Visitor Ġ: ĠK S Visitor Void () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Class Declaration ( class Declaration : ĠK S Class Declaration , Ġdata : ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Declaration . primary Constructor !!. accept ( this , Ġdata ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġhandle Ġscr ub ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Property Declaration ( property : ĠK S Property Declaration , Ġdata : ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġproperty . parent Declaration Ġas ĠK S Class Declaration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġall Properties . add ( property ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġproperty Ġisn 't Ġmutable Ġthen Ġwe Ġneed Ġto Ġcheck Ġif Ġit 's Ġpart Ġof Ġa Ġdata Ġclass ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! property . is Mutable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhas Copy Function Ġ= Ġparent . getAll Functions (). any Ġ{ Ġit . toString () Ġ== Ġ" copy " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! has Copy Function ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Cannot Ġprocess Ġproperty : Ġ$ property . ĠThe Ġproperty Ġmust Ġbe Ġmutable Ġor Ġpart Ġa Ġdata - class ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġhandle Ġ@ Sc rub Ġon Ġtop Ġof Ġa Ġclass ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Function Declaration ( function : ĠK S Function Declaration , Ġdata : ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġfunction . parent Declaration Ġas ĠK S Class Declaration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent . getAll Properties (). forEach Ġ{ Ġvisit Property Declaration ( it , Ġdata ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ class ĠProcessor Provider Ġ: ĠSymbol Processor Provider Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcreate ( ĊĠĠĠĠĠĠĠ Ġenv : ĠSymbol Processor Environment ĊĠĠĠ Ġ): ĠSymbol Processor Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠProcessor ( env . code Generator , Ġenv . logger ) ĊĠĠĠ Ġ} Ċ }