/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 5 ĠAir bnb , ĠInc . Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . air bnb . dee plink dispatch Ċ Ċ import Ġandroidx . room . compiler . processing . X Annotation Ċ import Ġandroidx . room . compiler . processing . X Element Ċ import Ġandroidx . room . compiler . processing . XF iler Ċ import Ġandroidx . room . compiler . processing . X Method Element Ċ import Ġandroidx . room . compiler . processing . X Processing Env Ċ import Ġandroidx . room . compiler . processing . XR ound Env Ċ import Ġandroidx . room . compiler . processing . X Type Ċ import Ġandroidx . room . compiler . processing . X Type Element Ċ import Ġandroidx . room . compiler . processing . add Origin ating Element Ċ import Ġandroidx . room . compiler . processing . get Ċ import Ġandroidx . room . compiler . processing . writeTo Ċ import Ġcom . air bnb . dee plink dispatch . Processor Utils . de capitalize IfNot Two First Chars UpperCase Ċ import Ġcom . air bnb . dee plink dispatch . Processor Utils . has Empty OrNull String Ċ import Ġcom . air bnb . dee plink dispatch . base . Utils Ċ import Ġcom . air bnb . dee plink dispatch . base . Utils . is Configurable Path Segment Ċ import Ġcom . google . devtools . k sp . processing . Symbol Processor Environment Ċ import Ġcom . squareup . jav ap o et . ClassName Ċ import Ġcom . squareup . jav ap o et . Code Block Ċ 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 . Parameter Spec Ċ import Ġcom . squareup . jav ap o et . Parameterized TypeName Ċ import Ġcom . squareup . jav ap o et . Type Spec Ċ import Ġjava . io . IOException Ċ import Ġjava . net . Malformed URLException Ċ import Ġjava . util . Arrays Ċ import Ġjavax . lang . model . Source Version Ċ import Ġjavax . lang . model . element . Modifier Ċ import Ġjavax . tools . Diagnostic Ċ import Ġkotlin . collections . HashSet Ċ import Ġkotlin . reflect . K Class Ċ Ċ class ĠDeep Link Processor ( symbol Processor Environment : ĠSymbol Processor Environment ? Ġ= Ġnull ) Ġ: ĊĠĠĠ ĠBase Processor ( symbol Processor Environment ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġdocument or Ġby Ġlazy Ġ{ ĠDocument or ( environment ) Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġincremental Metadata : ĠIncrement al Metadata Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠIncrement al Metadata ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġincremental Ġ= Ġenvironment . options [ OPTION _ INCREMENT AL ]. to Boolean (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Annotations Ġ= Ġenvironment . options [ OPTION _ CUSTOM _ AN NOT ATIONS ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . split ("| ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . map NotNull Ġ{ Ġenvironment . find Type Element ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . toSet () Ġ?: Ġempty Set () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġsupported Base Annotations : ĠSet < X Type Element > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDeep Link :: class , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDeep Link Handler :: class , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDeep Link Module :: class , ĊĠĠĠĠĠĠĠ Ġ). map Ġ{ Ġenvironment . require Type Element ( it ) Ġ}. toSet () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOverrides Ġfor ĠAbstract Processor ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġoverride Ġfun Ġget Supported Annotation Types (): ĠSet < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( incremental Metadata . incremental ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( supported Base Annotations Ġ+ Ġincremental Metadata . custom Annotations ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . qualified Name Ġ}. toSet () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġset Of ("* ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Supported Source Version (): ĠSource Version Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSource Version . latest Supported () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Supported Options (): ĠSet < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsupported Options Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDocument or . DOC _ OUTPUT _ PROPERTY _ NAME , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOPTION _ CUSTOM _ AN NOT ATIONS , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOPTION _ INCREMENT AL , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( incremental Metadata . incremental ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" org . gradle . annotation . processing . aggreg ating " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġ). filter NotNull () ĊĠĠĠĠĠĠĠ Ġreturn Ġsupported Options . toSet () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEnd Ġoverrides Ġfor ĠAbstract Processor ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġoverride Ġfun Ġprocess ( ĊĠĠĠĠĠĠĠ Ġannotations : ĠSet < X Type Element > ?, ĊĠĠĠĠĠĠĠ Ġenvironment : ĠX Processing Env , ĊĠĠĠĠĠĠĠ Ġround : ĠX Round Env ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġrun ĠK SP Ġor Ġthis Ġis Ġconfigured Ġto Ġbe Ġincremental Ġwe Ġneed Ġto Ġrely Ġon Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġincremental Metadata Ġfor Ġcustom Ġannotations . ĠIf Ġnot Ġfilter Ġthem Ġout Ġof Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġset Ġof Ġannotations Ġwe Ġwere Ġgiven . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcustom Annotations Ġ= Ġif Ġ( incremental Metadata . incremental Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenvironment . backend Ġ== ĠX Processing Env . Backend . K SP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġincremental Metadata . custom Annotations ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotations ?. filter Annotated Annotations ( Deep Link Spec :: class ) Ġ?: Ġempty Set () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Deep Link Annotated Elements Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Annotations . flatMap Ġ{ Ġround . getElement s Annotated With ( it . qualified Name ) Ġ} Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġround . getElement s Annotated With ( DE EP _ LINK _ CLASS ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġannotated Method Elements Ġ= Ġall Deep Link Annotated Elements . filter Is Instance < X Method Element >(). toSet () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġannotated Class Elements Ġ= Ġall Deep Link Annotated Elements . filter Is Instance < X Type Element >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . is Class () Ġ}. toSet () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Annotated Type ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall Deep Link Annotated Elements , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotated Class Elements , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotated Method Elements ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate ĠDeep Link Delegate Ġclasses ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Dee plink Deleg ates ( round Env Ġ= Ġround ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate ĠDeep Link Registry Ġclasses ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Dee plink Regist ries ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġround Env Ġ= Ġround , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotated Class Elements Ġ= Ġannotated Class Elements , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotated Method Elements Ġ= Ġannotated Method Elements , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeep Link Elements Ġ= Ġcollect Deep Link Elements ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefixes Ġ= Ġcustom Annotation Prefixes ( custom Annotations ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Elements To Process Ġ= Ġannotated Class Elements , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Elements To Process Ġ= Ġannotated Method Elements ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠDeep Link Processor Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Ġ= Ġe . element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġe . message Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcollect Deep Link Elements ( ĊĠĠĠĠĠĠĠ Ġprefixes : ĠMap < X Type , ĠArray < String >>, ĊĠĠĠĠĠĠĠ Ġclass Elements To Process : ĠSet < X Type Element >, ĊĠĠĠĠĠĠĠ Ġmethod Elements To Process : ĠSet < X Method Element > ĊĠĠĠ Ġ): ĠList < Deep Link Annotated Element > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Elements To Process . flatMap Ġ{ Ġelement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap U ris To Deep Link Annotated Element ( element , Ġprefixes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ+ Ġmethod Elements To Process . flatMap Ġ{ Ġelement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify Method ( element ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap U ris To Deep Link Annotated Element ( element , Ġprefixes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). filter NotNull () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmap U ris To Deep Link Annotated Element ( ĊĠĠĠĠĠĠĠ Ġelement : ĠXElement , ĊĠĠĠĠĠĠĠ Ġprefixes : ĠMap < X Type , ĠArray < String >> ĊĠĠĠ Ġ): ĠList < Deep Link Annotated Element ?> Ġ= ĠgetAll U ris For Annotated Element ( element , Ġprefixes ). map NotNull Ġ{ Ġuri Ġ-> ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠX Method Element Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDeep Link Annotated Element . Method Annotated Element ( uri , Ġelement ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠDeep Link Annotated Element . Class Annotated Element ( uri , Ġelement Ġas ĠX Type Element ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠMal formed URLException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenvironment . mess ager . print Message ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkind Ġ= ĠDiagnostic . Kind . ERROR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg Ġ= Ġ" Malformed ĠDeep ĠLink ĠURL Ġ$ uri " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetAll U ris For Annotated Element ( ĊĠĠĠĠĠĠĠ Ġelement : ĠXElement , ĊĠĠĠĠĠĠĠ Ġprefixes : ĠMap < X Type , ĠArray < String >> ĊĠĠĠ Ġ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠgetAll Dee plink Ur Is From Custom Deep Links On Element ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement Ġ= Ġelement , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprefixes Map Ġ= Ġprefixes ĊĠĠĠĠĠĠĠ Ġ) Ġ+ Ġ( element . getAnnotation ( DE EP _ LINK _ CLASS )?. value ?. value ?. toList () Ġ?: Ġempty List ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġverify Method ( method Element : ĠX Method Element ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! method Element . is Static ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Ġ= Ġmethod Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" Only Ġstatic Ġmethods Ġcan Ġbe Ġannotated Ġwith Ġ@ ${ DE EP _ LINK _ CLASS . simple Name }", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠFIXME ĠThis Ġis Ġcrash ing Ġwith Ġan ĠN PE Ġon Ġinternal Ġclasses Ġwhen Ġaccessing Ġthe ĠreturnType . ĊĠĠĠĠĠĠĠ Ġ// ĠYou Ġcan Ġj ut Ġcomment Ġthis Ġcheck Ġout Ġfor Ġnow Ġif Ġyou Ġneed Ġthis Ġto Ġpass . ĊĠĠĠĠĠĠĠ Ġif Ġ( method Element . returnType . type Element ?. qualified Name Ġ! in ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" android . content . Intent ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" android x . core . app . Task Stack Builder ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" com . air bnb . dee plink dispatch . Deep Link MethodResult " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Ġ= Ġmethod Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Only Ġ` Intent `, Ġ` android x . core . app . Task Stack Builder ` Ġor Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"' com . air bnb . dee plink dispatch . Deep Link MethodResult ' Ġare Ġsupported . ĠPlease Ġdouble Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" check Ġyour Ġimports Ġand Ġtry Ġagain ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcustom Annotation Prefixes ( custom Annotations : ĠSet < X Type Element >): ĠMap < X Type , ĠArray < String >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcustom Annotations . map Ġ{ Ġcustom Annotation Type Element Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! custom Annotation Type Element . is Annotation Class ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Ġ= Ġcustom Annotation Type Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" Only Ġannotation Ġtypes Ġcan Ġbe Ġannotated Ġwith Ġ@ ${ DE EP _ LINK _ SPEC _ CLASS . simple Name }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprefix : ĠArray < String > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Annotation Type Element . getAnnotation ( DE EP _ LINK _ SPEC _ CLASS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġit . value . prefix Ġ} Ġ?: Ġempty Array () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prefix . has Empty OrNull String ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Ġ= Ġcustom Annotation Type Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" Prefix Ġproperty Ġcannot Ġhave Ġnull Ġor Ġempty Ġstrings " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prefix . isEmpty ()) Ġlog Error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Ġ= Ġcustom Annotation Type Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" Prefix Ġproperty Ġcannot Ġbe Ġempty " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Annotation Type Element . type Ġto Ġprefix ĊĠĠĠĠĠĠĠ Ġ}. toMap () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġverify Annotated Type ( ĊĠĠĠĠĠĠĠ Ġall Annotated Elements : ĠList < X Element >, ĊĠĠĠĠĠĠĠ Ġannotated Class Elements : ĠSet < X Type Element >, ĊĠĠĠĠĠĠĠ Ġannotated Method Elements : ĠSet < X Method Element > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġall Annotated Elements . filter Ġ{ Ġannotated Element Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! annotated Class Elements . contains ( annotated Element ) Ġ&& Ġ! annotated Method Elements . contains ( annotated Element ) ĊĠĠĠĠĠĠĠ Ġ}. forEach Ġ{ Ġannotated Element That Is Ne ither Class Nor Method Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Ġ= Ġannotated Element That Is Ne ither Class Nor Method , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" Only Ġclasses Ġand Ġmethods Ġcan Ġbe Ġannotated Ġwith Ġ@ ${ DE EP _ LINK _ CLASS . simple Name }", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Dee plink Deleg ates ( round Env : ĠX Round Env ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdee plink Handler Annotated Elements Ġ= Ġround Env . getElement s Annotated With ( Deep Link Handler :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Is Instance < X Type Element >() ĊĠĠĠĠĠĠĠ Ġdee plink Handler Annotated Elements . forEach Ġ{ Ġdeep Link Handler Element Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeep Link Module Elements Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeep Link Handler Element . getAnnotation ( Deep Link Handler :: class )?. getAs TypeList (" value ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . map Ġ{ Ġit . type Element !! Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( deep Link Module Elements Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Catch File Writing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Deep Link Delegate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeep Link Handler Element . packageName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeep Link Module Elements , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeep Link Handler Element ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Dee plink Regist ries ( ĊĠĠĠĠĠĠĠ Ġround Env : ĠX Round Env , ĊĠĠĠĠĠĠĠ Ġannotated Class Elements : ĠSet < X Type Element >, ĊĠĠĠĠĠĠĠ Ġannotated Method Elements : ĠSet < X Method Element >, ĊĠĠĠĠĠĠĠ Ġdeep Link Elements : ĠList < Deep Link Annotated Element > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdeep Link Module Annotated Elements Ġ= Ġround Env . getElement s Annotated With ( Deep Link Module :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Is Instance < X Type Element >() ĊĠĠĠĠĠĠĠ Ġdeep Link Module Annotated Elements . forEach Ġ{ Ġdeep Link Module Element Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Catch File Writing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Deep Link Registry ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠpackageName Ġ= Ġdeep Link Module Element . packageName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠclassName Ġ= Ġdeep Link Module Element . className . simple Name (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeep Link Elements Ġ= Ġdeep Link Elements , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin ating Elements Ġ= Ġannotated Class Elements Ġ+ Ġannotated Method Elements Ġ+ Ġdeep Link Module Element ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtry Catch File Writing ( action : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction . invoke () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenvironment . mess ager . print Message ( Diagnostic . Kind . ERROR , Ġ" Error Ġcreating Ġfile : Ġ${ e . stack Trace ToString () }") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠRuntimeException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenvironment . mess ager . print Message ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDiagnostic . Kind . ERROR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Internal Ġerror Ġduring Ġannotation Ġprocessing : Ġ${ e . stack Trace ToString () }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġgenerate Deep Link Delegate ( ĊĠĠĠĠĠĠĠ ĠpackageName : ĠString , ĊĠĠĠĠĠĠĠ Ġregistry Classes : ĠList < X Type Element >, ĊĠĠĠĠĠĠĠ Ġorigin ating Element : ĠXElement ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodule Regist ries Argument Ġ= ĠCode Block . builder () ĊĠĠĠĠĠĠĠ Ġval Ġtotal Elements Ġ= Ġregistry Classes . size ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġtotal Elements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodule Regist ries Argument . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ $ L \$ L ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmoduleName To Registry Name ( registry Classes [ i ]). de capitalize IfNot Two First Chars UpperCase (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ< Ġtotal Elements Ġ- Ġ 1 ) Ġ", \ n " Ġelse Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġregist ries Initializer Builder Ġ= ĠCode Block . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" super (\ $ T . asList (\ n ", ĠClass Name . get ( Arrays :: class . java )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. indent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( module Regist ries Argument . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ("\ n "). un indent (). add (" )); \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġregist ries Initializer Builder With Path Variables Ġ= ĠCode Block . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" super (\ $ T . asList (\ n ", ĠClass Name . get ( Arrays :: class . java )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. indent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( module Regist ries Argument . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" ), \ n configurable Path Segment Replacement s "). un indent (). add ("\ n );\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġconstructor Ġ= ĠMethod Spec . constructor Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PUBLIC ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameters ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregistry Classes . map Ġ{ Ġregistry Class Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParameter Spec . builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodule Element To Registry ClassName ( registry Class ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmoduleName To Registry Name ( registry Class ). de capitalize IfNot Two First Chars UpperCase () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code ( regist ries Initializer Builder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġconfigurable Path Segment Replacement s Param Ġ= ĠParameter Spec . builder ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠParameter ized TypeName . get ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMutable Map :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" configurable Path Segment Replacement s " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġconstructor With Path Variables Ġ= ĠMethod Spec . constructor Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PUBLIC ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameters ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregistry Classes . map Ġ{ Ġregistry Class Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParameter Spec . builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodule Element To Registry ClassName ( registry Class ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmoduleName To Registry Name ( registry Class ). de capitalize IfNot Two First Chars UpperCase () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter ( configurable Path Segment Replacement s Param ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code ( regist ries Initializer Builder With Path Variables ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġdeep Link Delegate Builder Ġ= ĠType Spec . class Builder (" Deep Link Delegate ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PUBLIC , ĠModifier . FINAL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. super class ( CLASS _ BASE _ DE EP _ LINK _ DE LEG ATE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Method ( constructor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Method ( constructor With Path Variables ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Origin ating Element ( origin ating Element ) ĊĠĠĠĠĠĠĠ ĠJava File . builder ( packageName , Ġdeep Link Delegate Builder . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. writeTo ( environment . filer , ĠX F iler . Mode . Is ol ating ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlog Error ( element : ĠXElement ?, Ġmessage : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġenvironment . mess ager . print Message ( Diagnostic . Kind . ERROR , Ġmessage , Ġelement ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġgenerate Deep Link Registry ( ĊĠĠĠĠĠĠĠ ĠpackageName : ĠString , ĊĠĠĠĠĠĠĠ ĠclassName : ĠString , ĊĠĠĠĠĠĠĠ Ġdeep Link Elements : ĠList < Deep Link Annotated Element >, ĊĠĠĠĠĠĠĠ Ġorigin ating Elements : ĠSet < X Element > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdeep Link Elements . sorted With (:: dee plink Annotated Element Compare ) ĊĠĠĠĠĠĠĠ Ġdocument or . write ( deep Link Elements ) ĊĠĠĠĠĠĠĠ Ġval Ġur is T rie Ġ= ĠRoot () ĊĠĠĠĠĠĠĠ Ġval Ġpath Variable Keys : ĠMutable Set < String > Ġ= ĠHashSet () ĊĠĠĠĠĠĠĠ Ġfor Ġ( element : ĠDeep Link Annotated Element Ġin Ġdeep Link Elements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Template Ġ= Ġelement . uri ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDeep Link Annotated Element . Class Annotated Element Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġur is T rie . addTo T rie ( uri Template , Ġelement . annotated Class . className . reflection Name () Ġ?: Ġ"", Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDeep Link Annotated Element . Method Annotated Element Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġur is T rie . addTo T rie ( uri Template , Ġelement . annotated Class . className . reflection Name () Ġ?: Ġ"", Ġelement . method ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Ġ= Ġelement . annotated Class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġe . message Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdee plink Uri Ġ= ĠDeep Link Uri . parse Template ( uri Template ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠKeep Ġtrack Ġof Ġpath Variables Ġadded Ġin Ġa Ġmodule Ġso Ġthat Ġwe Ġcan Ġcheck Ġat Ġruntime Ġto Ġensure ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthat Ġall Ġpath Variables Ġhave Ġa Ġcorresponding Ġentry Ġprovided Ġto ĠBase Deep Link Delegate . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( path Segment : ĠString Ġin Ġdee plink Uri . path Segments ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Configurable Path Segment ( path Segment )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Variable Keys . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Segment . substring ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfigurable Path Segment Prefix . length , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Segment . length Ġ- Ġconfigurable Path Segment Suffix . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdeep Link Registry Builder Ġ= ĠType Spec . class Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( className Ġ+ ĠREG ISTR Y _ CLASS _ SUFFIX ) ĊĠĠĠĠĠĠĠ Ġ). add Modifiers ( Modifier . PUBLIC , ĠModifier . FINAL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. super class ( ClassName . get ( Base Registry :: class . java )) ĊĠĠĠĠĠĠĠ Ġval Ġstring Method Names Ġ= ĠgetString Method Names ( uris T rie , Ġdeep Link Registry Builder ) ĊĠĠĠĠĠĠĠ Ġval Ġconstructor Ġ= ĠMethod Spec . constructor Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PUBLIC ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCode Block . builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" super (\ $ T . read Match Index From Strings ( Ġnew ĠString [] Ġ{$ string Method Names })", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCLASS _ UTILS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code ( generate PathVariable Keys Block ( path Variable Keys )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġ// ĠFor Ġdebugging Ġit Ġis Ġnice Ġto Ġhave Ġa Ġfile Ġversion Ġof Ġthe Ġindex , Ġjust Ġcomment Ġthis Ġin Ġto Ġget ĊĠĠĠĠĠĠĠ Ġ// Ġon Ġin Ġthe Ġclasspath Ċ // ĠĠĠ ĠFile Object Ġindex Resource Ġ= Ġf iler . create Resource ( Standard Location . CLASS _ OUTPUT , Ġ"", Ċ // ĠĠĠ ĠMatch Index . get Match Idx FileName ( className )); Ċ // ĠĠĠ Ġur is T rie . writeTo Out out Stream ( index Resource . open OutputStream ()); ĊĠĠĠĠĠĠĠ Ġdeep Link Registry Builder . add Method ( constructor ) ĊĠĠĠĠĠĠĠ Ġorigin ating Elements . forEach Ġ{ Ġorigin ating Element Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeep Link Registry Builder . add Origin ating Element ( origin ating Element ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠJava File . builder ( packageName , Ġdeep Link Registry Builder . build ()). build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. writeTo ( environment . filer , ĠX F iler . Mode . Ag greg ating ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate PathVariable Keys Block ( path Variable Keys : ĠSet < String >): ĠCode Block Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpath Variable Keys Builder Ġ= ĠCode Block . builder () ĊĠĠĠĠĠĠĠ Ġpath Variable Keys Builder . add ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ", \ n " Ġ+ Ġ" new Ġ\$ T []{ ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClass Name . get ( String :: class . java ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġpath Variable Keys Array Ġ= Ġpath Variable Keys . to Typed Array () ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġpath Variable Keys Array . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath Variable Keys Builder . add ("\ $ S ", Ġpath Variable Keys Array [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ< Ġpath Variable Keys Array . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Variable Keys Builder . add (", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpath Variable Keys Builder . add (" }); \ n ") ĊĠĠĠĠĠĠĠ Ġreturn Ġpath Variable Keys Builder . build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġmethods Ġcontaining Ġthe ĠStrings Ġto Ġstore Ġthe Ġmatch Ġindex Ġto Ġthe Ġdeep Link Registry Builder Ġand ĊĠĠĠĠ Ġ* Ġreturn Ġa Ġstring Ġwhich Ġcontains Ġthe Ġcalls Ġto Ġthose Ġmethods . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġe . g . Ġ" method 1 (), Ġmethod 2 ()" Ġetc . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġur is T rie ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThe Ġ[ Url Tree ] Ġcontaining Ġall ĠUrl s Ġthat Ġcan Ġbe Ġmatched . ĊĠĠĠĠ Ġ* Ġ@ param Ġdeep Link Registry Builder ĠThe Ġbuilder Ġused Ġto Ġadd Ġthe Ġmethods ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠgetString Method Names ( ĊĠĠĠĠĠĠĠ Ġur is T rie : ĠRoot , ĊĠĠĠĠĠĠĠ Ġdeep Link Registry Builder : ĠType Spec . Builder ĊĠĠĠ Ġ): ĠStringBuilder Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstring Method Names Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġfor Ġ(( i , Ġchar Sequence : ĠCharSequence ) Ġin Ġur is T rie . getString s (). with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠmethodName Ġ= Ġ" match Index $ i " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstring Method Names . append ( methodName ). append (" (), Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeep Link Registry Builder . add Method ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Spec . method Builder ( methodName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . PRIVATE , ĠModifier . STATIC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( String :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code ( Code Block . builder (). add (" return Ġ\$ S ;", Ġchar Sequence ). build ()). build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġstring Method Names ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠIncrement al Metadata ( val Ġincremental : ĠBoolean , Ġval Ġcustom Annotations : ĠSet < X Type Element >) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠPACK AGE _ NAME Ġ= Ġ" com . air bnb . dee plink dispatch " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠOPTION _ CUSTOM _ AN NOT ATIONS Ġ= Ġ" deep Link . custom Annotations " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠOPTION _ INCREMENT AL Ġ= Ġ" deep Link . incremental " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠCLASS _ BASE _ DE EP _ LINK _ DE LEG ATE Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClass Name . get ( PACKAGE _ NAME , Ġ" Base Deep Link Delegate ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠCLASS _ UTILS Ġ= ĠClass Name . get ( Utils :: class . java ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠDE EP _ LINK _ CLASS Ġ= ĠDeep Link :: class ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠDE EP _ LINK _ SPEC _ CLASS Ġ= ĠDeep Link Spec :: class ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠREG ISTR Y _ CLASS _ SUFFIX Ġ= Ġ" Registry " ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠFor Ġthe Ġgiven Ġelement Ġfind Ġall Ġcustom Ġdee plink Ġelements Ġon Ġit Ġand Ġbuild Ġall Ġpossible ĊĠĠĠĠĠĠĠĠ Ġ* ĠURIs Ġthat Ġare Ġsupported Ġby Ġthe set Ġcustom Ġdee pl inks . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠgetAll Dee plink Ur Is From Custom Deep Links On Element ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement : ĠXElement , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprefixes Map : ĠMap < X Type , ĠArray < String >> ĊĠĠĠĠĠĠĠ Ġ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġelement . find Annotated Annotation < Deep Link Spec >(). flatMap Ġ{ Ġcustom Annotation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuffix es Ġ= Ġcustom Annotation . get < List < String >> (" value ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprefixes Ġ= Ġprefixes Map [ custom Annotation . type ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠDeep Link Processor Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unable Ġto Ġfind Ġannotation Ġ'${ custom Annotation . qualified Name }' Ġyou Ġmust Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" update Ġ' deep Link . custom Annotations ' Ġwithin Ġthe Ġbuild . gradle " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefixes . flatMap Ġ{ Ġprefix Ġ-> Ġsuffix es . map Ġ{ Ġsuffix Ġ-> Ġprefix Ġ+ Ġsuffix Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAnnotation > ĠXElement . find Annotated Annotation (): ĠList < X Annotation > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠgetAll Annotations (). filter Ġ{ Ġannotation Ġ-> Ġannotation . type . type Element ?. has Annotation ( T :: class ) Ġ== Ġtrue Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠSet < X Type Element >. filter Annotated Annotations ( klass : ĠK Class < *> ): ĠSet < X Type Element > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Annotation Class () Ġ&& Ġit . getAll Annotations () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. any Ġ{ Ġit . qualified Name Ġ== Ġklass . qualified Name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toSet () ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠmoduleName To Registry Name ( element : ĠX Type Element ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . className . simple Name () Ġ+ ĠREG ISTR Y _ CLASS _ SUFFIX ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġmodule Element To Registry ClassName ( element : ĠX Type Element ): ĠClass Name Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠClass Name . get ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Package ( element ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . className . simple Name () Ġ+ ĠREG ISTR Y _ CLASS _ SUFFIX ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Package ( element : ĠX Type Element ) Ġ= Ġelement . packageName ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġdee plink Annotated Element Compare ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement 1 : ĠDeep Link Annotated Element , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement 2 : ĠDeep Link Annotated Element ĊĠĠĠĠĠĠĠ Ġ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri 1 Ġ= ĠDeep Link Uri . parse Template ( element 1 . uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri 2 Ġ= ĠDeep Link Uri . parse Template ( element 2 . uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcomparison Result Ġ= Ġuri 2 . path Segments (). size Ġ- Ġuri 1 . path Segments (). size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( comparison Result Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomparison Result Ġ= Ġuri 2 . query Parameter Names (). size Ġ- Ġuri 1 . query Parameter Names (). size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( comparison Result Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomparison Result Ġ= Ġuri 1 . encoded Path (). split ("% 7 B ". to Regex ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Typed Array (). size Ġ- Ġuri 2 . encoded Path (). split ("% 7 B ". to Regex ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Typed Array (). size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( comparison Result Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement 1 Representation Ġ= Ġwhen Ġ( element 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDeep Link Annotated Element . Class Annotated Element Ġ-> Ġelement 1 . uri Ġ+ ĠDeep Link Annotated Element . Class Annotated Element :: class . simple Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDeep Link Annotated Element . Method Annotated Element Ġ-> Ġelement 1 . uri Ġ+ Ġelement 1 . method Ġ+ ĠDeep Link Annotated Element . Method Annotated Element :: class . simple Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement 2 Representation Ġ= Ġwhen Ġ( element 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDeep Link Annotated Element . Class Annotated Element Ġ-> Ġelement 2 . uri Ġ+ ĠDeep Link Annotated Element . Class Annotated Element :: class . simple Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDeep Link Annotated Element . Method Annotated Element Ġ-> Ġelement 2 . uri Ġ+ Ġelement 2 . method Ġ+ ĠDeep Link Annotated Element . Method Annotated Element :: class . simple Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomparison Result Ġ= Ġelement 1 Representation . compareTo ( element 2 Representation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcomparison Result ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ