Skip to content

Commit 81a3404

Browse files
bors[bot]matklad
andauthored
Merge #5875
5875: Remove monomorphisation from doclinks resolving code r=matklad a=matklad bors r+ 🤖 Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
2 parents 2441e8e + cd9ecdf commit 81a3404

File tree

2 files changed

+43
-34
lines changed

2 files changed

+43
-34
lines changed

crates/hir/src/attrs.rs

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
//! Attributes & documentation for hir types.
22
use hir_def::{
33
attr::Attrs,
4-
db::DefDatabase,
54
docs::Documentation,
65
resolver::{HasResolver, Resolver},
76
AdtId, AttrDefId, FunctionId, GenericDefId, ModuleId, StaticId, TraitId, VariantId,
@@ -62,18 +61,20 @@ macro_rules! impl_has_attrs_adt {
6261
impl_has_attrs_adt![Struct, Union, Enum];
6362

6463
impl Resolvable for ModuleDef {
65-
fn resolver<D: DefDatabase + HirDatabase>(&self, db: &D) -> Option<Resolver> {
64+
fn resolver(&self, db: &dyn HirDatabase) -> Option<Resolver> {
6665
Some(match self {
67-
ModuleDef::Module(m) => ModuleId::from(m.clone()).resolver(db),
68-
ModuleDef::Function(f) => FunctionId::from(f.clone()).resolver(db),
69-
ModuleDef::Adt(adt) => AdtId::from(adt.clone()).resolver(db),
66+
ModuleDef::Module(m) => ModuleId::from(m.clone()).resolver(db.upcast()),
67+
ModuleDef::Function(f) => FunctionId::from(f.clone()).resolver(db.upcast()),
68+
ModuleDef::Adt(adt) => AdtId::from(adt.clone()).resolver(db.upcast()),
7069
ModuleDef::EnumVariant(ev) => {
71-
GenericDefId::from(GenericDef::from(ev.clone())).resolver(db)
70+
GenericDefId::from(GenericDef::from(ev.clone())).resolver(db.upcast())
7271
}
73-
ModuleDef::Const(c) => GenericDefId::from(GenericDef::from(c.clone())).resolver(db),
74-
ModuleDef::Static(s) => StaticId::from(s.clone()).resolver(db),
75-
ModuleDef::Trait(t) => TraitId::from(t.clone()).resolver(db),
76-
ModuleDef::TypeAlias(t) => ModuleId::from(t.module(db)).resolver(db),
72+
ModuleDef::Const(c) => {
73+
GenericDefId::from(GenericDef::from(c.clone())).resolver(db.upcast())
74+
}
75+
ModuleDef::Static(s) => StaticId::from(s.clone()).resolver(db.upcast()),
76+
ModuleDef::Trait(t) => TraitId::from(t.clone()).resolver(db.upcast()),
77+
ModuleDef::TypeAlias(t) => ModuleId::from(t.module(db)).resolver(db.upcast()),
7778
// FIXME: This should be a resolver relative to `std/core`
7879
ModuleDef::BuiltinType(_t) => None?,
7980
})
@@ -85,8 +86,8 @@ impl Resolvable for ModuleDef {
8586
}
8687

8788
impl Resolvable for TypeParam {
88-
fn resolver<D: DefDatabase + HirDatabase>(&self, db: &D) -> Option<Resolver> {
89-
Some(ModuleId::from(self.module(db)).resolver(db))
89+
fn resolver(&self, db: &dyn HirDatabase) -> Option<Resolver> {
90+
Some(ModuleId::from(self.module(db)).resolver(db.upcast()))
9091
}
9192

9293
fn try_into_module_def(self) -> Option<ModuleDef> {
@@ -95,8 +96,8 @@ impl Resolvable for TypeParam {
9596
}
9697

9798
impl Resolvable for MacroDef {
98-
fn resolver<D: DefDatabase + HirDatabase>(&self, db: &D) -> Option<Resolver> {
99-
Some(ModuleId::from(self.module(db)?).resolver(db))
99+
fn resolver(&self, db: &dyn HirDatabase) -> Option<Resolver> {
100+
Some(ModuleId::from(self.module(db)?).resolver(db.upcast()))
100101
}
101102

102103
fn try_into_module_def(self) -> Option<ModuleDef> {
@@ -105,8 +106,8 @@ impl Resolvable for MacroDef {
105106
}
106107

107108
impl Resolvable for Field {
108-
fn resolver<D: DefDatabase + HirDatabase>(&self, db: &D) -> Option<Resolver> {
109-
Some(VariantId::from(self.parent_def(db)).resolver(db))
109+
fn resolver(&self, db: &dyn HirDatabase) -> Option<Resolver> {
110+
Some(VariantId::from(self.parent_def(db)).resolver(db.upcast()))
110111
}
111112

112113
fn try_into_module_def(self) -> Option<ModuleDef> {
@@ -115,8 +116,8 @@ impl Resolvable for Field {
115116
}
116117

117118
impl Resolvable for ImplDef {
118-
fn resolver<D: DefDatabase + HirDatabase>(&self, db: &D) -> Option<Resolver> {
119-
Some(ModuleId::from(self.module(db)).resolver(db))
119+
fn resolver(&self, db: &dyn HirDatabase) -> Option<Resolver> {
120+
Some(ModuleId::from(self.module(db)).resolver(db.upcast()))
120121
}
121122

122123
fn try_into_module_def(self) -> Option<ModuleDef> {
@@ -125,8 +126,8 @@ impl Resolvable for ImplDef {
125126
}
126127

127128
impl Resolvable for Local {
128-
fn resolver<D: DefDatabase + HirDatabase>(&self, db: &D) -> Option<Resolver> {
129-
Some(ModuleId::from(self.module(db)).resolver(db))
129+
fn resolver(&self, db: &dyn HirDatabase) -> Option<Resolver> {
130+
Some(ModuleId::from(self.module(db)).resolver(db.upcast()))
130131
}
131132

132133
fn try_into_module_def(self) -> Option<ModuleDef> {

crates/hir/src/doc_links.rs

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,32 +2,43 @@
22
33
use std::iter::once;
44

5-
use hir_def::{db::DefDatabase, resolver::Resolver};
5+
use hir_def::resolver::Resolver;
66
use itertools::Itertools;
77
use syntax::ast::Path;
88
use url::Url;
99

1010
use crate::{db::HirDatabase, Adt, AsName, Crate, Hygiene, ItemInNs, ModPath, ModuleDef};
1111

12-
pub fn resolve_doc_link<T: Resolvable + Clone, D: DefDatabase + HirDatabase>(
13-
db: &D,
12+
pub fn resolve_doc_link<T: Resolvable + Clone>(
13+
db: &dyn HirDatabase,
1414
definition: &T,
1515
link_text: &str,
1616
link_target: &str,
1717
) -> Option<(String, String)> {
18-
try_resolve_intra(db, definition, link_text, &link_target).or_else(|| {
19-
let definition = definition.clone().try_into_module_def()?;
20-
try_resolve_path(db, &definition, &link_target)
18+
let resolver = definition.resolver(db)?;
19+
let module_def = definition.clone().try_into_module_def();
20+
resolve_doc_link_impl(db, &resolver, module_def, link_text, link_target)
21+
}
22+
23+
fn resolve_doc_link_impl(
24+
db: &dyn HirDatabase,
25+
resolver: &Resolver,
26+
module_def: Option<ModuleDef>,
27+
link_text: &str,
28+
link_target: &str,
29+
) -> Option<(String, String)> {
30+
try_resolve_intra(db, &resolver, link_text, &link_target).or_else(|| {
31+
try_resolve_path(db, &module_def?, &link_target)
2132
.map(|target| (target, link_text.to_string()))
2233
})
2334
}
2435

2536
/// Try to resolve path to local documentation via intra-doc-links (i.e. `super::gateway::Shard`).
2637
///
2738
/// See [RFC1946](https://github.com/rust-lang/rfcs/blob/master/text/1946-intra-rustdoc-links.md).
28-
fn try_resolve_intra<T: Resolvable, D: DefDatabase + HirDatabase>(
29-
db: &D,
30-
definition: &T,
39+
fn try_resolve_intra(
40+
db: &dyn HirDatabase,
41+
resolver: &Resolver,
3142
link_text: &str,
3243
link_target: &str,
3344
) -> Option<(String, String)> {
@@ -41,10 +52,7 @@ fn try_resolve_intra<T: Resolvable, D: DefDatabase + HirDatabase>(
4152
let path = Path::parse(doclink.path).ok()?;
4253
let modpath = ModPath::from_src(path, &Hygiene::new_unhygienic()).unwrap();
4354

44-
// Resolve it relative to symbol's location (according to the RFC this should consider small scopes)
45-
let resolver = definition.resolver(db)?;
46-
47-
let resolved = resolver.resolve_module_path_in_items(db, &modpath);
55+
let resolved = resolver.resolve_module_path_in_items(db.upcast(), &modpath);
4856
let (defid, namespace) = match doclink.namespace {
4957
// FIXME: .or(resolved.macros)
5058
None => resolved
@@ -225,6 +233,6 @@ impl Namespace {
225233

226234
/// Sealed trait used solely for the generic bound on [`resolve_doc_link`].
227235
pub trait Resolvable {
228-
fn resolver<D: DefDatabase + HirDatabase>(&self, db: &D) -> Option<Resolver>;
236+
fn resolver(&self, db: &dyn HirDatabase) -> Option<Resolver>;
229237
fn try_into_module_def(self) -> Option<ModuleDef>;
230238
}

0 commit comments

Comments
 (0)