@@ -513,32 +513,17 @@ pub fn dealias_method(graph: &Graph, alias_id: DefinitionId) -> Option<Vec<Deali
513513 )
514514}
515515
516- /// Result of following a `MethodAliasDefinition` chain to completion.
517- #[ derive( Debug ) ]
518- pub struct DeepDealiasMethodResult {
519- /// Successfully resolved method definition IDs.
520- pub method_ids : Vec < DefinitionId > ,
521- /// `DefinitionId`s where circular alias chains were detected.
522- pub circular_aliases : Vec < DefinitionId > ,
523- /// `DefinitionId`s of aliases whose target method could not be found.
524- pub missing_targets : Vec < DefinitionId > ,
525- }
526-
527- /// Follows a `MethodAliasDefinition` chain to completion, returning all resolved
528- /// `MethodDefinition` IDs along with any errors encountered. Unlike `dealias_method`
529- /// which resolves one level, this function keeps following alias chains until only
530- /// method definitions remain.
516+ /// Recursively follows alias chains starting from `alias_id`, collecting all
517+ /// resolved `MethodDefinition` IDs. Unlike `dealias_method` which resolves one
518+ /// level, this function keeps following aliases until all chains are fully resolved.
519+ /// Circular aliases and missing targets are silently ignored.
531520///
532521/// # Panics
533522///
534523/// Panics if any alias definition in the chain has no corresponding declaration.
535524#[ must_use]
536- pub fn deep_dealias_method ( graph : & Graph , alias_id : DefinitionId ) -> DeepDealiasMethodResult {
537- let mut result = DeepDealiasMethodResult {
538- method_ids : Vec :: new ( ) ,
539- circular_aliases : Vec :: new ( ) ,
540- missing_targets : Vec :: new ( ) ,
541- } ;
525+ pub fn deep_dealias_method ( graph : & Graph , alias_id : DefinitionId ) -> Vec < DefinitionId > {
526+ let mut method_ids = Vec :: new ( ) ;
542527
543528 let mut current_dealias_results = vec ! [ DealiasMethodResult :: Alias ( alias_id) ] ;
544529 let mut visited = HashSet :: new ( ) ;
@@ -549,25 +534,24 @@ pub fn deep_dealias_method(graph: &Graph, alias_id: DefinitionId) -> DeepDealias
549534 for item in & current_dealias_results {
550535 match item {
551536 DealiasMethodResult :: Method ( id) => {
552- result . method_ids . push ( * id) ;
537+ method_ids. push ( * id) ;
553538 }
554539 DealiasMethodResult :: Alias ( id) => {
555540 if !visited. insert ( * id) {
556- result. circular_aliases . push ( * id) ;
557541 continue ;
558542 }
559- match dealias_method ( graph, * id) {
560- Some ( next) => next_aliases. extend ( next) ,
561- None => result. missing_targets . push ( * id) ,
543+ if let Some ( next) = dealias_method ( graph, * id) {
544+ next_aliases. extend ( next) ;
562545 }
563546 }
564547 }
565548 }
566549
567550 if next_aliases. is_empty ( ) {
551+ // Dedup the method ids
568552 let mut seen = HashSet :: new ( ) ;
569- result . method_ids . retain ( |id| seen. insert ( * id) ) ;
570- return result ;
553+ method_ids. retain ( |id| seen. insert ( * id) ) ;
554+ return method_ids ;
571555 }
572556
573557 current_dealias_results = next_aliases;
@@ -2007,8 +1991,8 @@ mod tests {
20071991 let mut context = GraphTest :: new ( ) ;
20081992 // `then` has three definitions:
20091993 // - a Method (from file1)
2010- // - an alias to `baz` which is circular (from file2)
2011- // - an alias to `nonexistent` which is unresolved (from file2)
1994+ // - ignored: an alias to `baz` which is circular (from file2)
1995+ // - ignored: an alias to `nonexistent` which is unresolved (from file2)
20121996 // `start` aliases `then`, so deep_dealias_method(start) sees all three.
20131997 context. index_uri (
20141998 "file:///foo1.rb" ,
@@ -2033,17 +2017,11 @@ mod tests {
20332017 context. resolve ( ) ;
20342018
20352019 let id = get_method_alias_id ( context. graph ( ) , "Foo#start()" ) ;
2036- let result = deep_dealias_method ( context. graph ( ) , id) ;
2020+ let method_ids = deep_dealias_method ( context. graph ( ) , id) ;
20372021
20382022 // Method definition of `then` is found
2039- assert_eq ! ( result. method_ids. len( ) , 1 ) ;
2040- assert_eq ! ( context. source_at( & result. method_ids[ 0 ] ) , "def then(a); end" ) ;
2041- // Circular chain via baz -> bar -> baz
2042- assert_eq ! ( result. circular_aliases. len( ) , 1 ) ;
2043- assert_eq ! ( context. source_at( & result. circular_aliases[ 0 ] ) , "alias baz bar" ) ;
2044- // Unresolved alias to nonexistent
2045- assert_eq ! ( result. missing_targets. len( ) , 1 ) ;
2046- assert_eq ! ( context. source_at( & result. missing_targets[ 0 ] ) , "alias then nonexistent" ) ;
2023+ assert_eq ! ( method_ids. len( ) , 1 ) ;
2024+ assert_eq ! ( context. source_at( & method_ids[ 0 ] ) , "def then(a); end" ) ;
20472025 }
20482026
20492027 #[ test]
@@ -2072,10 +2050,10 @@ mod tests {
20722050 context. resolve ( ) ;
20732051
20742052 let id = get_method_alias_id ( context. graph ( ) , "Foo#start()" ) ;
2075- let result = deep_dealias_method ( context. graph ( ) , id) ;
2053+ let method_ids = deep_dealias_method ( context. graph ( ) , id) ;
20762054
2077- assert_eq ! ( result . method_ids. len( ) , 1 ) ;
2078- assert_eq ! ( context. source_at( & result . method_ids[ 0 ] ) , "def foo(a); end" ) ;
2055+ assert_eq ! ( method_ids. len( ) , 1 ) ;
2056+ assert_eq ! ( context. source_at( & method_ids[ 0 ] ) , "def foo(a); end" ) ;
20792057 }
20802058
20812059 #[ test]
0 commit comments