@@ -2,7 +2,7 @@ use {super::*, CompileErrorKind::*};
22
33#[ derive( Default ) ]
44pub ( crate ) struct Analyzer < ' run , ' src > {
5- aliases : Table < ' src , Alias < ' src , Name < ' src > > > ,
5+ aliases : Table < ' src , Alias < ' src , Namepath < ' src > > > ,
66 assignments : Vec < & ' run Binding < ' src , Expression < ' src > > > ,
77 modules : Table < ' src , Justfile < ' src > > ,
88 recipes : Vec < & ' run Recipe < ' src , UnresolvedDependency < ' src > > > ,
@@ -149,7 +149,7 @@ impl<'run, 'src> Analyzer<'run, 'src> {
149149
150150 let mut aliases = Table :: new ( ) ;
151151 while let Some ( alias) = self . aliases . pop ( ) {
152- aliases. insert ( Self :: resolve_alias ( & recipes, alias) ?) ;
152+ aliases. insert ( Self :: resolve_alias ( & self . modules , & recipes, alias) ?) ;
153153 }
154154
155155 for recipe in recipes. values ( ) {
@@ -290,19 +290,35 @@ impl<'run, 'src> Analyzer<'run, 'src> {
290290 Ok ( ( ) )
291291 }
292292
293- fn resolve_alias (
294- recipes : & Table < ' src , Rc < Recipe < ' src > > > ,
295- alias : Alias < ' src , Name < ' src > > ,
293+ fn resolve_alias < ' a > (
294+ modules : & ' a Table < ' src , Justfile < ' src > > ,
295+ recipes : & ' a Table < ' src , Rc < Recipe < ' src > > > ,
296+ alias : Alias < ' src , Namepath < ' src > > ,
296297 ) -> CompileResult < ' src , Alias < ' src > > {
297- // Make sure the target recipe exists
298- match recipes. get ( alias. target . lexeme ( ) ) {
299- Some ( target) => Ok ( alias. resolve ( Rc :: clone ( target) ) ) ,
298+ match Self :: alias_target ( & alias. target , modules, recipes) {
299+ Some ( target) => Ok ( alias. resolve ( target) ) ,
300300 None => Err ( alias. name . token . error ( UnknownAliasTarget {
301301 alias : alias. name . lexeme ( ) ,
302- target : alias. target . lexeme ( ) ,
302+ target : alias. target ,
303303 } ) ) ,
304304 }
305305 }
306+
307+ fn alias_target < ' a > (
308+ path : & Namepath < ' src > ,
309+ mut modules : & ' a Table < ' src , Justfile < ' src > > ,
310+ mut recipes : & ' a Table < ' src , Rc < Recipe < ' src > > > ,
311+ ) -> Option < Rc < Recipe < ' src > > > {
312+ let ( name, path) = path. split_last ( ) ;
313+
314+ for name in path {
315+ let module = modules. get ( name. lexeme ( ) ) ?;
316+ modules = & module. modules ;
317+ recipes = & module. recipes ;
318+ }
319+
320+ recipes. get ( name. lexeme ( ) ) . cloned ( )
321+ }
306322}
307323
308324#[ cfg( test) ]
@@ -326,7 +342,20 @@ mod tests {
326342 line: 0 ,
327343 column: 6 ,
328344 width: 3 ,
329- kind: UnknownAliasTarget { alias: "foo" , target: "bar" } ,
345+ kind: UnknownAliasTarget {
346+ alias: "foo" ,
347+ target: Namepath :: from( Name :: from_identifier(
348+ Token {
349+ column: 13 ,
350+ kind: TokenKind :: Identifier ,
351+ length: 3 ,
352+ line: 0 ,
353+ offset: 13 ,
354+ path: Path :: new( "justfile" ) ,
355+ src: "alias foo := bar\n " ,
356+ }
357+ ) )
358+ } ,
330359 }
331360
332361 analysis_error ! {
0 commit comments