/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 8 ĠSer ge j ĠSh af aren ka , Ġwww . half bit . de Ċ Ġ* Ċ Ġ* Ġ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 Ġmag net . indexer Ċ Ċ import Ġcom . squareup . jav ap o et . ClassName Ċ import Ġcom . squareup . jav ap o et . Code Block Ċ import Ġmag net . indexer . model . Impl Ċ import Ġmag net . indexer . model . Index Ċ import Ġmag net . indexer . model . Index Visitor Ċ import Ġmag net . indexer . model . Range Ċ import Ġmag net . indexer . model . Section Ċ Ċ class ĠIndex Generator Visitor Ġ: ĠIndex Visitor Ġ{ ĊĊĠĠĠ Ġval Ġindex Builder Ġ= ĠCode Block . builder () ĊĠĠĠ Ġval Ġtargets Builder Ġ= ĠCode Block . builder () ĊĊĠĠĠ Ġprivate Ġvar Ġgenerate Single Range Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġcurrent Section : ĠSection ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġsection Index Ġ= Ġ 0 ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ( impl : ĠImp l ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġnop ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ( index : ĠIndex ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġnop ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ( section : ĠSection ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġgenerate Single Range Ġ= Ġsection . ranges . size Ġ== Ġ 1 ĊĠĠĠĠĠĠĠ Ġcurrent Section Ġ= Ġsection ĊĊĠĠĠĠĠĠĠ Ġif Ġ( generate Single Range ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ; ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtargets Name Ġ= Ġ" ranges ${ ++ section Index }" ĊĊĠĠĠĠĠĠĠ Ġindex Builder . add Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" index . put (\ $ T . class , Ġ\$ L )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass Name . best Guess ( section . type ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtargets Name ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġtargets Builder . add Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ $ T < \$ T , Ġ\$ T > Ġ\$ L Ġ= Ġnew Ġ\$ T < >() ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMap :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmag net . internal . Range :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtargets Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHashMap :: class . java ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ( range : ĠRange ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( generate Single Range ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Section ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Builder . add Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" index . put (\ $ T . class , Ġnew Ġ\$ T (\ $ L , Ġ\$ L , Ġ\$ S )) ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass Name . best Guess ( it . type ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmag net . internal . Range :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrange . from , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrange . impl s . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrange . target ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtargets Name Ġ= Ġ" ranges ${ section Index }" ĊĊĠĠĠĠĠĠĠ Ġtargets Builder . add Statement ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ $ L . put (\ $ S , Ġnew Ġ\$ T (\ $ L , Ġ\$ L , Ġ\$ S )) ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtargets Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrange . target , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmag net . internal . Range :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrange . from , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrange . impl s . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrange . target ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ Ċ }