/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 Ġandroidx . room . compiler . processing . k sp Ċ Ċ import Ġandroidx . room . compiler . processing . X Basic Annotation Processor Ċ import Ġandroidx . room . compiler . processing . X Element Ċ import Ġandroidx . room . compiler . processing . X Processing Env Ċ import Ġcom . google . devtools . k sp . is Local Ċ 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 . symbol . KS Annotated Ċ import Ġcom . google . devtools . k sp . symbol . KS Declaration Ċ import Ġcom . google . devtools . k sp . validate Ċ Ċ /** Ċ Ġ* ĠK SP Ġimplementation Ġof Ġa Ġ[ X Basic Annotation Processor ] Ġwith Ġbuilt - in Ġsupport Ġfor Ġvalidating Ġand Ċ Ġ* Ġdef erring Ġsymbols . Ċ Ġ*/ Ċ abstract Ġclass ĠK sp Basic Annotation Processor ( ĊĠĠĠ Ġval Ġsymbol Processor Environment : ĠSymbol Processor Environment Ċ ) Ġ: ĠSymbol Processor , ĠX Basic Annotation Processor Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġx Env Ġ= ĠK sp Processing Env ( ĊĠĠĠĠĠĠĠ Ġsymbol Processor Environment . options , ĊĠĠĠĠĠĠĠ Ġsymbol Processor Environment . code Generator , ĊĠĠĠĠĠĠĠ Ġsymbol Processor Environment . logger ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġfinal Ġoverride Ġval Ġx Processing Env : ĠX Processing Env Ġget () Ġ= Ġx Env ĊĊĠĠĠ Ġ// ĠCache Ġand Ġl az ily Ġget Ġsteps Ġduring Ġthe Ġinitial Ġprocess () Ġso Ġsteps Ġinitialization Ġis Ġdone Ġonce . ĊĠĠĠ Ġprivate Ġval Ġsteps Ġby Ġlazy Ġ{ Ġprocessing Steps () Ġ} ĊĊĠĠĠ Ġfinal Ġoverride Ġfun Ġprocess ( resolver : ĠResolver ): ĠList < KS Annotated > Ġ{ ĊĠĠĠĠĠĠĠ Ġx Env . resolver Ġ= Ġresolver Ġ// ĠSet Ġthe Ġresolver Ġat Ġthe Ġbeginning Ġof Ġeach Ġround ĊĠĠĠĠĠĠĠ Ġval Ġx Round Env Ġ= ĠK sp Round Env ( x Env ) ĊĠĠĠĠĠĠĠ Ġval Ġdeferred Elements Ġ= Ġsteps . flatMap Ġ{ Ġstep Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinvalid Elements Ġ= Ġmutable Set Of < X Element >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelements By Annotation Ġ= Ġstep . annotations (). map NotNull Ġ{ Ġannotation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġannotated Elements Ġ= Ġx Round Env . getElement s Annotated With ( annotation ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalid Elements Ġ= Ġannotated Elements ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ( it Ġas ĠK sp Element ). declaration . validate Except Local s () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toSet () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvalid Elements . addAll ( annotated Elements Ġ- Ġvalid Elements ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( valid Elements . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotation Ġto Ġvalid Elements ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toMap () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOnly Ġprocess Ġthe Ġstep Ġif Ġthere Ġare Ġannotated Ġelements Ġfound Ġfor Ġthis Ġstep . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( elements By Annotation . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvalid Elements Ġ+ Ġstep . process ( x Env , Ġelements By Annotation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvalid Elements ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpost Round ( x Env , Ġx Round Env ) ĊĠĠĠĠĠĠĠ Ġx Env . clear Cache () Ġ// ĠReset Ġcache Ġafter Ġevery Ġround Ġto Ġavoid Ġle aking Ġelements Ġacross Ġrounds ĊĠĠĠĠĠĠĠ Ġreturn Ġdeferred Elements . map Ġ{ Ġ( it Ġas ĠK sp Element ). declaration Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠTODO Ġremove Ġthis Ġonce Ġwe Ġupdate Ġto ĠK SP Ġbeta 0 3 Ċ Ġ* Ġhttps :// github . com / google / k sp / pull / 4 7 9 Ċ Ġ*/ Ċ private Ġfun ĠK S Annotated . validate Except Local s (): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġthis . validate Ġ{ Ġparent , Ġcurrent Ġ-> ĊĠĠĠĠĠĠĠ Ġ// Ġskip Ġlocals ĊĠĠĠĠĠĠĠ Ġ// Ġhttps :// github . com / google / k sp / issues / 4 8 9 ĊĠĠĠĠĠĠĠ Ġval Ġskip Ġ= Ġ( parent Ġas ? ĠK S Declaration )?. is Local () Ġ== Ġtrue Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( current Ġas ? ĠK S Declaration )?. is Local () Ġ== Ġtrue ĊĠĠĠĠĠĠĠ Ġ! skip ĊĠĠĠ Ġ} Ċ }