package Ġpl . os male k . b art ek . compose inject Ċ Ċ import Ġcom . google . auto . service . Auto Service Ċ import Ġcom . squareup . jav ap o et . Annotation Spec Ċ import Ġcom . squareup . jav ap o et . ClassName Ċ import Ġcom . squareup . jav ap o et . Java File Ċ import Ġcom . squareup . jav ap o et . Method Spec Ċ import Ġcom . squareup . jav ap o et . TypeName Ċ import Ġcom . squareup . jav ap o et . Type Spec Ċ import Ġdagger . Bind s Ċ import Ġdagger . Module Ċ import Ġdagger . mult ib ind ings . Class Key Ċ import Ġdagger . mult ib ind ings . Into Map Ċ import Ġjavax . annotation . processing . Abstract Processor Ċ import Ġjavax . annotation . processing . Processor Ċ import Ġjavax . annotation . processing . Round Environment Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . lang . model . Annotated Construct Ċ import Ġjavax . lang . model . Source Version Ċ import Ġjavax . lang . model . element . Annotation Mirror Ċ import Ġjavax . lang . model . element . Element Ċ import Ġjavax . lang . model . element . Element Kind Ċ import Ġjavax . lang . model . element . Modifier Ċ import Ġjavax . lang . model . element . Type Element Ċ import Ġjavax . tools . Diagnostic Ċ Ċ @ Auto Service ( Processor :: class ) Ċ class ĠCompose Inject Processor Ġ: ĠAbstract Processor () Ġ{ ĊĠ Ġprivate Ġvar Ġuser ModuleName : ĠClass Name ? Ġ= Ġnull ĊĊĠ Ġoverride Ġfun Ġget Supported Source Version (): ĠSource Version Ġ= ĠSource Version . latest () ĊĠ Ġoverride Ġfun Ġget Supported Annotation Types () Ġ= Ġset Of ( ĊĠĠĠ ĠCompose Inject :: class . java . canonical Name , ĊĠĠĠ ĠCompose Inject Module :: class . java . canonical Name , ĊĠ Ġ) ĊĊĠ Ġoverride Ġfun Ġprocess ( ĊĠĠĠ Ġannotations : ĠMutable Set < out ĠType Element > ?, ĊĠĠĠ Ġround Env : ĠRound Environment ĊĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġinjected Types Ġ= Ġget Inject ed Types ( round Env ) Ġ?: Ġreturn Ġfalse ĊĠĠĠ Ġval Ġmodule ClassName Ġ= Ġget Module ClassName ( round Env ) Ġ?: Ġreturn Ġfalse ĊĠĠĠ Ġuser ModuleName Ġ= Ġmodule ClassName ĊĠĠĠ Ġval ĠfileName Ġ= Ġmodule ClassName . to Compose Inject ModuleName () ĊĠĠĠ Ġval Ġcompose Module ClassName Ġ= ĠClass Name . get ( module ClassName . packageName (), ĠfileName ) ĊĊĠĠĠ Ġval Ġtype Ġ= Ġbuild Module ( compose Module ClassName , Ġinjected Types ) ĊĠĠĠ Ġval Ġfile Spec Ġ= ĠJava File . builder ( module ClassName . packageName (), Ġtype ) ĊĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġfile Spec . writeTo ( processing Env . filer ) ĊĊĠĠĠ Ġif Ġ( round Env . processing Over () Ġ&& Ġuser ModuleName Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġval Ġuser ModuleName Ġ= Ġuser ModuleName !! ĊĠĠĠĠĠ Ġval Ġcompose Module ClassName Ġ= ĠClass Name . get ( ĊĠĠĠĠĠĠĠ Ġuser ModuleName . packageName (), ĊĠĠĠĠĠĠĠ Ġuser ModuleName . to Compose Inject ModuleName () ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġval Ġuser Module Ġ= ĊĠĠĠĠĠĠĠ Ġprocessing Env . element Utils . getType Element ( user ModuleName . canonical Name ()) ĊĠĠĠĠĠ Ġval Ġannotation Value Ġ= Ġuser Module . getAnnotation (" d agger . Module ") !! ĊĠĠĠĠĠĠĠ Ġ. element Values ĊĠĠĠĠĠĠĠ Ġ. entries ĊĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ Ġit . key . simple Name . content Equals (" includes ") Ġ} ĊĠĠĠĠĠĠĠ Ġ? . value ĊĠĠĠĠĠĠĠ Ġ? . to Mirror Value () Ġas ? ĠM irror Value . Array ĊĠĠĠĠĠ Ġval Ġreferences Generated Module Ġ= Ġannotation Value ?. filter Is Instance < Mirror Value . Type >() ĊĠĠĠĠĠĠĠ Ġ? . map Ġ{ ĠType Name . get ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ? . any Ġ{ Ġit Ġ== Ġcompose Module ClassName Ġ} Ġ?: Ġfalse ĊĠĠĠĠĠ Ġif Ġ(! references Generated Module ) Ġ{ ĊĠĠĠĠĠĠĠ Ġerror ( ĊĠĠĠĠĠĠĠĠĠ Ġ"@ Compose Inject Module 's Ġ@ Module Ġmust Ġinclude Ġ${ compose Module ClassName . simple Name () }", ĊĠĠĠĠĠĠĠĠĠ Ġuser Module ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġbuild Module ( ĊĠĠĠ Ġcompose Module ClassName : ĠClass Name ?, ĊĠĠĠ Ġinjected Types : ĠList < Type Element > ĊĠ Ġ) Ġ= ĠType Spec . class Builder ( compose Module ClassName ) ĊĠĠĠ Ġ. add Annotation ( Module :: class . java ) ĊĠĠĠ Ġ. add Modifiers ( Modifier . PUBLIC , ĠModifier . AB STR ACT ) ĊĠĠĠ Ġ. add Method ( Method Spec . constructor Builder (). add Modifiers ( Modifier . PRIVATE ). build ()) ĊĠĠĠ Ġ. add Methods ( ĊĠĠĠĠĠ Ġinjected Types . map Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype ClassName Ġ= ĠClass Name . get ( it ) ĊĠĠĠĠĠĠĠ ĠMethod Spec . method Builder ( ĊĠĠĠĠĠĠĠĠĠ Ġ" bind _${ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRegex ("\\ . "). replace ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . qualified Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"_" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ}" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( Bind s :: class . java ) ĊĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( Into Map :: class . java ) ĊĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( Compose Inject Map :: class . java ) ĊĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAnnotation Spec . builder ( Class Key :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Member (" value ", Ġ"\ $ T . class ", Ġtype ClassName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PUBLIC , ĠModifier . AB STR ACT ) ĊĠĠĠĠĠĠĠĠĠ Ġ. add Parameter ( type ClassName , Ġ" element ") ĊĠĠĠĠĠĠĠĠĠ Ġ. returns ( Any :: class . java ) ĊĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĠĠĠ Ġ. build () ĊĊĠ Ġprivate Ġfun Ġget Module ClassName ( round Env : ĠRound Environment ): ĠClass Name ? Ġ{ ĊĠĠĠ Ġval Ġmodules Ġ= Ġround Env . getElement s Annotated With ( Compose Inject Module :: class . java ) ĊĠĠĠ Ġif Ġ( modules . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠ Ġerror ("@ Compose Inject Module Ġcan Ġonly Ġbe Ġapplied Ġto Ġsingle ĠModule ", Ġnull ) ĊĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġmodule Ġ= Ġmodules . first OrNull () Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġif Ġ( module . kind Ġ!= ĠElement Kind . CLASS ) Ġ{ ĊĠĠĠĠĠ Ġerror (" Can Ġonly Ġbe Ġapplied Ġto Ġclass ", Ġmodule ) ĊĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( module . getAnnotation (" d agger . Module ") Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġerror (" Can Ġonly Ġbe Ġapplied Ġto ĠD agger ĠModule ", Ġmodule ) ĊĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠClass Name . get ( module Ġas ĠType Element ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget Inject ed Types ( round Env : ĠRound Environment ): ĠList < Type Element >? Ġ{ ĊĠĠĠ Ġreturn Ġround Env . getElement s Annotated With ( Compose Inject :: class . java ) ĊĠĠĠĠĠ Ġ. map Ġ{ Ġelement Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( element . kind Ġ!= ĠElement Kind . CLASS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġerror (" Can Ġonly Ġbe Ġapplied Ġto Ġclass ", Ġelement ) ĊĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( ĊĠĠĠĠĠĠĠĠĠ Ġelement . enc losed Elements . none Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . kind Ġ== ĠElement Kind . CON STRUCTOR Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . getAnnotation ( Inject :: class . java ) Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġerror (" Can Ġonly Ġbe Ġapplied Ġto Ġclass Ġwith Ġ@ Inject Ġconstructor ", Ġelement ) ĊĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelement Ġas ĠType Element ĊĠĠĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠClass Name . to Compose Inject ModuleName () Ġ= ĊĠĠĠ Ġ" Compose Inject _${ simple Names (). join ToString ( separator Ġ= Ġ". ") }" ĊĊĠ Ġprivate Ġfun Ġerror ( message : ĠString , Ġelement : ĠElement ?) Ġ{ ĊĠĠĠ Ġprocessing Env . mess ager . print Message ( ĊĠĠĠĠĠ ĠDiagnostic . Kind . ERROR , ĊĠĠĠĠĠ Ġmessage , ĊĠĠĠĠĠ Ġelement ĊĠĠĠ Ġ) ĊĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠAnnot ated Construct . getAnnotation ( qualified Name : ĠString ): ĠAnnotation Mirror ? Ġ{ ĊĠ Ġreturn Ġannotation Mir rors . first OrNull Ġ{ ĊĠĠĠ Ġ( it . annotation Type . as Element () Ġas ? ĠType Element )?. qualified Name . content Equals ( qualified Name ) ĊĠ Ġ} Ċ } Ċ