mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-11-14 17:59:56 +00:00
chore: Start infesting ide crates with 'db lifetime
This commit is contained in:
parent
a31e10a2fd
commit
03f1003637
79 changed files with 1214 additions and 815 deletions
|
|
@ -385,17 +385,17 @@ fn find_std_module(
|
|||
|
||||
// FIXME: IdentClass as a name no longer fits
|
||||
#[derive(Debug)]
|
||||
pub enum IdentClass {
|
||||
NameClass(NameClass),
|
||||
NameRefClass(NameRefClass),
|
||||
pub enum IdentClass<'db> {
|
||||
NameClass(NameClass<'db>),
|
||||
NameRefClass(NameRefClass<'db>),
|
||||
Operator(OperatorClass),
|
||||
}
|
||||
|
||||
impl IdentClass {
|
||||
impl<'db> IdentClass<'db> {
|
||||
pub fn classify_node(
|
||||
sema: &Semantics<'_, RootDatabase>,
|
||||
sema: &Semantics<'db, RootDatabase>,
|
||||
node: &SyntaxNode,
|
||||
) -> Option<IdentClass> {
|
||||
) -> Option<IdentClass<'db>> {
|
||||
match_ast! {
|
||||
match node {
|
||||
ast::Name(name) => NameClass::classify(sema, &name).map(IdentClass::NameClass),
|
||||
|
|
@ -418,23 +418,23 @@ impl IdentClass {
|
|||
}
|
||||
|
||||
pub fn classify_token(
|
||||
sema: &Semantics<'_, RootDatabase>,
|
||||
sema: &Semantics<'db, RootDatabase>,
|
||||
token: &SyntaxToken,
|
||||
) -> Option<IdentClass> {
|
||||
) -> Option<IdentClass<'db>> {
|
||||
let parent = token.parent()?;
|
||||
Self::classify_node(sema, &parent)
|
||||
}
|
||||
|
||||
pub fn classify_lifetime(
|
||||
sema: &Semantics<'_, RootDatabase>,
|
||||
sema: &Semantics<'db, RootDatabase>,
|
||||
lifetime: &ast::Lifetime,
|
||||
) -> Option<IdentClass> {
|
||||
) -> Option<IdentClass<'db>> {
|
||||
NameRefClass::classify_lifetime(sema, lifetime)
|
||||
.map(IdentClass::NameRefClass)
|
||||
.or_else(|| NameClass::classify_lifetime(sema, lifetime).map(IdentClass::NameClass))
|
||||
}
|
||||
|
||||
pub fn definitions(self) -> ArrayVec<(Definition, Option<GenericSubstitution>), 2> {
|
||||
pub fn definitions(self) -> ArrayVec<(Definition, Option<GenericSubstitution<'db>>), 2> {
|
||||
let mut res = ArrayVec::new();
|
||||
match self {
|
||||
IdentClass::NameClass(NameClass::Definition(it) | NameClass::ConstReference(it)) => {
|
||||
|
|
@ -518,7 +518,7 @@ impl IdentClass {
|
|||
///
|
||||
/// A model special case is `None` constant in pattern.
|
||||
#[derive(Debug)]
|
||||
pub enum NameClass {
|
||||
pub enum NameClass<'db> {
|
||||
Definition(Definition),
|
||||
/// `None` in `if let None = Some(82) {}`.
|
||||
/// Syntactically, it is a name, but semantically it is a reference.
|
||||
|
|
@ -528,11 +528,11 @@ pub enum NameClass {
|
|||
PatFieldShorthand {
|
||||
local_def: Local,
|
||||
field_ref: Field,
|
||||
adt_subst: GenericSubstitution,
|
||||
adt_subst: GenericSubstitution<'db>,
|
||||
},
|
||||
}
|
||||
|
||||
impl NameClass {
|
||||
impl<'db> NameClass<'db> {
|
||||
/// `Definition` defined by this name.
|
||||
pub fn defined(self) -> Option<Definition> {
|
||||
let res = match self {
|
||||
|
|
@ -545,7 +545,10 @@ impl NameClass {
|
|||
Some(res)
|
||||
}
|
||||
|
||||
pub fn classify(sema: &Semantics<'_, RootDatabase>, name: &ast::Name) -> Option<NameClass> {
|
||||
pub fn classify(
|
||||
sema: &Semantics<'db, RootDatabase>,
|
||||
name: &ast::Name,
|
||||
) -> Option<NameClass<'db>> {
|
||||
let _p = tracing::info_span!("NameClass::classify").entered();
|
||||
|
||||
let parent = name.syntax().parent()?;
|
||||
|
|
@ -597,10 +600,10 @@ impl NameClass {
|
|||
Some(definition)
|
||||
}
|
||||
|
||||
fn classify_ident_pat(
|
||||
sema: &Semantics<'_, RootDatabase>,
|
||||
fn classify_ident_pat<'db>(
|
||||
sema: &Semantics<'db, RootDatabase>,
|
||||
ident_pat: ast::IdentPat,
|
||||
) -> Option<NameClass> {
|
||||
) -> Option<NameClass<'db>> {
|
||||
if let Some(def) = sema.resolve_bind_pat_to_const(&ident_pat) {
|
||||
return Some(NameClass::ConstReference(Definition::from(def)));
|
||||
}
|
||||
|
|
@ -638,9 +641,9 @@ impl NameClass {
|
|||
}
|
||||
|
||||
pub fn classify_lifetime(
|
||||
sema: &Semantics<'_, RootDatabase>,
|
||||
sema: &Semantics<'db, RootDatabase>,
|
||||
lifetime: &ast::Lifetime,
|
||||
) -> Option<NameClass> {
|
||||
) -> Option<NameClass<'db>> {
|
||||
let _p = tracing::info_span!("NameClass::classify_lifetime", ?lifetime).entered();
|
||||
let parent = lifetime.syntax().parent()?;
|
||||
|
||||
|
|
@ -723,12 +726,12 @@ impl OperatorClass {
|
|||
/// A model special case is field shorthand syntax, which uses a single
|
||||
/// reference to point to two different defs.
|
||||
#[derive(Debug)]
|
||||
pub enum NameRefClass {
|
||||
Definition(Definition, Option<GenericSubstitution>),
|
||||
pub enum NameRefClass<'db> {
|
||||
Definition(Definition, Option<GenericSubstitution<'db>>),
|
||||
FieldShorthand {
|
||||
local_ref: Local,
|
||||
field_ref: Field,
|
||||
adt_subst: GenericSubstitution,
|
||||
adt_subst: GenericSubstitution<'db>,
|
||||
},
|
||||
/// The specific situation where we have an extern crate decl without a rename
|
||||
/// Here we have both a declaration and a reference.
|
||||
|
|
@ -741,13 +744,13 @@ pub enum NameRefClass {
|
|||
},
|
||||
}
|
||||
|
||||
impl NameRefClass {
|
||||
impl<'db> NameRefClass<'db> {
|
||||
// Note: we don't have unit-tests for this rather important function.
|
||||
// It is primarily exercised via goto definition tests in `ide`.
|
||||
pub fn classify(
|
||||
sema: &Semantics<'_, RootDatabase>,
|
||||
sema: &Semantics<'db, RootDatabase>,
|
||||
name_ref: &ast::NameRef,
|
||||
) -> Option<NameRefClass> {
|
||||
) -> Option<NameRefClass<'db>> {
|
||||
let _p = tracing::info_span!("NameRefClass::classify", ?name_ref).entered();
|
||||
|
||||
let parent = name_ref.syntax().parent()?;
|
||||
|
|
@ -866,9 +869,9 @@ impl NameRefClass {
|
|||
}
|
||||
|
||||
pub fn classify_lifetime(
|
||||
sema: &Semantics<'_, RootDatabase>,
|
||||
sema: &Semantics<'db, RootDatabase>,
|
||||
lifetime: &ast::Lifetime,
|
||||
) -> Option<NameRefClass> {
|
||||
) -> Option<NameRefClass<'db>> {
|
||||
let _p = tracing::info_span!("NameRefClass::classify_lifetime", ?lifetime).entered();
|
||||
if lifetime.text() == "'static" {
|
||||
return Some(NameRefClass::Definition(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue