Skip to content

Commit aeeebb3

Browse files
committed
Simpler deep_dealias_method return value
1 parent 4494f5c commit aeeebb3

2 files changed

Lines changed: 22 additions & 44 deletions

File tree

rust/rubydex-sys/src/signature_api.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,10 +151,10 @@ pub unsafe extern "C" fn rdx_method_alias_definition_signatures(
151151
with_graph(pointer, |graph| {
152152
let def_id = DefinitionId::new(definition_id);
153153

154-
let result = rubydex::query::deep_dealias_method(graph, def_id);
154+
let resolved = rubydex::query::deep_dealias_method(graph, def_id);
155155

156156
let mut sig_entries: Vec<SignatureEntry> = Vec::new();
157-
for id in &result.method_ids {
157+
for id in &resolved {
158158
if let Some(Definition::Method(method_def)) = graph.definitions().get(id) {
159159
collect_method_signatures(graph, method_def, id.get(), &mut sig_entries);
160160
}

rust/rubydex/src/query.rs

Lines changed: 20 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)