Skip to content

Commit 8e66acf

Browse files
authored
Merge pull request #779 from Shopify/05-04-add_follow_method_alias_query
Add `follow_method_alias` query
2 parents 7647ed4 + 73442de commit 8e66acf

3 files changed

Lines changed: 617 additions & 41 deletions

File tree

rust/rubydex-sys/src/declaration_api.rs

Lines changed: 10 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -197,42 +197,19 @@ pub unsafe extern "C" fn rdx_declaration_find_member(
197197

198198
with_graph(pointer, |graph| {
199199
let id = DeclarationId::new(declaration_id);
200+
let member_id = StringId::from(member_str.as_str());
200201

201-
let Some(Declaration::Namespace(decl)) = graph.declarations().get(&id) else {
202-
return ptr::null();
202+
let member_decl_id = match rubydex::query::find_member_in_ancestors(graph, id, member_id, only_inherited) {
203+
Ok(decl_id) => decl_id,
204+
Err(rubydex::query::FindMemberError::MemberNotFound) => return ptr::null(),
205+
Err(err) => unreachable!(
206+
"Namespace#find_member is only exposed on namespace declarations, so the declaration must exist and be \
207+
a namespace, got {err:?}"
208+
),
203209
};
204210

205-
let member_id = StringId::from(member_str.as_str());
206-
let mut found_main_namespace = false;
207-
208-
decl.ancestors()
209-
.iter()
210-
.find_map(|ancestor| match ancestor {
211-
Ancestor::Complete(ancestor_id) => {
212-
// When only_inherited, skip self and prepended modules
213-
if only_inherited {
214-
let is_self = *ancestor_id == id;
215-
if is_self {
216-
found_main_namespace = true;
217-
}
218-
if is_self || !found_main_namespace {
219-
return None;
220-
}
221-
}
222-
223-
let ancestor_decl = graph.declarations().get(ancestor_id).unwrap().as_namespace().unwrap();
224-
225-
if let Some(member_decl_id) = ancestor_decl.member(&member_id) {
226-
return Some((member_decl_id, graph.declarations().get(member_decl_id).unwrap()));
227-
}
228-
229-
None
230-
}
231-
Ancestor::Partial(_) => None,
232-
})
233-
.map_or(ptr::null(), |(member_decl_id, member_decl)| {
234-
Box::into_raw(Box::new(CDeclaration::from_declaration(*member_decl_id, member_decl))).cast_const()
235-
})
211+
let member_decl = graph.declarations().get(&member_decl_id).unwrap();
212+
Box::into_raw(Box::new(CDeclaration::from_declaration(member_decl_id, member_decl))).cast_const()
236213
})
237214
}
238215

rust/rubydex/src/model/graph.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -380,13 +380,15 @@ impl Graph {
380380
)
381381
}
382382
Definition::MethodAlias(it) => {
383-
if let Some(Receiver::SelfReceiver(def_id)) = it.receiver() {
384-
return self.find_self_receiver_declaration(*def_id, *it.new_name_str_id());
385-
}
386-
(
387-
self.find_enclosing_namespace_name_id(it.lexical_nesting_id().as_ref()),
388-
it.new_name_str_id(),
389-
)
383+
let nesting_name_id = match it.receiver() {
384+
Some(Receiver::SelfReceiver(def_id)) => {
385+
return self.find_self_receiver_declaration(*def_id, *it.new_name_str_id());
386+
}
387+
Some(Receiver::ConstantReceiver(name_id)) => Some(name_id),
388+
None => self.find_enclosing_namespace_name_id(it.lexical_nesting_id().as_ref()),
389+
};
390+
391+
(nesting_name_id, it.new_name_str_id())
390392
}
391393
};
392394

0 commit comments

Comments
 (0)