Skip to content

Commit 535147d

Browse files
committed
impl TryToNav for BuiltinType instead
1 parent 67a3988 commit 535147d

File tree

3 files changed

+32
-30
lines changed

3 files changed

+32
-30
lines changed

crates/ide-db/src/famous_defs.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,10 @@ impl FamousDefs<'_, '_> {
210210
fn find_lang_crate(&self, origin: LangCrateOrigin) -> Option<Crate> {
211211
let krate = self.1;
212212
let db = self.0.db;
213+
if krate.origin(db) == CrateOrigin::Lang(origin) {
214+
return Some(krate);
215+
}
216+
213217
let res = krate
214218
.dependencies(db)
215219
.into_iter()

crates/ide/src/goto_definition.rs

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,12 @@ use crate::{
66
navigation_target::{self, ToNav},
77
};
88
use hir::{
9-
AsAssocItem, AssocItem, CallableKind, FileRange, HasCrate, InFile, ModuleDef, PathResolution,
10-
Semantics, sym,
9+
AsAssocItem, AssocItem, CallableKind, FileRange, HasCrate, InFile, ModuleDef, Semantics, sym,
1110
};
1211
use ide_db::{
1312
RootDatabase, SymbolKind,
1413
base_db::{AnchoredPath, SourceDatabase},
15-
defs::{Definition, IdentClass, find_std_module},
14+
defs::{Definition, IdentClass},
1615
famous_defs::FamousDefs,
1716
helpers::pick_best_token,
1817
};
@@ -91,9 +90,6 @@ pub(crate) fn goto_definition(
9190
if let Some(navs) = find_definition_for_known_blanket_dual_impls(sema, &token.value) {
9291
return Some(navs);
9392
}
94-
if let Some(navs) = find_definition_for_builtin_types(sema, &token.value, edition) {
95-
return Some(navs);
96-
}
9793

9894
let parent = token.value.parent()?;
9995

@@ -208,25 +204,6 @@ fn find_definition_for_known_blanket_dual_impls(
208204
Some(def_to_nav(sema.db, def))
209205
}
210206

211-
// If the token is a builtin type search the definition from the rustdoc module shims.
212-
fn find_definition_for_builtin_types(
213-
sema: &Semantics<'_, RootDatabase>,
214-
original_token: &SyntaxToken,
215-
edition: Edition,
216-
) -> Option<Vec<NavigationTarget>> {
217-
let path = original_token.parent_ancestors().find_map(ast::Path::cast)?;
218-
let res = sema.resolve_path(&path)?;
219-
let PathResolution::Def(ModuleDef::BuiltinType(builtin)) = res else {
220-
return None;
221-
};
222-
223-
let fd = FamousDefs(sema, sema.scope(path.syntax())?.krate());
224-
let primitive_mod = format!("prim_{}", builtin.name().display(fd.0.db, edition));
225-
let doc_owner = find_std_module(&fd, &primitive_mod, edition)?;
226-
227-
Some(def_to_nav(sema.db, doc_owner.into()))
228-
}
229-
230207
fn try_lookup_include_path(
231208
sema: &Semantics<'_, RootDatabase>,
232209
token: InFile<ast::String>,

crates/ide/src/navigation_target.rs

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@ use std::fmt;
55
use arrayvec::ArrayVec;
66
use either::Either;
77
use hir::{
8-
AssocItem, FieldSource, HasContainer, HasCrate, HasSource, HirDisplay, HirFileId, InFile,
9-
LocalSource, ModuleSource, db::ExpandDatabase, symbols::FileSymbol,
8+
AssocItem, Crate, FieldSource, HasContainer, HasCrate, HasSource, HirDisplay, HirFileId,
9+
InFile, LocalSource, ModuleSource, Semantics, db::ExpandDatabase, symbols::FileSymbol,
1010
};
1111
use ide_db::{
1212
FileId, FileRange, RootDatabase, SymbolKind,
13-
base_db::salsa,
14-
defs::Definition,
13+
base_db::{CrateOrigin, LangCrateOrigin, RootQueryDb, salsa},
14+
defs::{Definition, find_std_module},
1515
documentation::{Documentation, HasDocs},
16+
famous_defs::FamousDefs,
1617
};
1718
use span::Edition;
1819
use stdx::never;
@@ -262,8 +263,8 @@ impl TryToNav for Definition {
262263
Definition::TypeAlias(it) => it.try_to_nav(db),
263264
Definition::ExternCrateDecl(it) => it.try_to_nav(db),
264265
Definition::InlineAsmOperand(it) => it.try_to_nav(db),
266+
Definition::BuiltinType(it) => it.try_to_nav(db),
265267
Definition::BuiltinLifetime(_)
266-
| Definition::BuiltinType(_)
267268
| Definition::TupleField(_)
268269
| Definition::ToolModule(_)
269270
| Definition::InlineAsmRegOrRegClass(_)
@@ -746,6 +747,26 @@ impl TryToNav for hir::InlineAsmOperand {
746747
}
747748
}
748749

750+
impl TryToNav for hir::BuiltinType {
751+
fn try_to_nav(&self, db: &RootDatabase) -> Option<UpmappingResult<NavigationTarget>> {
752+
let sema = Semantics::new(db);
753+
754+
let krate = db
755+
.all_crates()
756+
.iter()
757+
.copied()
758+
.find(|&krate| matches!(krate.data(db).origin, CrateOrigin::Lang(LangCrateOrigin::Std)))
759+
.map(Crate::from)?;
760+
let edition = krate.edition(db);
761+
762+
let fd = FamousDefs(&sema, krate);
763+
let primitive_mod = format!("prim_{}", self.name().display(fd.0.db, edition));
764+
let doc_owner = find_std_module(&fd, &primitive_mod, edition)?;
765+
766+
Some(doc_owner.to_nav(db))
767+
}
768+
}
769+
749770
#[derive(Debug)]
750771
pub struct UpmappingResult<T> {
751772
/// The macro call site.

0 commit comments

Comments
 (0)