fn collect_block_items(&mut self, block: &ast::Block) {
let container = ContainerId::DefWithBodyId(self.def);
for item in block.items() {
- let def: ModuleDefId = match item {
+ let (def, name): (ModuleDefId, Option<ast::Name>) = match item {
ast::ModuleItem::FnDef(def) => {
let ast_id = self.expander.ast_id(&def);
- FunctionLoc { container: container.into(), ast_id }.intern(self.db).into()
+ (
+ FunctionLoc { container: container.into(), ast_id }.intern(self.db).into(),
+ def.name(),
+ )
}
ast::ModuleItem::TypeAliasDef(def) => {
let ast_id = self.expander.ast_id(&def);
- TypeAliasLoc { container: container.into(), ast_id }.intern(self.db).into()
+ (
+ TypeAliasLoc { container: container.into(), ast_id }.intern(self.db).into(),
+ def.name(),
+ )
}
ast::ModuleItem::ConstDef(def) => {
let ast_id = self.expander.ast_id(&def);
- ConstLoc { container: container.into(), ast_id }.intern(self.db).into()
+ (
+ ConstLoc { container: container.into(), ast_id }.intern(self.db).into(),
+ def.name(),
+ )
}
ast::ModuleItem::StaticDef(def) => {
let ast_id = self.expander.ast_id(&def);
- StaticLoc { container, ast_id }.intern(self.db).into()
+ (StaticLoc { container, ast_id }.intern(self.db).into(), def.name())
}
ast::ModuleItem::StructDef(def) => {
let ast_id = self.expander.ast_id(&def);
- StructLoc { container, ast_id }.intern(self.db).into()
+ (StructLoc { container, ast_id }.intern(self.db).into(), def.name())
}
ast::ModuleItem::EnumDef(def) => {
let ast_id = self.expander.ast_id(&def);
- EnumLoc { container, ast_id }.intern(self.db).into()
+ (EnumLoc { container, ast_id }.intern(self.db).into(), def.name())
}
ast::ModuleItem::UnionDef(def) => {
let ast_id = self.expander.ast_id(&def);
- UnionLoc { container, ast_id }.intern(self.db).into()
+ (UnionLoc { container, ast_id }.intern(self.db).into(), def.name())
}
ast::ModuleItem::TraitDef(def) => {
let ast_id = self.expander.ast_id(&def);
- TraitLoc { container, ast_id }.intern(self.db).into()
+ (TraitLoc { container, ast_id }.intern(self.db).into(), def.name())
}
ast::ModuleItem::ImplBlock(_)
| ast::ModuleItem::UseItem(_)
| ast::ModuleItem::ExternCrateItem(_)
| ast::ModuleItem::Module(_) => continue,
};
- self.body.item_scope.define_def(def)
+ self.body.item_scope.define_def(def);
+ if let Some(name) = name {
+ self.body.item_scope.push_res(name.as_name(), def.into());
+ }
}
}
use crate::{
body::scope::{ExprScopes, ScopeId},
+ body::Body,
builtin_type::BuiltinType,
db::DefDatabase,
expr::{ExprId, PatId},
AdtScope(AdtId),
/// Local bindings
ExprScope(ExprScope),
+ /// Temporary hack to support local items.
+ LocalItemsScope(Arc<Body>),
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
for scope in self.scopes.iter().rev() {
match scope {
Scope::ExprScope(_) => continue,
- Scope::GenericParams { .. } | Scope::ImplBlockScope(_) if skip_to_mod => continue,
+ Scope::GenericParams { .. }
+ | Scope::ImplBlockScope(_)
+ | Scope::LocalItemsScope(_)
+ if skip_to_mod =>
+ {
+ continue
+ }
Scope::GenericParams { params, def } => {
if let Some(local_id) = params.find_by_name(first_name) {
&path,
BuiltinShadowMode::Other,
);
- let res = match module_def.take_types()? {
- ModuleDefId::AdtId(it) => TypeNs::AdtId(it),
- ModuleDefId::EnumVariantId(it) => TypeNs::EnumVariantId(it),
-
- ModuleDefId::TypeAliasId(it) => TypeNs::TypeAliasId(it),
- ModuleDefId::BuiltinType(it) => TypeNs::BuiltinType(it),
-
- ModuleDefId::TraitId(it) => TypeNs::TraitId(it),
-
- ModuleDefId::FunctionId(_)
- | ModuleDefId::ConstId(_)
- | ModuleDefId::StaticId(_)
- | ModuleDefId::ModuleId(_) => return None,
- };
+ let res = to_type_ns(module_def)?;
return Some((res, idx));
}
+ Scope::LocalItemsScope(body) => {
+ let def = body.item_scope.get(first_name, BuiltinShadowMode::Other);
+ if let Some(res) = to_type_ns(def) {
+ return Some((res, None));
+ }
+ }
}
}
- None
+ return None;
+ fn to_type_ns(per_ns: PerNs) -> Option<TypeNs> {
+ let res = match per_ns.take_types()? {
+ ModuleDefId::AdtId(it) => TypeNs::AdtId(it),
+ ModuleDefId::EnumVariantId(it) => TypeNs::EnumVariantId(it),
+
+ ModuleDefId::TypeAliasId(it) => TypeNs::TypeAliasId(it),
+ ModuleDefId::BuiltinType(it) => TypeNs::BuiltinType(it),
+
+ ModuleDefId::TraitId(it) => TypeNs::TraitId(it),
+
+ ModuleDefId::FunctionId(_)
+ | ModuleDefId::ConstId(_)
+ | ModuleDefId::StaticId(_)
+ | ModuleDefId::ModuleId(_) => return None,
+ };
+ Some(res)
+ }
}
pub fn resolve_path_in_type_ns_fully(
| Scope::ExprScope(_)
| Scope::GenericParams { .. }
| Scope::ImplBlockScope(_)
+ | Scope::LocalItemsScope(_)
if skip_to_mod =>
{
continue
);
return match idx {
None => {
- let value = match module_def.take_values()? {
- ModuleDefId::FunctionId(it) => ValueNs::FunctionId(it),
- ModuleDefId::AdtId(AdtId::StructId(it)) => ValueNs::StructId(it),
- ModuleDefId::EnumVariantId(it) => ValueNs::EnumVariantId(it),
- ModuleDefId::ConstId(it) => ValueNs::ConstId(it),
- ModuleDefId::StaticId(it) => ValueNs::StaticId(it),
-
- ModuleDefId::AdtId(AdtId::EnumId(_))
- | ModuleDefId::AdtId(AdtId::UnionId(_))
- | ModuleDefId::TraitId(_)
- | ModuleDefId::TypeAliasId(_)
- | ModuleDefId::BuiltinType(_)
- | ModuleDefId::ModuleId(_) => return None,
- };
+ let value = to_value_ns(module_def)?;
Some(ResolveValueResult::ValueNs(value))
}
Some(idx) => {
}
};
}
+ Scope::LocalItemsScope(body) => {
+ let def = body.item_scope.get(first_name, BuiltinShadowMode::Other);
+ if let Some(res) = to_value_ns(def) {
+ return Some(ResolveValueResult::ValueNs(res));
+ }
+ }
}
}
- None
+ return None;
+
+ fn to_value_ns(per_ns: PerNs) -> Option<ValueNs> {
+ let res = match per_ns.take_values()? {
+ ModuleDefId::FunctionId(it) => ValueNs::FunctionId(it),
+ ModuleDefId::AdtId(AdtId::StructId(it)) => ValueNs::StructId(it),
+ ModuleDefId::EnumVariantId(it) => ValueNs::EnumVariantId(it),
+ ModuleDefId::ConstId(it) => ValueNs::ConstId(it),
+ ModuleDefId::StaticId(it) => ValueNs::StaticId(it),
+
+ ModuleDefId::AdtId(AdtId::EnumId(_))
+ | ModuleDefId::AdtId(AdtId::UnionId(_))
+ | ModuleDefId::TraitId(_)
+ | ModuleDefId::TypeAliasId(_)
+ | ModuleDefId::BuiltinType(_)
+ | ModuleDefId::ModuleId(_) => return None,
+ };
+ Some(res)
+ }
}
pub fn resolve_path_in_value_ns_fully(
});
}
}
+ Scope::LocalItemsScope(body) => {
+ body.item_scope.entries_without_primitives().for_each(|(name, def)| {
+ f(name.clone(), ScopeDef::PerNs(def));
+ })
+ }
Scope::GenericParams { params, def } => {
for (local_id, param) in params.types.iter() {
f(
scope_id: Option<ScopeId>,
) -> Resolver {
let mut r = owner.resolver(db);
+ r = r.push_local_items_scope(db.body(owner));
let scopes = db.expr_scopes(owner);
let scope_chain = scopes.scope_chain(scope_id).collect::<Vec<_>>();
for scope in scope_chain.into_iter().rev() {
self.push_scope(Scope::ModuleScope(ModuleItemMap { crate_def_map, module_id }))
}
+ fn push_local_items_scope(self, body: Arc<Body>) -> Resolver {
+ self.push_scope(Scope::LocalItemsScope(body))
+ }
+
fn push_expr_scope(
self,
owner: DefWithBodyId,