From 0dcaded439ae4bd4670bc6a2fbf739cd4fce60af Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 11 Jun 2019 18:00:08 +0300 Subject: move source to a seaparate file --- crates/ra_hir/src/code_model/src.rs | 120 ++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 crates/ra_hir/src/code_model/src.rs (limited to 'crates/ra_hir/src/code_model') diff --git a/crates/ra_hir/src/code_model/src.rs b/crates/ra_hir/src/code_model/src.rs new file mode 100644 index 000000000..7484faf04 --- /dev/null +++ b/crates/ra_hir/src/code_model/src.rs @@ -0,0 +1,120 @@ +use ra_syntax::{TreeArc, ast}; + +use crate::{ + HirFileId, DefDatabase, AstDatabase, Module, ModuleSource, + StructField, Struct, Enum, Union, EnumVariant, Function, Static, Trait, Const, TypeAlias, + FieldSource, MacroDef, ids::AstItemDef, +}; + +pub struct Source { + pub file_id: HirFileId, + pub ast: T, +} + +impl From<(HirFileId, T)> for Source { + fn from((file_id, ast): (HirFileId, T)) -> Self { + Source { file_id, ast } + } +} + +pub trait HasSource { + type Ast; + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source; +} + +/// NB: Module is !HasSource, becase it has two source nodes at the same time: +/// definition and declaration. +impl Module { + /// Returns a node which defines this module. That is, a file or a `mod foo {}` with items. + pub fn definition_source(self, db: &(impl DefDatabase + AstDatabase)) -> Source { + let def_map = db.crate_def_map(self.krate); + let decl_id = def_map[self.module_id].declaration; + let file_id = def_map[self.module_id].definition; + let module_source = ModuleSource::new(db, file_id, decl_id); + let file_id = file_id.map(HirFileId::from).unwrap_or_else(|| decl_id.unwrap().file_id()); + (file_id, module_source).into() + } + + /// Returns a node which declares this module, either a `mod foo;` or a `mod foo {}`. + /// `None` for the crate root. + pub fn declaration_source( + self, + db: &(impl DefDatabase + AstDatabase), + ) -> Option>> { + let def_map = db.crate_def_map(self.krate); + let decl = def_map[self.module_id].declaration?; + let ast = decl.to_node(db); + Some((decl.file_id(), ast).into()) + } +} + +impl HasSource for StructField { + type Ast = FieldSource; + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source { + self.source_impl(db).into() + } +} +impl HasSource for Struct { + type Ast = TreeArc; + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source> { + self.id.source(db).into() + } +} +impl HasSource for Union { + type Ast = TreeArc; + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source> { + self.id.source(db).into() + } +} +impl HasSource for Enum { + type Ast = TreeArc; + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source> { + self.id.source(db).into() + } +} +impl HasSource for EnumVariant { + type Ast = TreeArc; + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source> { + self.source_impl(db) + } +} +impl HasSource for Function { + type Ast = TreeArc; + + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source> { + self.id.source(db).into() + } +} +impl HasSource for Const { + type Ast = TreeArc; + + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source> { + self.id.source(db).into() + } +} +impl HasSource for Static { + type Ast = TreeArc; + + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source> { + self.id.source(db).into() + } +} +impl HasSource for Trait { + type Ast = TreeArc; + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source> { + self.id.source(db).into() + } +} +impl HasSource for TypeAlias { + type Ast = TreeArc; + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source> { + self.id.source(db).into() + } +} +impl HasSource for MacroDef { + type Ast = TreeArc; + + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source> { + (self.id.0.file_id(), self.id.0.to_node(db)).into() + } +} -- cgit v1.2.3