impl TryToNav for BuiltinType instead

This commit is contained in:
Ryan Mehri 2025-09-08 14:10:25 -04:00
parent 67a39886c3
commit 535147d57f
3 changed files with 32 additions and 30 deletions

View file

@ -210,6 +210,10 @@ impl FamousDefs<'_, '_> {
fn find_lang_crate(&self, origin: LangCrateOrigin) -> Option<Crate> {
let krate = self.1;
let db = self.0.db;
if krate.origin(db) == CrateOrigin::Lang(origin) {
return Some(krate);
}
let res = krate
.dependencies(db)
.into_iter()

View file

@ -6,13 +6,12 @@ use crate::{
navigation_target::{self, ToNav},
};
use hir::{
AsAssocItem, AssocItem, CallableKind, FileRange, HasCrate, InFile, ModuleDef, PathResolution,
Semantics, sym,
AsAssocItem, AssocItem, CallableKind, FileRange, HasCrate, InFile, ModuleDef, Semantics, sym,
};
use ide_db::{
RootDatabase, SymbolKind,
base_db::{AnchoredPath, SourceDatabase},
defs::{Definition, IdentClass, find_std_module},
defs::{Definition, IdentClass},
famous_defs::FamousDefs,
helpers::pick_best_token,
};
@ -91,9 +90,6 @@ pub(crate) fn goto_definition(
if let Some(navs) = find_definition_for_known_blanket_dual_impls(sema, &token.value) {
return Some(navs);
}
if let Some(navs) = find_definition_for_builtin_types(sema, &token.value, edition) {
return Some(navs);
}
let parent = token.value.parent()?;
@ -208,25 +204,6 @@ fn find_definition_for_known_blanket_dual_impls(
Some(def_to_nav(sema.db, def))
}
// If the token is a builtin type search the definition from the rustdoc module shims.
fn find_definition_for_builtin_types(
sema: &Semantics<'_, RootDatabase>,
original_token: &SyntaxToken,
edition: Edition,
) -> Option<Vec<NavigationTarget>> {
let path = original_token.parent_ancestors().find_map(ast::Path::cast)?;
let res = sema.resolve_path(&path)?;
let PathResolution::Def(ModuleDef::BuiltinType(builtin)) = res else {
return None;
};
let fd = FamousDefs(sema, sema.scope(path.syntax())?.krate());
let primitive_mod = format!("prim_{}", builtin.name().display(fd.0.db, edition));
let doc_owner = find_std_module(&fd, &primitive_mod, edition)?;
Some(def_to_nav(sema.db, doc_owner.into()))
}
fn try_lookup_include_path(
sema: &Semantics<'_, RootDatabase>,
token: InFile<ast::String>,

View file

@ -5,14 +5,15 @@ use std::fmt;
use arrayvec::ArrayVec;
use either::Either;
use hir::{
AssocItem, FieldSource, HasContainer, HasCrate, HasSource, HirDisplay, HirFileId, InFile,
LocalSource, ModuleSource, db::ExpandDatabase, symbols::FileSymbol,
AssocItem, Crate, FieldSource, HasContainer, HasCrate, HasSource, HirDisplay, HirFileId,
InFile, LocalSource, ModuleSource, Semantics, db::ExpandDatabase, symbols::FileSymbol,
};
use ide_db::{
FileId, FileRange, RootDatabase, SymbolKind,
base_db::salsa,
defs::Definition,
base_db::{CrateOrigin, LangCrateOrigin, RootQueryDb, salsa},
defs::{Definition, find_std_module},
documentation::{Documentation, HasDocs},
famous_defs::FamousDefs,
};
use span::Edition;
use stdx::never;
@ -262,8 +263,8 @@ impl TryToNav for Definition {
Definition::TypeAlias(it) => it.try_to_nav(db),
Definition::ExternCrateDecl(it) => it.try_to_nav(db),
Definition::InlineAsmOperand(it) => it.try_to_nav(db),
Definition::BuiltinType(it) => it.try_to_nav(db),
Definition::BuiltinLifetime(_)
| Definition::BuiltinType(_)
| Definition::TupleField(_)
| Definition::ToolModule(_)
| Definition::InlineAsmRegOrRegClass(_)
@ -746,6 +747,26 @@ impl TryToNav for hir::InlineAsmOperand {
}
}
impl TryToNav for hir::BuiltinType {
fn try_to_nav(&self, db: &RootDatabase) -> Option<UpmappingResult<NavigationTarget>> {
let sema = Semantics::new(db);
let krate = db
.all_crates()
.iter()
.copied()
.find(|&krate| matches!(krate.data(db).origin, CrateOrigin::Lang(LangCrateOrigin::Std)))
.map(Crate::from)?;
let edition = krate.edition(db);
let fd = FamousDefs(&sema, krate);
let primitive_mod = format!("prim_{}", self.name().display(fd.0.db, edition));
let doc_owner = find_std_module(&fd, &primitive_mod, edition)?;
Some(doc_owner.to_nav(db))
}
}
#[derive(Debug)]
pub struct UpmappingResult<T> {
/// The macro call site.