/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠSl aw om ir ĠC zer win ski Ċ Ġ* Ċ Ġ* Ġ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 Ġit . c zer win ski . android . h ilt . processor . model Ċ Ċ import Ġcom . squareup . jav ap o et . Annotation Spec Ċ import Ġcom . squareup . jav ap o et . ClassName Ċ import Ġcom . squareup . jav ap o et . TypeName Ċ import Ġdagger . h ilt . components . Singleton Component Ċ import Ġit . c zer win ski . android . h ilt . processor . className Ċ import Ġit . c zer win ski . android . h ilt . processor . find Annotation OfType Ċ import Ġit . c zer win ski . android . h ilt . processor . scopes And Qual ifiers Ċ import Ġjavax . annotation . processing . Processing Environment Ċ import Ġjavax . lang . model . element . Element Ċ import Ġjavax . lang . model . type . Type Mirror Ċ import Ġjavax . tools . Diagnostic Ċ Ċ class ĠBinding Builder ( private Ġval Ġprocessing Env : ĠProcessing Environment ) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġelement : ĠElement ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġannotation Type : ĠClass < *> ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġfor Element ( element : ĠElement ): ĠBinding Builder Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . element Ġ= Ġelement ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġannotated With ( annotation Type : ĠClass < *> ): ĠBinding Builder Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . annotation Type Ġ= Ġannotation Type ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild (): ĠBinding Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġrequire NotNull ( element ) Ġ{ Ġ" No Ġelement Ġwas Ġset " Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġannotation Type Ġ= Ġrequire NotNull ( annotation Type ) Ġ{ Ġ" No Ġannotation Ġwas Ġset " Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġvisitor Ġ= ĠBound Component Visitor () ĊĊĠĠĠĠĠĠĠ Ġelement . find Annotation OfType ( annotation Type )?. element Values ?. forEach Ġ{ Ġ( element , Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . accept ( visitor , Ġelement . simple Name . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠBinding ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġannotated ClassName Ġ= Ġelement . className (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsup ertype ClassName Ġ= Ġ( visitor . sup ertype ClassName Ġ?: Ġget Sup ertype ClassName ( element )) Ġas ĠClass Name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomponent ClassName Ġ= Ġvisitor . component ClassName Ġas ? ĠClass Name Ġ?: Ġdefault Component ClassName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġannotations Ġ= Ġelement . scopes And Qual ifiers (). map ( Annotation Spec :: get ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Test Ġ= Ġannotation Type . simple Name . startsWith ( TEST _ AN NOT ATION _ PREFIX ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Sup ertype ClassName ( element : ĠElement ): ĠType Name Ġ= ĊĠĠĠĠĠĠĠ ĠType Name . get ( get Sup ertype ( element )) ĊĊĠĠĠ Ġprivate Ġfun Ġget Sup ertype ( element : ĠElement ): ĠType Mirror Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsup ert ypes Ġ= Ġprocessing Env . type Utils . direct Sup ert ypes ( element . as Type ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ ĠType Name . get ( it ) Ġ== ĠType Name . get ( Object :: class . java ) Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( sup ert ypes . size Ġ!= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠerrorMessage Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Class Ġ$ element Ġhas Ġ${ sup ert ypes . size } Ġdirect Ġsup ert ypes : Ġ$ sup ert ypes , Ġbut Ġexactly Ġ 1 Ġrequired " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessing Env . mess ager . print Message ( Diagnostic . Kind . ERROR , ĠerrorMessage ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsup ert ypes . first () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTEST _ AN NOT ATION _ PREFIX Ġ= Ġ" Test " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdefault Component ClassName Ġ= ĠClass Name . get ( Singleton Component :: class . java ) ĊĠĠĠ Ġ} Ċ } Ċ