mirror of
https://github.com/rust-lang/rust.git
synced 2025-01-19 03:03:21 +00:00
Split internal and user-visible ScopeDef
This commit is contained in:
parent
ca1af86e7b
commit
eb53aa37a3
@ -19,7 +19,7 @@ use crate::{
|
|||||||
code_model::Crate,
|
code_model::Crate,
|
||||||
db::HirDatabase,
|
db::HirDatabase,
|
||||||
expr::{ExprScopes, PatId, ScopeId},
|
expr::{ExprScopes, PatId, ScopeId},
|
||||||
DefWithBody, GenericDef, GenericParam, Local, MacroDef, PerNs, ScopeDef,
|
DefWithBody, GenericDef, MacroDef, PerNs,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Debug, Clone, Default)]
|
#[derive(Debug, Clone, Default)]
|
||||||
@ -377,6 +377,13 @@ impl Resolver {
|
|||||||
_ => None,
|
_ => None,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn body_owner(&self) -> Option<DefWithBodyId> {
|
||||||
|
self.scopes.iter().find_map(|scope| match scope {
|
||||||
|
Scope::ExprScope(it) => Some(it.owner),
|
||||||
|
_ => None,
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Resolver {
|
impl Resolver {
|
||||||
@ -420,6 +427,14 @@ impl Resolver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) enum ScopeDef {
|
||||||
|
PerNs(PerNs),
|
||||||
|
ImplSelfType(ImplId),
|
||||||
|
AdtSelfType(AdtId),
|
||||||
|
GenericParam(u32),
|
||||||
|
Local(PatId),
|
||||||
|
}
|
||||||
|
|
||||||
impl Scope {
|
impl Scope {
|
||||||
fn process_names(&self, db: &impl DefDatabase2, f: &mut dyn FnMut(Name, ScopeDef)) {
|
fn process_names(&self, db: &impl DefDatabase2, f: &mut dyn FnMut(Name, ScopeDef)) {
|
||||||
match self {
|
match self {
|
||||||
@ -432,30 +447,24 @@ impl Scope {
|
|||||||
// }),
|
// }),
|
||||||
// );
|
// );
|
||||||
m.crate_def_map[m.module_id].scope.entries().for_each(|(name, res)| {
|
m.crate_def_map[m.module_id].scope.entries().for_each(|(name, res)| {
|
||||||
f(name.clone(), res.def.into());
|
f(name.clone(), ScopeDef::PerNs(res.def));
|
||||||
});
|
});
|
||||||
m.crate_def_map[m.module_id].scope.legacy_macros().for_each(|(name, macro_)| {
|
m.crate_def_map[m.module_id].scope.legacy_macros().for_each(|(name, macro_)| {
|
||||||
f(name.clone(), ScopeDef::MacroDef(macro_.into()));
|
f(name.clone(), ScopeDef::PerNs(PerNs::macros(macro_)));
|
||||||
});
|
});
|
||||||
m.crate_def_map.extern_prelude().iter().for_each(|(name, &def)| {
|
m.crate_def_map.extern_prelude().iter().for_each(|(name, &def)| {
|
||||||
f(name.clone(), ScopeDef::ModuleDef(def.into()));
|
f(name.clone(), ScopeDef::PerNs(PerNs::types(def.into())));
|
||||||
});
|
});
|
||||||
if let Some(prelude) = m.crate_def_map.prelude() {
|
if let Some(prelude) = m.crate_def_map.prelude() {
|
||||||
let prelude_def_map = db.crate_def_map(prelude.krate);
|
let prelude_def_map = db.crate_def_map(prelude.krate);
|
||||||
prelude_def_map[prelude.module_id].scope.entries().for_each(|(name, res)| {
|
prelude_def_map[prelude.module_id].scope.entries().for_each(|(name, res)| {
|
||||||
f(name.clone(), res.def.into());
|
f(name.clone(), ScopeDef::PerNs(res.def));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Scope::GenericParams { params, def } => {
|
Scope::GenericParams { params, .. } => {
|
||||||
for param in params.params.iter() {
|
for param in params.params.iter() {
|
||||||
f(
|
f(param.name.clone(), ScopeDef::GenericParam(param.idx))
|
||||||
param.name.clone(),
|
|
||||||
ScopeDef::GenericParam(GenericParam {
|
|
||||||
parent: (*def).into(),
|
|
||||||
idx: param.idx,
|
|
||||||
}),
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Scope::ImplBlockScope(i) => {
|
Scope::ImplBlockScope(i) => {
|
||||||
@ -466,8 +475,7 @@ impl Scope {
|
|||||||
}
|
}
|
||||||
Scope::ExprScope(scope) => {
|
Scope::ExprScope(scope) => {
|
||||||
scope.expr_scopes.entries(scope.scope_id).iter().for_each(|e| {
|
scope.expr_scopes.entries(scope.scope_id).iter().for_each(|e| {
|
||||||
let local = Local { parent: scope.owner.into(), pat_id: e.pat() };
|
f(e.name().clone(), ScopeDef::Local(e.pat()));
|
||||||
f(e.name().clone(), ScopeDef::Local(local));
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,7 +23,7 @@ use crate::{
|
|||||||
db::HirDatabase,
|
db::HirDatabase,
|
||||||
expr::{BodySourceMap, ExprScopes, ScopeId},
|
expr::{BodySourceMap, ExprScopes, ScopeId},
|
||||||
ids::LocationCtx,
|
ids::LocationCtx,
|
||||||
resolve::{resolver_for_scope, HasResolver, TypeNs, ValueNs},
|
resolve::{self, resolver_for_scope, HasResolver, TypeNs, ValueNs},
|
||||||
ty::method_resolution::{self, implements_trait},
|
ty::method_resolution::{self, implements_trait},
|
||||||
Adt, AssocItem, Const, DefWithBody, Either, Enum, EnumVariant, FromSource, Function,
|
Adt, AssocItem, Const, DefWithBody, Either, Enum, EnumVariant, FromSource, Function,
|
||||||
GenericParam, HasBody, HirFileId, Local, MacroDef, Module, Name, Path, Resolver, ScopeDef,
|
GenericParam, HasBody, HirFileId, Local, MacroDef, Module, Name, Path, Resolver, ScopeDef,
|
||||||
@ -310,7 +310,22 @@ impl SourceAnalyzer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn process_all_names(&self, db: &impl HirDatabase, f: &mut dyn FnMut(Name, ScopeDef)) {
|
pub fn process_all_names(&self, db: &impl HirDatabase, f: &mut dyn FnMut(Name, ScopeDef)) {
|
||||||
self.resolver.process_all_names(db, f)
|
self.resolver.process_all_names(db, &mut |name, def| {
|
||||||
|
let def = match def {
|
||||||
|
resolve::ScopeDef::PerNs(it) => it.into(),
|
||||||
|
resolve::ScopeDef::ImplSelfType(it) => ScopeDef::ImplSelfType(it.into()),
|
||||||
|
resolve::ScopeDef::AdtSelfType(it) => ScopeDef::AdtSelfType(it.into()),
|
||||||
|
resolve::ScopeDef::GenericParam(idx) => {
|
||||||
|
let parent = self.resolver.generic_def().unwrap().into();
|
||||||
|
ScopeDef::GenericParam(GenericParam { parent, idx })
|
||||||
|
}
|
||||||
|
resolve::ScopeDef::Local(pat_id) => {
|
||||||
|
let parent = self.resolver.body_owner().unwrap().into();
|
||||||
|
ScopeDef::Local(Local { parent, pat_id })
|
||||||
|
}
|
||||||
|
};
|
||||||
|
f(name, def)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: we only use this in `inline_local_variable` assist, ideally, we
|
// FIXME: we only use this in `inline_local_variable` assist, ideally, we
|
||||||
|
Loading…
Reference in New Issue
Block a user