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.rs | 123 +----------------------------------- crates/ra_hir/src/code_model/src.rs | 120 +++++++++++++++++++++++++++++++++++ crates/ra_hir/src/lib.rs | 3 +- 3 files changed, 125 insertions(+), 121 deletions(-) create mode 100644 crates/ra_hir/src/code_model/src.rs (limited to 'crates') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 282bd15de..0cfab27dc 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -1,10 +1,12 @@ +pub(crate) mod src; + use std::sync::Arc; use ra_db::{CrateId, SourceRootId, Edition, FileId}; use ra_syntax::{ast::{self, NameOwner, TypeAscriptionOwner}, TreeArc}; use crate::{ - Name, AsName, AstId, Ty, HirFileId, Either, KnownName, + Name, AsName, AstId, Ty, Either, KnownName, HasSource, HirDatabase, DefDatabase, AstDatabase, type_ref::TypeRef, nameres::{ModuleScope, Namespace, ImportId, CrateModuleId}, @@ -20,22 +22,6 @@ use crate::{ type_ref::Mutability, }; -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; -} - /// hir::Crate describes a single crate. It's the main interface with which /// a crate's dependencies interact. Mostly, it should be just a proxy for the /// root module. @@ -195,28 +181,6 @@ 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()) - } - /// Returns the syntax of the last path segment corresponding to this import pub fn import_source( self, @@ -343,13 +307,6 @@ pub enum FieldSource { Pos(TreeArc), } -impl HasSource for StructField { - type Ast = FieldSource; - fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source { - self.source_impl(db).into() - } -} - impl StructField { pub fn name(&self, db: &impl HirDatabase) -> Name { self.parent.variant_data(db).fields().unwrap()[self.id].name.clone() @@ -369,13 +326,6 @@ pub struct Struct { pub(crate) id: StructId, } -impl HasSource for Struct { - type Ast = TreeArc; - fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source> { - self.id.source(db).into() - } -} - impl Struct { pub fn module(self, db: &impl HirDatabase) -> Module { self.id.module(db) @@ -430,13 +380,6 @@ pub struct Union { pub(crate) id: StructId, } -impl HasSource for Union { - type Ast = TreeArc; - fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source> { - self.id.source(db).into() - } -} - impl Union { pub fn name(self, db: &impl DefDatabase) -> Option { db.struct_data(Struct { id: self.id }).name.clone() @@ -463,13 +406,6 @@ pub struct Enum { pub(crate) id: EnumId, } -impl HasSource for Enum { - type Ast = TreeArc; - fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source> { - self.id.source(db).into() - } -} - impl Enum { pub fn module(self, db: &impl HirDatabase) -> Module { self.id.module(db) @@ -513,13 +449,6 @@ pub struct EnumVariant { pub(crate) id: EnumVariantId, } -impl HasSource for EnumVariant { - type Ast = TreeArc; - fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source> { - self.source_impl(db) - } -} - impl EnumVariant { pub fn module(&self, db: &impl HirDatabase) -> Module { self.parent.module(db) @@ -589,14 +518,6 @@ pub struct Function { pub(crate) id: FunctionId, } -impl HasSource for Function { - type Ast = TreeArc; - - fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source> { - self.id.source(db).into() - } -} - /// The declared signature of a function. #[derive(Debug, Clone, PartialEq, Eq)] pub struct FnSignature { @@ -743,14 +664,6 @@ pub struct Const { pub(crate) id: ConstId, } -impl HasSource for Const { - type Ast = TreeArc; - - fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source> { - self.id.source(db).into() - } -} - impl Const { pub fn module(self, db: &impl DefDatabase) -> Module { self.id.module(db) @@ -827,14 +740,6 @@ pub struct Static { pub(crate) id: StaticId, } -impl HasSource for Static { - type Ast = TreeArc; - - fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source> { - self.id.source(db).into() - } -} - impl Static { pub fn module(self, db: &impl DefDatabase) -> Module { self.id.module(db) @@ -860,13 +765,6 @@ pub struct Trait { pub(crate) id: TraitId, } -impl HasSource for Trait { - type Ast = TreeArc; - fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source> { - self.id.source(db).into() - } -} - impl Trait { pub fn module(self, db: &impl DefDatabase) -> Module { self.id.module(db) @@ -906,13 +804,6 @@ pub struct TypeAlias { pub(crate) id: TypeAliasId, } -impl HasSource for TypeAlias { - type Ast = TreeArc; - fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source> { - self.id.source(db).into() - } -} - impl TypeAlias { pub fn module(self, db: &impl DefDatabase) -> Module { self.id.module(db) @@ -962,14 +853,6 @@ pub struct MacroDef { pub(crate) id: MacroDefId, } -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() - } -} - impl MacroDef {} pub enum Container { 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() + } +} diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs index 02f5f7f40..1690296e5 100644 --- a/crates/ra_hir/src/lib.rs +++ b/crates/ra_hir/src/lib.rs @@ -81,5 +81,6 @@ pub use self::code_model::{ StructField, FieldSource, Static, Const, ConstSignature, Trait, TypeAlias, MacroDef, Container, - BuiltinType, Source, HasSource, + BuiltinType, + src::{Source, HasSource}, }; -- cgit v1.2.3