package Ġcom . ed ward h ark er . fixture generator Ċ Ċ import Ġcom . google . devtools . k sp . processing .* Ċ import Ġcom . google . devtools . k sp . symbol .* Ċ import Ġcom . google . devtools . k sp . validate Ċ import Ġcom . squareup . kotlin po et . File Spec Ċ import Ġcom . squareup . kotlin po et . K Modifier Ċ import Ġcom . squareup . kotlin po et . Type Spec Ċ import Ġcom . squareup . kotlin po et . k sp . Kotlin Po et K sp Preview Ċ import Ġcom . squareup . kotlin po et . k sp . k sp Dependencies Ċ import Ġcom . squareup . kotlin po et . k sp . writeTo Ċ import Ġjava . util .* Ċ Ċ class ĠFix ture Processor ( ĊĠĠĠ Ġprivate Ġval Ġcode Generator : ĠCode Generator , Ċ ) Ġ: ĠSymbol Processor Ġ{ ĊĠĠĠ Ġprivate Ġval Ġfixture Type Generator Ġ= ĠFix ture Type Generator () ĊĠĠĠ Ġprivate Ġval Ġtypes Ġ= Ġmutable Map Of < TypeName , ĠFix ture Type >() ĊĊĠĠĠ Ġoverride Ġfun Ġprocess ( resolver : ĠResolver ): ĠList < KS Annotated > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsymbols Ġ= Ġresolver . getS ymbols With Annotation ( Fixture :: class . qualified Name !! ) ĊĠĠĠĠĠĠĠ Ġval Ġret Ġ= Ġsymbols . filter Ġ{ Ġ! it . validate () Ġ}. toList () ĊĠĠĠĠĠĠĠ Ġsymbols ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġis ĠK S Class Declaration Ġ&& Ġit . validate () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġit . accept ( Fixture Visitor (), ĠUnit ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġret ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Opt In ( Kotlin Po et K sp Preview :: class ) ĊĠĠĠ Ġoverride Ġfun Ġfinish () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ(( typeName , Ġfixture Type ) Ġin Ġtypes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeclaration Ġ= Ġfixture Type . declaration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpackageName Ġ= Ġdeclaration . packageName . asString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Spec Builder Ġ= Ġfixture Type . create Type Spec Builder ( typeName ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Child Types To Type Spec ( type Spec Builder , Ġfixture Type . children ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Spec Ġ= Ġtype Spec Builder . build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Spec Ġ= ĠFile Spec . builder ( packageName , Ġtype Spec . name !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Type ( type Spec ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Spec . writeTo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcode Generator , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Spec . k sp Dependencies ( aggreg ating Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Child Types To Type Spec ( outer Type Spec Builder : ĠType Spec . Builder , Ġchildren : ĠMap < TypeName , ĠFix ture Type >) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ(( typeName , Ġfixture Type ) Ġin Ġchildren ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Spec Builder Ġ= Ġfixture Type . create Type Spec Builder ( typeName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Child Types To Type Spec ( type Spec Builder , Ġfixture Type . children ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġouter Type Spec Builder . add Type ( type Spec Builder . build ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠFix ture Visitor Ġ: ĠK S Visitor Void () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Class Declaration ( class Declaration : ĠK S Class Declaration , Ġdata : ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( class Declaration . class Kind ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass Kind . CLASS , ĠClass Kind . ENUM _ CLASS Ġ-> Ġclass Declaration . primary Constructor !!. accept ( this , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass Kind . OBJECT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Hierarchy Ġ= Ġbuild Types Hierarchy ( class Declaration ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Spec Ġ= Ġfixture Type Generator . generate From Object ( class Declaration ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Type Spec To Fixture Type ( types , Ġtype Hierarchy , Ġtype Spec , Ġclass Declaration ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass Kind . INTERFACE Ġ-> Ġthrow ĠIllegalArgumentException (" Interfaces Ġcannot Ġbe Ġannotated Ġwith Ġ@ Fixture ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass Kind . ENUM _ ENTRY Ġ-> ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass Kind . AN NOT ATION _ CLASS Ġ-> ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Opt In ( Kotlin Po et K sp Preview :: class ) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Function Declaration ( function : ĠK S Function Declaration , Ġdata : ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Hierarchy Ġ= Ġbuild Types Hierarchy ( function ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Spec Ġ= Ġfixture Type Generator . generate From Constructor ( function ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Type Spec To Fixture Type ( types , Ġtype Hierarchy , Ġtype Spec , Ġfunction ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Type Spec To Fixture Type ( ĊĠĠĠĠĠĠĠ Ġtypes : ĠMutable Map < String , ĠFix ture Type >, ĊĠĠĠĠĠĠĠ Ġtype Hierarchy : ĠDe que < String >, ĊĠĠĠĠĠĠĠ Ġtype Spec : ĠType Spec , ĊĠĠĠĠĠĠĠ Ġdeclaration : ĠK S Declaration ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġtype Hierarchy . pop () ĊĠĠĠĠĠĠĠ Ġvar Ġfixture Type Ġ= Ġtypes [ type ] ĊĠĠĠĠĠĠĠ Ġif Ġ( fixture Type Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfixture Type Ġ= ĠFix ture Type ( declaration ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtypes [ type ] Ġ= Ġfixture Type ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( type Hierarchy . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfixture Type . type Spec Ġ= Ġtype Spec ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Type Spec To Fixture Type ( fixture Type . children , Ġtype Hierarchy , Ġtype Spec , Ġdeclaration ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Types Hierarchy ( declaration : ĠK S Declaration ): ĠDe que < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Hierarchy Ġ= ĠLinkedList < String >() ĊĠĠĠĠĠĠĠ Ġif Ġ( declaration Ġis ĠK S Class Declaration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Hierarchy . push ( declaration . simple Name . asString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġparent Ġ= Ġdeclaration . parent ĊĠĠĠĠĠĠĠ Ġwhile Ġ( parent Ġ!= Ġnull Ġ&& Ġparent Ġis ĠK S Declaration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Hierarchy . push ( parent . simple Name . asString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Ġ= Ġparent . parent ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtype Hierarchy ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠFix ture Type . create Type Spec Builder ( typeName : ĠString ): ĠType Spec . Builder Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtype Spec ?. to Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġfixture Type Generator . generate Empty Fixture Type ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtypeName Ġ= ĠtypeName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontaining File Ġ= Ġdeclaration . containing File !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Visibility Ġ= ĠK Modifier . PUBLIC , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). to Builder () ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠFix ture Processor Provider Ġ: ĠSymbol Processor Provider Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcreate ( ĊĠĠĠĠĠĠĠ Ġenvironment : ĠSymbol Processor Environment ĊĠĠĠ Ġ): ĠSymbol Processor Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFix ture Processor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenvironment . code Generator , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġtype alias ĠType Name Ġ= ĠString Ċ Ċ private Ġdata Ġclass ĠFix ture Type ( ĊĠĠĠ Ġval Ġdeclaration : ĠK S Declaration , ĊĠĠĠ Ġvar Ġtype Spec : ĠType Spec ? Ġ= Ġnull , ĊĠĠĠ Ġvar Ġchildren : ĠMutable Map < TypeName , ĠFix ture Type > Ġ= Ġmutable Map Of (), Ċ ) Ċ