code_model_impl::def_id_to_ast,
docs::{Documentation, Docs, docs_from_ast},
module_tree::ModuleId,
- ids::{FunctionId, StructId, EnumId, EnumVariantId, AstItemDef},
+ ids::{FunctionId, StructId, EnumId, EnumVariantId, AstItemDef, ConstId, StaticId},
};
/// hir::Crate describes a single crate. It's the main interface with which
#[derive(Debug)]
pub enum Def {
- Const(Const),
- Static(Static),
Trait(Trait),
Type(Type),
Item,
Function(Function),
Struct(Struct),
Enum(Enum),
- // Can't be directly declared, but can be imported.
EnumVariant(EnumVariant),
+ Const(Const),
+ Static(Static),
+ // Can't be directly declared, but can be imported.
Def(DefId),
}
-impl_froms!(ModuleDef: Module, Function, Struct, Enum, EnumVariant);
+impl_froms!(
+ ModuleDef: Module,
+ Function,
+ Struct,
+ Enum,
+ EnumVariant,
+ Const,
+ Static
+);
impl From<DefId> for ModuleDef {
fn from(it: DefId) -> ModuleDef {
}
}
-#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Const {
- pub(crate) def_id: DefId,
+ pub(crate) id: ConstId,
}
impl Const {
- pub(crate) fn new(def_id: DefId) -> Const {
- Const { def_id }
- }
-
pub fn source(&self, db: &impl HirDatabase) -> (HirFileId, TreeArc<ast::ConstDef>) {
- def_id_to_ast(db, self.def_id)
+ self.id.source(db)
}
}
}
}
-#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Static {
- pub(crate) def_id: DefId,
+ pub(crate) id: StaticId,
}
impl Static {
- pub(crate) fn new(def_id: DefId) -> Static {
- Static { def_id }
- }
-
pub fn source(&self, db: &impl HirDatabase) -> (HirFileId, TreeArc<ast::StaticDef>) {
- def_id_to_ast(db, self.def_id)
+ self.id.source(db)
}
}
None => PerNs::none(),
}
}
- ModuleDef::Function(_) | ModuleDef::Struct(_) | ModuleDef::EnumVariant(_) => {
+ ModuleDef::Function(_)
+ | ModuleDef::Struct(_)
+ | ModuleDef::Const(_)
+ | ModuleDef::Static(_)
+ | ModuleDef::EnumVariant(_) => {
// could be an inherent method call in UFCS form
// (`Struct::method`), or some other kind of associated
// item... Which we currently don't handle (TODO)
use crate::{
HirDatabase, Def,
- Module, Trait, Type, Static, Const,
+ Module, Trait, Type,
};
#[derive(Debug, Default)]
structs: LocationIntener<ItemLoc<ast::StructDef>, StructId>,
enums: LocationIntener<ItemLoc<ast::EnumDef>, EnumId>,
enum_variants: LocationIntener<ItemLoc<ast::EnumVariant>, EnumVariantId>,
+ consts: LocationIntener<ItemLoc<ast::ConstDef>, ConstId>,
+ statics: LocationIntener<ItemLoc<ast::StaticDef>, StaticId>,
}
impl HirInterner {
}
}
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+pub struct ConstId(RawId);
+impl_arena_id!(ConstId);
+impl AstItemDef<ast::ConstDef> for ConstId {
+ fn interner(interner: &HirInterner) -> &LocationIntener<ItemLoc<ast::ConstDef>, Self> {
+ &interner.consts
+ }
+}
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+pub struct StaticId(RawId);
+impl_arena_id!(StaticId);
+impl AstItemDef<ast::StaticDef> for StaticId {
+ fn interner(interner: &HirInterner) -> &LocationIntener<ItemLoc<ast::StaticDef>, Self> {
+ &interner.statics
+ }
+}
+
/// Def's are a core concept of hir. A `Def` is an Item (function, module, etc)
/// in a specific module.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub(crate) enum DefKind {
- Const,
- Static,
Trait,
Type,
Item,
pub fn resolve(self, db: &impl HirDatabase) -> Def {
let loc = self.loc(db);
match loc.kind {
- DefKind::Const => {
- let def = Const::new(self);
- Def::Const(def)
- }
- DefKind::Static => {
- let def = Static::new(self);
- Def::Static(def)
- }
DefKind::Trait => {
let def = Trait::new(self);
Def::Trait(def)
use crate::{
SourceItemId, Path, ModuleSource, HirDatabase, Name, SourceFileItems,
HirFileId, MacroCallLoc, AsName, PerNs, DefKind, DefLoc, Function,
- ModuleDef, Module, Struct, Enum,
+ ModuleDef, Module, Struct, Enum, Const, Static,
ids::LocationCtx,
};
// TODO
return;
}
- ast::ModuleItemKind::ConstDef(it) => it.name(),
- ast::ModuleItemKind::StaticDef(it) => it.name(),
+ ast::ModuleItemKind::ConstDef(it) => {
+ if let Some(name) = it.name() {
+ let c = Const { id: ctx.to_def(it) };
+ self.declarations
+ .insert(name.as_name(), PerNs::values(c.into()));
+ }
+ return;
+ }
+ ast::ModuleItemKind::StaticDef(it) => {
+ if let Some(name) = it.name() {
+ let s = Static { id: ctx.to_def(it) };
+ self.declarations
+ .insert(name.as_name(), PerNs::values(s.into()));
+ }
+ return;
+ }
ast::ModuleItemKind::Module(_) => {
// modules are handled separately direclty by nameres
return;
SyntaxKind::ENUM_DEF => unreachable!(),
SyntaxKind::TRAIT_DEF => PerNs::types(DefKind::Trait),
SyntaxKind::TYPE_DEF => PerNs::types(DefKind::Type),
- SyntaxKind::CONST_DEF => PerNs::values(DefKind::Const),
- SyntaxKind::STATIC_DEF => PerNs::values(DefKind::Static),
+ SyntaxKind::CONST_DEF => unreachable!(),
+ SyntaxKind::STATIC_DEF => unreachable!(),
_ => PerNs::none(),
}
}
ModuleDef::Struct(s) => s.into(),
ModuleDef::Enum(e) => e.into(),
ModuleDef::EnumVariant(v) => v.into(),
- ModuleDef::Def(_) | ModuleDef::Module(_) => return None,
+ ModuleDef::Const(_)
+ | ModuleDef::Static(_)
+ | ModuleDef::Def(_)
+ | ModuleDef::Module(_) => return None,
};
Some(res)
}
hir::ModuleDef::Function(_)
| hir::ModuleDef::Struct(_)
| hir::ModuleDef::Def(_)
+ | hir::ModuleDef::Const(_)
+ | hir::ModuleDef::Static(_)
| hir::ModuleDef::EnumVariant(_) => return,
};
}
hir::ModuleDef::Struct(it) => (CompletionItemKind::Struct, it.docs(ctx.db)),
hir::ModuleDef::Enum(it) => (CompletionItemKind::Enum, it.docs(ctx.db)),
hir::ModuleDef::EnumVariant(it) => (CompletionItemKind::EnumVariant, it.docs(ctx.db)),
+ hir::ModuleDef::Const(it) => (CompletionItemKind::Const, it.docs(ctx.db)),
+ hir::ModuleDef::Static(it) => (CompletionItemKind::Static, it.docs(ctx.db)),
hir::ModuleDef::Def(def_id) => match def_id.resolve(ctx.db) {
hir::Def::Trait(it) => (CompletionItemKind::Trait, it.docs(ctx.db)),
hir::Def::Type(it) => (CompletionItemKind::TypeAlias, it.docs(ctx.db)),
- hir::Def::Const(it) => (CompletionItemKind::Const, it.docs(ctx.db)),
- hir::Def::Static(it) => (CompletionItemKind::Static, it.docs(ctx.db)),
_ => return self,
},
};
&*node,
));
}
+ hir::ModuleDef::Const(s) => {
+ let (file_id, node) = s.source(db);
+ return Some(NavigationTarget::from_named(
+ file_id.original_file(db),
+ &*node,
+ ));
+ }
+ hir::ModuleDef::Static(s) => {
+ let (file_id, node) = s.source(db);
+ return Some(NavigationTarget::from_named(
+ file_id.original_file(db),
+ &*node,
+ ));
+ }
hir::ModuleDef::Enum(e) => {
let (file_id, node) = e.source(db);
return Some(NavigationTarget::from_named(
let (file_id, node) = f.source(db);
NavigationTarget::from_named(file_id.original_file(db), &*node)
}
- Def::Static(f) => {
- let (file_id, node) = f.source(db);
- NavigationTarget::from_named(file_id.original_file(db), &*node)
- }
- Def::Const(f) => {
- let (file_id, node) = f.source(db);
- NavigationTarget::from_named(file_id.original_file(db), &*node)
- }
Def::Item => return None,
};
Some(res)