package Ġdev . f rit z 2 . l enses Ċ Ċ // import Ġnet . lt gt . gradle . inc ap . Incremental Annotation Processor Ċ // import Ġnet . lt gt . gradle . inc ap . Incremental Annotation Processor Type Ċ import Ġcom . squareup . kotlin po et .* Ċ import Ġcom . squareup . kotlin po et . Parameterized TypeName . Companion . plus Parameter Ċ import Ġcom . squareup . kotlin po et . metadata . Immutable Km Class Ċ import Ġcom . squareup . kotlin po et . metadata . Kotlin Po et Metadata Preview Ċ import Ġcom . squareup . kotlin po et . metadata . is Primary Ċ import Ġcom . squareup . kotlin po et . metadata . specs . to Type Spec Ċ import Ġcom . squareup . kotlin po et . metadata . to Immutable Km Class Ċ import Ġdev . f rit z 2 . l enses . L enses Annotation Processor . Companion . FR IT Z 2 _ VIS IBILITY _ OPTION _ NAME Ċ import Ġdev . f rit z 2 . l enses . L enses Annotation Processor . Companion . K AP T _ K OT LIN _ GENERATED _ OPTION _ NAME Ċ import Ġjava . io . File Ċ import Ġjavax . annotation . processing .* Ċ import Ġjavax . lang . model . Source Version Ċ import Ġjavax . lang . model . element . Element Kind Ċ import Ġjavax . lang . model . element . Type Element Ċ import Ġjavax . tools . Diagnostic . Kind . ERROR ĊĊ Ċ @ Kotlin Po et Metadata Preview Ċ @ Supported Annotation Types (" dev . f rit z 2 . l enses . L enses ") Ċ @ Supported Source Version ( Source Version . RELEASE _ 8 ) Ċ @ Supported Options ( K AP T _ K OT LIN _ GENERATED _ OPTION _ NAME , ĠFR IT Z 2 _ VIS IBILITY _ OPTION _ NAME ) Ċ //@ Incremental Annotation Processor ( Incremental Annotation Processor Type . AGG REG ATING ) Ċ class ĠL enses Annotation Processor Ġ: ĠAbstract Processor () Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠK AP T _ K OT LIN _ GENERATED _ OPTION _ NAME Ġ= Ġ" k apt . kotlin . generated " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠFR IT Z 2 _ VIS IBILITY _ OPTION _ NAME Ġ= Ġ" f rit z 2 . visibility " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprocess ( annotations : ĠMutable Set < out ĠType Element > ?, Ġround Env : ĠRound Environment ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvisibility Ġ= Ġprocessing Env . options [ FR IT Z 2 _ VIS IBILITY _ OPTION _ NAME ] ĊĠĠĠĠĠĠĠ Ġval Ġk apt Kotlin Generated Dir Ġ= Ġprocessing Env . options [ K AP T _ K OT LIN _ GENERATED _ OPTION _ NAME ] Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessing Env . mess ager . print Message ( ERROR , Ġ" Can 't Ġfind Ġthe Ġtarget Ġdirectory Ġfor Ġgenerated ĠKotlin Ġfiles .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ċ Ċ // ĠĠĠĠĠĠĠ Ġval Ġclass Inspector Ġ= ĠElements Class Inspector . create ( processing Env . element Utils , Ġprocessing Env . type Utils ) ĊĠĠĠĠĠĠĠ Ġval Ġannotated Elements Ġ= Ġround Env ?. getElement s Annotated With ( L enses :: class . java ) ĊĠĠĠĠĠĠĠ Ġif Ġ( annotated Elements Ġ== Ġnull Ġ|| Ġannotated Elements . isEmpty ()) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġclasses Without Package Ġ= Ġannotated Elements ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . kind Ġ== ĠElement Kind . CLASS Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit Ġas ĠType Element Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . to Immutable Km Class () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġit . name . contains ('/') Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( classes Without Package . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġannotated Elements ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . kind Ġ== ĠElement Kind . CLASS Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit Ġas ĠType Element Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. associate With Ġ{ Ġit . to Type Spec () Ġto Ġit . to Immutable Km Class () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. groupBy Ġ{ Ġ( element , Ġ_) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocessing Env . element Utils . get Package Of ( element ). qualified Name . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġ( pack , Ġclasses ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Spec Builder Ġ= ĠFile Spec . builder ( pack , Ġ" Generated L enses ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Comment (" GENERATED Ġby Ġf rit z 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Comment (" Ġ- ĠNE VER ĠCHANGE ĠCONTENT ĠMAN U ALLY !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Import (" dev . f rit z 2 . l enses ", Ġ" build Lens ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl enses Object Ġ= ĠType Spec . object Builder (" L "). add Modifiers ( visibility . as Visibility Modifier ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclasses . forEach Ġ{ Ġ( element , Ġclass Data ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl enses Object . add Type ( handle Data Class ( element , Ġclass Data . first , Ġclass Data . second )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Spec Builder . add Type ( l enses Object . build ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Spec Builder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. writeTo ( File ( k apt Kotlin Generated Dir ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmkdir () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessing Env . mess ager . print Message ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠERROR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"@ L enses Ġannotation Ġcan 't Ġbe Ġapplied Ġto Ġdata Ġclasses Ġoutside Ġof Ġa Ġpackage ! Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Please Ġadd Ġpackage Ġdeclarations Ġto Ġthe Ġfollowing Ġclasses : Ġ${ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclasses Without Package . join ToString (", Ġ") Ġ{ Ġit . name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠString ?. as Visibility Modifier ( default : ĠK Modifier Ġ= ĠK Modifier . PUBLIC ): ĠK Modifier Ġ= Ġset Of ( ĊĠĠĠĠĠĠĠ ĠK Modifier . PUBLIC , ĊĠĠĠĠĠĠĠ ĠK Modifier . PROTECT ED , ĊĠĠĠĠĠĠĠ ĠK Modifier . PRIVATE , ĊĠĠĠĠĠĠĠ ĠK Modifier . INTERNAL , ĊĠĠĠ Ġ). find Ġ{ Ġit . name . equals ( this , Ġtrue ) Ġ} Ġ?: Ġdefault ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Data Class ( element : ĠType Element , Ġclass Data : ĠType Spec , Ġkm Class Data : ĠImmutable Km Class ): ĠType Spec Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclass Spec Ġ= ĠType Spec . object Builder ( class Data . name Ġ?: Ġ" unknown ") ĊĠĠĠĠĠĠĠ Ġval Ġctor Param Names Ġ= Ġkm Class Data . construct ors . first Ġ{ Ġit . is Primary Ġ}. value Parameters . map Ġ{ Ġit . name Ġ} ĊĠĠĠĠĠĠĠ Ġclass Data . property Specs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġctor Param Names . contains ( it . name ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġproperty Data Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Spec . addProperty (( handle Field ( element . as ClassName (), Ġproperty Data ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġclass Spec . build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Field ( className : ĠClass Name , Ġproperty Data : ĠProperty Spec ): ĠProperty Spec Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġattribute Name Ġ= Ġproperty Data . name ĊĊĠĠĠĠĠĠĠ Ġval Ġlens TypeName Ġ= ĠClass Name (" dev . f rit z 2 . l enses ", Ġ" Lens ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// . plus Parameter ( ClassName (" kotlin "," String ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. plus Parameter ( className ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. plus Parameter ( property Data . type ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠProperty Spec . builder ( attribute Name , Ġlens TypeName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. initializer (" build Lens (% S , Ġ{ Ġit .$ attribute Name Ġ}, Ġ{ Ġp , Ġv Ġ-> Ġp . copy ($ attribute Name Ġ= Ġv )}) ", Ġattribute Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} Ċ Ċ } Ċ