From 91c120ccea4f0cfef20fd4d918154c8152f83816 Mon Sep 17 00:00:00 2001
From: Aleksey Kladov <aleksey.kladov@gmail.com>
Date: Tue, 11 Jun 2019 02:34:34 +0300
Subject: introduce Source struct

---
 crates/ra_hir/src/adt.rs        |  9 ++++-----
 crates/ra_hir/src/code_model.rs | 18 +++++++++++++-----
 crates/ra_hir/src/docs.rs       |  2 +-
 crates/ra_hir/src/generics.rs   |  2 +-
 4 files changed, 19 insertions(+), 12 deletions(-)

(limited to 'crates/ra_hir/src')

diff --git a/crates/ra_hir/src/adt.rs b/crates/ra_hir/src/adt.rs
index 38ff1d6f6..36679e99b 100644
--- a/crates/ra_hir/src/adt.rs
+++ b/crates/ra_hir/src/adt.rs
@@ -59,8 +59,8 @@ impl StructData {
         db: &(impl DefDatabase + AstDatabase),
         struct_: Struct,
     ) -> Arc<StructData> {
-        let (_, struct_def) = struct_.source(db);
-        Arc::new(StructData::new(&*struct_def))
+        let src = struct_.source(db);
+        Arc::new(StructData::new(&*src.ast))
     }
 }
 
@@ -211,9 +211,8 @@ impl StructField {
         let es;
         let (file_id, struct_kind) = match self.parent {
             VariantDef::Struct(s) => {
-                let (file_id, source) = s.source(db);
-                ss = source;
-                (file_id, ss.kind())
+                ss = s.source(db);
+                (ss.file_id, ss.ast.kind())
             }
             VariantDef::EnumVariant(e) => {
                 let (file_id, source) = e.source(db);
diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs
index 27850028b..3469da18a 100644
--- a/crates/ra_hir/src/code_model.rs
+++ b/crates/ra_hir/src/code_model.rs
@@ -20,6 +20,17 @@ use crate::{
     type_ref::Mutability,
 };
 
+pub struct Source<T> {
+    pub file_id: HirFileId,
+    pub ast: T,
+}
+
+impl<T> From<(HirFileId, T)> for Source<T> {
+    fn from((file_id, ast): (HirFileId, T)) -> Self {
+        Source { file_id, ast }
+    }
+}
+
 /// 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.
@@ -354,11 +365,8 @@ pub struct Struct {
 }
 
 impl Struct {
-    pub fn source(
-        self,
-        db: &(impl DefDatabase + AstDatabase),
-    ) -> (HirFileId, TreeArc<ast::StructDef>) {
-        self.id.source(db)
+    pub fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StructDef>> {
+        self.id.source(db).into()
     }
 
     pub fn module(self, db: &impl HirDatabase) -> Module {
diff --git a/crates/ra_hir/src/docs.rs b/crates/ra_hir/src/docs.rs
index 1b0f84de5..edd937901 100644
--- a/crates/ra_hir/src/docs.rs
+++ b/crates/ra_hir/src/docs.rs
@@ -76,7 +76,7 @@ pub(crate) fn documentation_query(
             FieldSource::Named(named) => docs_from_ast(&*named),
             FieldSource::Pos(..) => return None,
         },
-        DocDef::Struct(it) => docs_from_ast(&*it.source(db).1),
+        DocDef::Struct(it) => docs_from_ast(&*it.source(db).ast),
         DocDef::Enum(it) => docs_from_ast(&*it.source(db).1),
         DocDef::EnumVariant(it) => docs_from_ast(&*it.source(db).1),
         DocDef::Static(it) => docs_from_ast(&*it.source(db).1),
diff --git a/crates/ra_hir/src/generics.rs b/crates/ra_hir/src/generics.rs
index b6c5e18d3..294a00721 100644
--- a/crates/ra_hir/src/generics.rs
+++ b/crates/ra_hir/src/generics.rs
@@ -69,7 +69,7 @@ impl GenericParams {
         let start = generics.parent_params.as_ref().map(|p| p.params.len()).unwrap_or(0) as u32;
         match def {
             GenericDef::Function(it) => generics.fill(&*it.source(db).1, start),
-            GenericDef::Struct(it) => generics.fill(&*it.source(db).1, start),
+            GenericDef::Struct(it) => generics.fill(&*it.source(db).ast, start),
             GenericDef::Union(it) => generics.fill(&*it.source(db).1, start),
             GenericDef::Enum(it) => generics.fill(&*it.source(db).1, start),
             GenericDef::Trait(it) => {
-- 
cgit v1.2.3


From 2a1fe26b6d354dbbd1b3843d288d56e74fa00557 Mon Sep 17 00:00:00 2001
From: Aleksey Kladov <aleksey.kladov@gmail.com>
Date: Tue, 11 Jun 2019 03:17:29 +0300
Subject: use Source more

---
 crates/ra_hir/src/adt.rs        | 21 ++++++++++-----------
 crates/ra_hir/src/code_model.rs |  9 +++------
 crates/ra_hir/src/docs.rs       |  4 ++--
 crates/ra_hir/src/generics.rs   |  2 +-
 crates/ra_hir/src/lib.rs        |  2 +-
 5 files changed, 17 insertions(+), 21 deletions(-)

(limited to 'crates/ra_hir/src')

diff --git a/crates/ra_hir/src/adt.rs b/crates/ra_hir/src/adt.rs
index 36679e99b..2b372333f 100644
--- a/crates/ra_hir/src/adt.rs
+++ b/crates/ra_hir/src/adt.rs
@@ -11,7 +11,7 @@ use ra_syntax::{
 
 use crate::{
     Name, AsName, Struct, Union, Enum, EnumVariant, Crate, AstDatabase,
-    HirDatabase, HirFileId, StructField, FieldSource,
+    HirDatabase, HirFileId, StructField, FieldSource, Source,
     type_ref::TypeRef, DefDatabase,
 };
 
@@ -72,15 +72,15 @@ impl EnumVariant {
     pub(crate) fn source_impl(
         &self,
         db: &(impl DefDatabase + AstDatabase),
-    ) -> (HirFileId, TreeArc<ast::EnumVariant>) {
-        let (file_id, enum_def) = self.parent.source(db);
-        let var = variants(&*enum_def)
+    ) -> Source<TreeArc<ast::EnumVariant>> {
+        let src = self.parent.source(db);
+        let ast = variants(&*src.ast)
             .zip(db.enum_data(self.parent).variants.iter())
             .find(|(_syntax, (id, _))| *id == self.id)
             .unwrap()
             .0
             .to_owned();
-        (file_id, var)
+        Source { file_id: src.file_id, ast }
     }
     pub(crate) fn variant_data(&self, db: &impl DefDatabase) -> Arc<VariantData> {
         db.enum_data(self.parent).variants[self.id].variant_data.clone()
@@ -95,9 +95,9 @@ pub struct EnumData {
 
 impl EnumData {
     pub(crate) fn enum_data_query(db: &(impl DefDatabase + AstDatabase), e: Enum) -> Arc<EnumData> {
-        let (_file_id, enum_def) = e.source(db);
-        let name = enum_def.name().map(|n| n.as_name());
-        let variants = variants(&*enum_def)
+        let src = e.source(db);
+        let name = src.ast.name().map(|n| n.as_name());
+        let variants = variants(&*src.ast)
             .map(|var| EnumVariantData {
                 name: var.name().map(|it| it.as_name()),
                 variant_data: Arc::new(VariantData::new(var.kind())),
@@ -215,9 +215,8 @@ impl StructField {
                 (ss.file_id, ss.ast.kind())
             }
             VariantDef::EnumVariant(e) => {
-                let (file_id, source) = e.source(db);
-                es = source;
-                (file_id, es.kind())
+                es = e.source(db);
+                (es.file_id, es.ast.kind())
             }
         };
 
diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs
index 3469da18a..63fdca55e 100644
--- a/crates/ra_hir/src/code_model.rs
+++ b/crates/ra_hir/src/code_model.rs
@@ -456,11 +456,8 @@ pub struct Enum {
 }
 
 impl Enum {
-    pub fn source(
-        self,
-        db: &(impl DefDatabase + AstDatabase),
-    ) -> (HirFileId, TreeArc<ast::EnumDef>) {
-        self.id.source(db)
+    pub fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::EnumDef>> {
+        self.id.source(db).into()
     }
 
     pub fn module(self, db: &impl HirDatabase) -> Module {
@@ -509,7 +506,7 @@ impl EnumVariant {
     pub fn source(
         &self,
         db: &(impl DefDatabase + AstDatabase),
-    ) -> (HirFileId, TreeArc<ast::EnumVariant>) {
+    ) -> Source<TreeArc<ast::EnumVariant>> {
         self.source_impl(db)
     }
     pub fn module(&self, db: &impl HirDatabase) -> Module {
diff --git a/crates/ra_hir/src/docs.rs b/crates/ra_hir/src/docs.rs
index edd937901..70b9d13b2 100644
--- a/crates/ra_hir/src/docs.rs
+++ b/crates/ra_hir/src/docs.rs
@@ -77,8 +77,8 @@ pub(crate) fn documentation_query(
             FieldSource::Pos(..) => return None,
         },
         DocDef::Struct(it) => docs_from_ast(&*it.source(db).ast),
-        DocDef::Enum(it) => docs_from_ast(&*it.source(db).1),
-        DocDef::EnumVariant(it) => docs_from_ast(&*it.source(db).1),
+        DocDef::Enum(it) => docs_from_ast(&*it.source(db).ast),
+        DocDef::EnumVariant(it) => docs_from_ast(&*it.source(db).ast),
         DocDef::Static(it) => docs_from_ast(&*it.source(db).1),
         DocDef::Const(it) => docs_from_ast(&*it.source(db).1),
         DocDef::Function(it) => docs_from_ast(&*it.source(db).1),
diff --git a/crates/ra_hir/src/generics.rs b/crates/ra_hir/src/generics.rs
index 294a00721..2a92d5945 100644
--- a/crates/ra_hir/src/generics.rs
+++ b/crates/ra_hir/src/generics.rs
@@ -71,7 +71,7 @@ impl GenericParams {
             GenericDef::Function(it) => generics.fill(&*it.source(db).1, start),
             GenericDef::Struct(it) => generics.fill(&*it.source(db).ast, start),
             GenericDef::Union(it) => generics.fill(&*it.source(db).1, start),
-            GenericDef::Enum(it) => generics.fill(&*it.source(db).1, start),
+            GenericDef::Enum(it) => generics.fill(&*it.source(db).ast, start),
             GenericDef::Trait(it) => {
                 // traits get the Self type as an implicit first type parameter
                 generics.params.push(GenericParam {
diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs
index 0e4aaf678..90e3f1275 100644
--- a/crates/ra_hir/src/lib.rs
+++ b/crates/ra_hir/src/lib.rs
@@ -81,5 +81,5 @@ pub use self::code_model::{
     StructField, FieldSource,
     Static, Const, ConstSignature,
     Trait, TypeAlias, MacroDef, Container,
-    BuiltinType,
+    BuiltinType, Source,
 };
-- 
cgit v1.2.3


From 36865adcb946d5567fb61d3547b78fc71df58b20 Mon Sep 17 00:00:00 2001
From: Aleksey Kladov <aleksey.kladov@gmail.com>
Date: Tue, 11 Jun 2019 16:40:49 +0300
Subject: Introduce HasSource trait

---
 crates/ra_hir/src/code_model.rs | 26 ++++++++++++++++++++++++++
 crates/ra_hir/src/lib.rs        |  2 +-
 2 files changed, 27 insertions(+), 1 deletion(-)

(limited to 'crates/ra_hir/src')

diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs
index 63fdca55e..765850488 100644
--- a/crates/ra_hir/src/code_model.rs
+++ b/crates/ra_hir/src/code_model.rs
@@ -31,6 +31,11 @@ impl<T> From<(HirFileId, T)> for Source<T> {
     }
 }
 
+pub trait HasSource {
+    type Ast;
+    fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<Self::Ast>;
+}
+
 /// 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.
@@ -364,6 +369,13 @@ pub struct Struct {
     pub(crate) id: StructId,
 }
 
+impl HasSource for Struct {
+    type Ast = TreeArc<ast::StructDef>;
+    fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StructDef>> {
+        self.id.source(db).into()
+    }
+}
+
 impl Struct {
     pub fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StructDef>> {
         self.id.source(db).into()
@@ -422,6 +434,13 @@ pub struct Union {
     pub(crate) id: StructId,
 }
 
+impl HasSource for Union {
+    type Ast = TreeArc<ast::StructDef>;
+    fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StructDef>> {
+        self.id.source(db).into()
+    }
+}
+
 impl Union {
     pub fn source(
         self,
@@ -455,6 +474,13 @@ pub struct Enum {
     pub(crate) id: EnumId,
 }
 
+impl HasSource for Enum {
+    type Ast = TreeArc<ast::EnumDef>;
+    fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::EnumDef>> {
+        self.id.source(db).into()
+    }
+}
+
 impl Enum {
     pub fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::EnumDef>> {
         self.id.source(db).into()
diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs
index 90e3f1275..02f5f7f40 100644
--- a/crates/ra_hir/src/lib.rs
+++ b/crates/ra_hir/src/lib.rs
@@ -81,5 +81,5 @@ pub use self::code_model::{
     StructField, FieldSource,
     Static, Const, ConstSignature,
     Trait, TypeAlias, MacroDef, Container,
-    BuiltinType, Source,
+    BuiltinType, Source, HasSource,
 };
-- 
cgit v1.2.3


From 4f94af3c4aaa57ebb4cb01f7e4edfb3a0821b09b Mon Sep 17 00:00:00 2001
From: Aleksey Kladov <aleksey.kladov@gmail.com>
Date: Tue, 11 Jun 2019 16:49:56 +0300
Subject: use Source for Function

---
 crates/ra_hir/src/code_model.rs      | 20 ++++++++++++++------
 crates/ra_hir/src/docs.rs            |  2 +-
 crates/ra_hir/src/expr.rs            |  6 +++---
 crates/ra_hir/src/expr/validation.rs |  2 +-
 crates/ra_hir/src/generics.rs        |  2 +-
 crates/ra_hir/src/ty/infer.rs        |  2 +-
 6 files changed, 21 insertions(+), 13 deletions(-)

(limited to 'crates/ra_hir/src')

diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs
index 765850488..aa6eb741b 100644
--- a/crates/ra_hir/src/code_model.rs
+++ b/crates/ra_hir/src/code_model.rs
@@ -603,6 +603,14 @@ pub struct Function {
     pub(crate) id: FunctionId,
 }
 
+impl HasSource for Function {
+    type Ast = TreeArc<ast::FnDef>;
+
+    fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::FnDef>> {
+        self.id.source(db).into()
+    }
+}
+
 /// The declared signature of a function.
 #[derive(Debug, Clone, PartialEq, Eq)]
 pub struct FnSignature {
@@ -619,11 +627,11 @@ impl FnSignature {
         db: &(impl DefDatabase + AstDatabase),
         func: Function,
     ) -> Arc<FnSignature> {
-        let (_, node) = func.source(db);
-        let name = node.name().map(|n| n.as_name()).unwrap_or_else(Name::missing);
+        let src = func.source(db);
+        let name = src.ast.name().map(|n| n.as_name()).unwrap_or_else(Name::missing);
         let mut params = Vec::new();
         let mut has_self_param = false;
-        if let Some(param_list) = node.param_list() {
+        if let Some(param_list) = src.ast.param_list() {
             if let Some(self_param) = param_list.self_param() {
                 let self_type = if let Some(type_ref) = self_param.ascribed_type() {
                     TypeRef::from_ast(type_ref)
@@ -647,7 +655,7 @@ impl FnSignature {
                 params.push(type_ref);
             }
         }
-        let ret_type = if let Some(type_ref) = node.ret_type().and_then(|rt| rt.type_ref()) {
+        let ret_type = if let Some(type_ref) = src.ast.ret_type().and_then(|rt| rt.type_ref()) {
             TypeRef::from_ast(type_ref)
         } else {
             TypeRef::unit()
@@ -676,8 +684,8 @@ impl FnSignature {
 }
 
 impl Function {
-    pub fn source(self, db: &(impl DefDatabase + AstDatabase)) -> (HirFileId, TreeArc<ast::FnDef>) {
-        self.id.source(db)
+    pub fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::FnDef>> {
+        self.id.source(db).into()
     }
 
     pub fn module(self, db: &impl DefDatabase) -> Module {
diff --git a/crates/ra_hir/src/docs.rs b/crates/ra_hir/src/docs.rs
index 70b9d13b2..8d7a5255f 100644
--- a/crates/ra_hir/src/docs.rs
+++ b/crates/ra_hir/src/docs.rs
@@ -81,7 +81,7 @@ pub(crate) fn documentation_query(
         DocDef::EnumVariant(it) => docs_from_ast(&*it.source(db).ast),
         DocDef::Static(it) => docs_from_ast(&*it.source(db).1),
         DocDef::Const(it) => docs_from_ast(&*it.source(db).1),
-        DocDef::Function(it) => docs_from_ast(&*it.source(db).1),
+        DocDef::Function(it) => docs_from_ast(&*it.source(db).ast),
         DocDef::Union(it) => docs_from_ast(&*it.source(db).1),
         DocDef::Trait(it) => docs_from_ast(&*it.source(db).1),
         DocDef::TypeAlias(it) => docs_from_ast(&*it.source(db).1),
diff --git a/crates/ra_hir/src/expr.rs b/crates/ra_hir/src/expr.rs
index 012f374ec..46d51e0db 100644
--- a/crates/ra_hir/src/expr.rs
+++ b/crates/ra_hir/src/expr.rs
@@ -1023,9 +1023,9 @@ pub(crate) fn body_with_source_map_query(
             collector.collect_const_body(&src)
         }
         DefWithBody::Function(ref f) => {
-            let (file_id, src) = f.source(db);
-            collector = ExprCollector::new(def, file_id, def.resolver(db), db);
-            collector.collect_fn_body(&src)
+            let src = f.source(db);
+            collector = ExprCollector::new(def, src.file_id, def.resolver(db), db);
+            collector.collect_fn_body(&src.ast)
         }
         DefWithBody::Static(ref s) => {
             let (file_id, src) = s.source(db);
diff --git a/crates/ra_hir/src/expr/validation.rs b/crates/ra_hir/src/expr/validation.rs
index a1b2641da..ff5e5f68e 100644
--- a/crates/ra_hir/src/expr/validation.rs
+++ b/crates/ra_hir/src/expr/validation.rs
@@ -71,7 +71,7 @@ impl<'a, 'b> ExprValidator<'a, 'b> {
             return;
         }
         let source_map = self.func.body_source_map(db);
-        let file_id = self.func.source(db).0;
+        let file_id = self.func.source(db).file_id;
         let source_file = db.parse(file_id.original_file(db)).tree;
         if let Some(field_list_node) = source_map
             .expr_syntax(id)
diff --git a/crates/ra_hir/src/generics.rs b/crates/ra_hir/src/generics.rs
index 2a92d5945..fcccd67c8 100644
--- a/crates/ra_hir/src/generics.rs
+++ b/crates/ra_hir/src/generics.rs
@@ -68,7 +68,7 @@ impl GenericParams {
         generics.parent_params = parent.map(|p| db.generic_params(p));
         let start = generics.parent_params.as_ref().map(|p| p.params.len()).unwrap_or(0) as u32;
         match def {
-            GenericDef::Function(it) => generics.fill(&*it.source(db).1, start),
+            GenericDef::Function(it) => generics.fill(&*it.source(db).ast, start),
             GenericDef::Struct(it) => generics.fill(&*it.source(db).ast, start),
             GenericDef::Union(it) => generics.fill(&*it.source(db).1, start),
             GenericDef::Enum(it) => generics.fill(&*it.source(db).ast, start),
diff --git a/crates/ra_hir/src/ty/infer.rs b/crates/ra_hir/src/ty/infer.rs
index 6aa727ea1..a534c2336 100644
--- a/crates/ra_hir/src/ty/infer.rs
+++ b/crates/ra_hir/src/ty/infer.rs
@@ -1432,7 +1432,7 @@ mod diagnostics {
         ) {
             match self {
                 InferenceDiagnostic::NoSuchField { expr, field } => {
-                    let (file, _) = owner.source(db);
+                    let file = owner.source(db).file_id;
                     let field = owner.body_source_map(db).field_syntax(*expr, *field);
                     sink.push(NoSuchField { file, field })
                 }
-- 
cgit v1.2.3


From 46bc8675edd403ffcd8963e4f26447b283e9d09e Mon Sep 17 00:00:00 2001
From: Aleksey Kladov <aleksey.kladov@gmail.com>
Date: Tue, 11 Jun 2019 17:13:20 +0300
Subject: use Source for statics and consts

---
 crates/ra_hir/src/code_model.rs | 34 ++++++++++++++++++++++------------
 crates/ra_hir/src/docs.rs       |  4 ++--
 crates/ra_hir/src/expr.rs       | 12 ++++++------
 3 files changed, 30 insertions(+), 20 deletions(-)

(limited to 'crates/ra_hir/src')

diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs
index aa6eb741b..a8a0875e0 100644
--- a/crates/ra_hir/src/code_model.rs
+++ b/crates/ra_hir/src/code_model.rs
@@ -761,12 +761,17 @@ pub struct Const {
     pub(crate) id: ConstId,
 }
 
+impl HasSource for Const {
+    type Ast = TreeArc<ast::ConstDef>;
+
+    fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::ConstDef>> {
+        self.id.source(db).into()
+    }
+}
+
 impl Const {
-    pub fn source(
-        self,
-        db: &(impl DefDatabase + AstDatabase),
-    ) -> (HirFileId, TreeArc<ast::ConstDef>) {
-        self.id.source(db)
+    pub fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::ConstDef>> {
+        self.id.source(db).into()
     }
 
     pub fn module(self, db: &impl DefDatabase) -> Module {
@@ -819,7 +824,7 @@ impl ConstSignature {
         db: &(impl DefDatabase + AstDatabase),
         konst: Const,
     ) -> Arc<ConstSignature> {
-        let (_, node) = konst.source(db);
+        let node = konst.source(db).ast;
         const_signature_for(&*node)
     }
 
@@ -827,7 +832,7 @@ impl ConstSignature {
         db: &(impl DefDatabase + AstDatabase),
         konst: Static,
     ) -> Arc<ConstSignature> {
-        let (_, node) = konst.source(db);
+        let node = konst.source(db).ast;
         const_signature_for(&*node)
     }
 }
@@ -844,12 +849,17 @@ pub struct Static {
     pub(crate) id: StaticId,
 }
 
+impl HasSource for Static {
+    type Ast = TreeArc<ast::StaticDef>;
+
+    fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StaticDef>> {
+        self.id.source(db).into()
+    }
+}
+
 impl Static {
-    pub fn source(
-        self,
-        db: &(impl DefDatabase + AstDatabase),
-    ) -> (HirFileId, TreeArc<ast::StaticDef>) {
-        self.id.source(db)
+    pub fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StaticDef>> {
+        self.id.source(db).into()
     }
 
     pub fn module(self, db: &impl DefDatabase) -> Module {
diff --git a/crates/ra_hir/src/docs.rs b/crates/ra_hir/src/docs.rs
index 8d7a5255f..86ca981f4 100644
--- a/crates/ra_hir/src/docs.rs
+++ b/crates/ra_hir/src/docs.rs
@@ -79,8 +79,8 @@ pub(crate) fn documentation_query(
         DocDef::Struct(it) => docs_from_ast(&*it.source(db).ast),
         DocDef::Enum(it) => docs_from_ast(&*it.source(db).ast),
         DocDef::EnumVariant(it) => docs_from_ast(&*it.source(db).ast),
-        DocDef::Static(it) => docs_from_ast(&*it.source(db).1),
-        DocDef::Const(it) => docs_from_ast(&*it.source(db).1),
+        DocDef::Static(it) => docs_from_ast(&*it.source(db).ast),
+        DocDef::Const(it) => docs_from_ast(&*it.source(db).ast),
         DocDef::Function(it) => docs_from_ast(&*it.source(db).ast),
         DocDef::Union(it) => docs_from_ast(&*it.source(db).1),
         DocDef::Trait(it) => docs_from_ast(&*it.source(db).1),
diff --git a/crates/ra_hir/src/expr.rs b/crates/ra_hir/src/expr.rs
index 46d51e0db..48e597519 100644
--- a/crates/ra_hir/src/expr.rs
+++ b/crates/ra_hir/src/expr.rs
@@ -1018,9 +1018,9 @@ pub(crate) fn body_with_source_map_query(
 
     match def {
         DefWithBody::Const(ref c) => {
-            let (file_id, src) = c.source(db);
-            collector = ExprCollector::new(def, file_id, def.resolver(db), db);
-            collector.collect_const_body(&src)
+            let src = c.source(db);
+            collector = ExprCollector::new(def, src.file_id, def.resolver(db), db);
+            collector.collect_const_body(&src.ast)
         }
         DefWithBody::Function(ref f) => {
             let src = f.source(db);
@@ -1028,9 +1028,9 @@ pub(crate) fn body_with_source_map_query(
             collector.collect_fn_body(&src.ast)
         }
         DefWithBody::Static(ref s) => {
-            let (file_id, src) = s.source(db);
-            collector = ExprCollector::new(def, file_id, def.resolver(db), db);
-            collector.collect_static_body(&src)
+            let src = s.source(db);
+            collector = ExprCollector::new(def, src.file_id, def.resolver(db), db);
+            collector.collect_static_body(&src.ast)
         }
     }
 
-- 
cgit v1.2.3


From f2ccc54468348af96d6167da5971749ef0f4ab5e Mon Sep 17 00:00:00 2001
From: Aleksey Kladov <aleksey.kladov@gmail.com>
Date: Tue, 11 Jun 2019 17:25:55 +0300
Subject: use Source for TypeAlias

---
 crates/ra_hir/src/code_model.rs | 11 +++++++++--
 crates/ra_hir/src/docs.rs       |  2 +-
 crates/ra_hir/src/generics.rs   |  2 +-
 crates/ra_hir/src/type_alias.rs |  2 +-
 4 files changed, 12 insertions(+), 5 deletions(-)

(limited to 'crates/ra_hir/src')

diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs
index a8a0875e0..20a8d7d80 100644
--- a/crates/ra_hir/src/code_model.rs
+++ b/crates/ra_hir/src/code_model.rs
@@ -932,12 +932,19 @@ pub struct TypeAlias {
     pub(crate) id: TypeAliasId,
 }
 
+impl HasSource for TypeAlias {
+    type Ast = TreeArc<ast::TypeAliasDef>;
+    fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::TypeAliasDef>> {
+        self.id.source(db).into()
+    }
+}
+
 impl TypeAlias {
     pub fn source(
         self,
         db: &(impl DefDatabase + AstDatabase),
-    ) -> (HirFileId, TreeArc<ast::TypeAliasDef>) {
-        self.id.source(db)
+    ) -> Source<TreeArc<ast::TypeAliasDef>> {
+        self.id.source(db).into()
     }
 
     pub fn module(self, db: &impl DefDatabase) -> Module {
diff --git a/crates/ra_hir/src/docs.rs b/crates/ra_hir/src/docs.rs
index 86ca981f4..1c6b4f205 100644
--- a/crates/ra_hir/src/docs.rs
+++ b/crates/ra_hir/src/docs.rs
@@ -84,7 +84,7 @@ pub(crate) fn documentation_query(
         DocDef::Function(it) => docs_from_ast(&*it.source(db).ast),
         DocDef::Union(it) => docs_from_ast(&*it.source(db).1),
         DocDef::Trait(it) => docs_from_ast(&*it.source(db).1),
-        DocDef::TypeAlias(it) => docs_from_ast(&*it.source(db).1),
+        DocDef::TypeAlias(it) => docs_from_ast(&*it.source(db).ast),
         DocDef::MacroDef(it) => docs_from_ast(&*it.source(db).1),
     }
 }
diff --git a/crates/ra_hir/src/generics.rs b/crates/ra_hir/src/generics.rs
index fcccd67c8..b7e255c17 100644
--- a/crates/ra_hir/src/generics.rs
+++ b/crates/ra_hir/src/generics.rs
@@ -81,7 +81,7 @@ impl GenericParams {
                 });
                 generics.fill(&*it.source(db).1, start + 1);
             }
-            GenericDef::TypeAlias(it) => generics.fill(&*it.source(db).1, start),
+            GenericDef::TypeAlias(it) => generics.fill(&*it.source(db).ast, start),
             GenericDef::ImplBlock(it) => generics.fill(&*it.source(db).1, start),
         }
 
diff --git a/crates/ra_hir/src/type_alias.rs b/crates/ra_hir/src/type_alias.rs
index 970468e3c..c449d7346 100644
--- a/crates/ra_hir/src/type_alias.rs
+++ b/crates/ra_hir/src/type_alias.rs
@@ -8,6 +8,6 @@ pub(crate) fn type_alias_ref_query(
     db: &(impl DefDatabase + AstDatabase),
     typ: TypeAlias,
 ) -> Arc<TypeRef> {
-    let (_, node) = typ.source(db);
+    let node = typ.source(db).ast;
     Arc::new(TypeRef::from_ast_opt(node.type_ref()))
 }
-- 
cgit v1.2.3


From f411c2988d40bbdebc5c9a63ce4bfb883a2fbca1 Mon Sep 17 00:00:00 2001
From: Aleksey Kladov <aleksey.kladov@gmail.com>
Date: Tue, 11 Jun 2019 17:34:01 +0300
Subject: use Source for Trait

---
 crates/ra_hir/src/code_model.rs | 21 ++++++++++++++++-----
 crates/ra_hir/src/docs.rs       |  2 +-
 crates/ra_hir/src/generics.rs   |  2 +-
 crates/ra_hir/src/traits.rs     | 10 +++++-----
 4 files changed, 23 insertions(+), 12 deletions(-)

(limited to 'crates/ra_hir/src')

diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs
index 20a8d7d80..0a750b590 100644
--- a/crates/ra_hir/src/code_model.rs
+++ b/crates/ra_hir/src/code_model.rs
@@ -528,6 +528,13 @@ pub struct EnumVariant {
     pub(crate) id: EnumVariantId,
 }
 
+impl HasSource for EnumVariant {
+    type Ast = TreeArc<ast::EnumVariant>;
+    fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::EnumVariant>> {
+        self.source_impl(db)
+    }
+}
+
 impl EnumVariant {
     pub fn source(
         &self,
@@ -886,12 +893,16 @@ pub struct Trait {
     pub(crate) id: TraitId,
 }
 
+impl HasSource for Trait {
+    type Ast = TreeArc<ast::TraitDef>;
+    fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::TraitDef>> {
+        self.id.source(db).into()
+    }
+}
+
 impl Trait {
-    pub fn source(
-        self,
-        db: &(impl DefDatabase + AstDatabase),
-    ) -> (HirFileId, TreeArc<ast::TraitDef>) {
-        self.id.source(db)
+    pub fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::TraitDef>> {
+        self.id.source(db).into()
     }
 
     pub fn module(self, db: &impl DefDatabase) -> Module {
diff --git a/crates/ra_hir/src/docs.rs b/crates/ra_hir/src/docs.rs
index 1c6b4f205..0cb0c0db8 100644
--- a/crates/ra_hir/src/docs.rs
+++ b/crates/ra_hir/src/docs.rs
@@ -83,7 +83,7 @@ pub(crate) fn documentation_query(
         DocDef::Const(it) => docs_from_ast(&*it.source(db).ast),
         DocDef::Function(it) => docs_from_ast(&*it.source(db).ast),
         DocDef::Union(it) => docs_from_ast(&*it.source(db).1),
-        DocDef::Trait(it) => docs_from_ast(&*it.source(db).1),
+        DocDef::Trait(it) => docs_from_ast(&*it.source(db).ast),
         DocDef::TypeAlias(it) => docs_from_ast(&*it.source(db).ast),
         DocDef::MacroDef(it) => docs_from_ast(&*it.source(db).1),
     }
diff --git a/crates/ra_hir/src/generics.rs b/crates/ra_hir/src/generics.rs
index b7e255c17..08d711754 100644
--- a/crates/ra_hir/src/generics.rs
+++ b/crates/ra_hir/src/generics.rs
@@ -79,7 +79,7 @@ impl GenericParams {
                     name: Name::self_type(),
                     default: None,
                 });
-                generics.fill(&*it.source(db).1, start + 1);
+                generics.fill(&*it.source(db).ast, start + 1);
             }
             GenericDef::TypeAlias(it) => generics.fill(&*it.source(db).ast, start),
             GenericDef::ImplBlock(it) => generics.fill(&*it.source(db).1, start),
diff --git a/crates/ra_hir/src/traits.rs b/crates/ra_hir/src/traits.rs
index 967654e97..86dceb2e0 100644
--- a/crates/ra_hir/src/traits.rs
+++ b/crates/ra_hir/src/traits.rs
@@ -22,12 +22,12 @@ impl TraitData {
         db: &(impl DefDatabase + AstDatabase),
         tr: Trait,
     ) -> Arc<TraitData> {
-        let (file_id, node) = tr.source(db);
-        let name = node.name().map(|n| n.as_name());
+        let src = tr.source(db);
+        let name = src.ast.name().map(|n| n.as_name());
         let module = tr.module(db);
-        let ctx = LocationCtx::new(db, module, file_id);
-        let auto = node.is_auto();
-        let items = if let Some(item_list) = node.item_list() {
+        let ctx = LocationCtx::new(db, module, src.file_id);
+        let auto = src.ast.is_auto();
+        let items = if let Some(item_list) = src.ast.item_list() {
             item_list
                 .impl_items()
                 .map(|item_node| match item_node.kind() {
-- 
cgit v1.2.3


From a6e339e822bcba4d81f1ab3912ca9612be9b6a0a Mon Sep 17 00:00:00 2001
From: Aleksey Kladov <aleksey.kladov@gmail.com>
Date: Tue, 11 Jun 2019 17:36:52 +0300
Subject: use Source for impl block

---
 crates/ra_hir/src/code_model.rs |  7 ++-----
 crates/ra_hir/src/docs.rs       |  2 +-
 crates/ra_hir/src/generics.rs   |  4 ++--
 crates/ra_hir/src/impl_block.rs | 18 ++++++++++++------
 4 files changed, 17 insertions(+), 14 deletions(-)

(limited to 'crates/ra_hir/src')

diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs
index 0a750b590..5b56f890e 100644
--- a/crates/ra_hir/src/code_model.rs
+++ b/crates/ra_hir/src/code_model.rs
@@ -442,11 +442,8 @@ impl HasSource for Union {
 }
 
 impl Union {
-    pub fn source(
-        self,
-        db: &(impl DefDatabase + AstDatabase),
-    ) -> (HirFileId, TreeArc<ast::StructDef>) {
-        self.id.source(db)
+    pub fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StructDef>> {
+        self.id.source(db).into()
     }
 
     pub fn name(self, db: &impl DefDatabase) -> Option<Name> {
diff --git a/crates/ra_hir/src/docs.rs b/crates/ra_hir/src/docs.rs
index 0cb0c0db8..f736f3875 100644
--- a/crates/ra_hir/src/docs.rs
+++ b/crates/ra_hir/src/docs.rs
@@ -82,7 +82,7 @@ pub(crate) fn documentation_query(
         DocDef::Static(it) => docs_from_ast(&*it.source(db).ast),
         DocDef::Const(it) => docs_from_ast(&*it.source(db).ast),
         DocDef::Function(it) => docs_from_ast(&*it.source(db).ast),
-        DocDef::Union(it) => docs_from_ast(&*it.source(db).1),
+        DocDef::Union(it) => docs_from_ast(&*it.source(db).ast),
         DocDef::Trait(it) => docs_from_ast(&*it.source(db).ast),
         DocDef::TypeAlias(it) => docs_from_ast(&*it.source(db).ast),
         DocDef::MacroDef(it) => docs_from_ast(&*it.source(db).1),
diff --git a/crates/ra_hir/src/generics.rs b/crates/ra_hir/src/generics.rs
index 08d711754..0b8bd5700 100644
--- a/crates/ra_hir/src/generics.rs
+++ b/crates/ra_hir/src/generics.rs
@@ -70,7 +70,7 @@ impl GenericParams {
         match def {
             GenericDef::Function(it) => generics.fill(&*it.source(db).ast, start),
             GenericDef::Struct(it) => generics.fill(&*it.source(db).ast, start),
-            GenericDef::Union(it) => generics.fill(&*it.source(db).1, start),
+            GenericDef::Union(it) => generics.fill(&*it.source(db).ast, start),
             GenericDef::Enum(it) => generics.fill(&*it.source(db).ast, start),
             GenericDef::Trait(it) => {
                 // traits get the Self type as an implicit first type parameter
@@ -82,7 +82,7 @@ impl GenericParams {
                 generics.fill(&*it.source(db).ast, start + 1);
             }
             GenericDef::TypeAlias(it) => generics.fill(&*it.source(db).ast, start),
-            GenericDef::ImplBlock(it) => generics.fill(&*it.source(db).1, start),
+            GenericDef::ImplBlock(it) => generics.fill(&*it.source(db).ast, start),
         }
 
         Arc::new(generics)
diff --git a/crates/ra_hir/src/impl_block.rs b/crates/ra_hir/src/impl_block.rs
index a0d3b33fe..8194f38d4 100644
--- a/crates/ra_hir/src/impl_block.rs
+++ b/crates/ra_hir/src/impl_block.rs
@@ -8,7 +8,7 @@ use ra_syntax::{
 };
 
 use crate::{
-    Const, TypeAlias, Function, HirFileId, AstDatabase,
+    Const, TypeAlias, Function, HirFileId, AstDatabase, HasSource, Source,
     HirDatabase, DefDatabase, TraitRef,
     type_ref::TypeRef,
     ids::LocationCtx,
@@ -44,6 +44,15 @@ pub struct ImplBlock {
     impl_id: ImplId,
 }
 
+impl HasSource for ImplBlock {
+    type Ast = TreeArc<ast::ImplBlock>;
+    fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::ImplBlock>> {
+        let source_map = db.impls_in_module_with_source_map(self.module).1;
+        let (file_id, source) = self.module.definition_source(db);
+        (file_id, source_map.get(&source, self.impl_id)).into()
+    }
+}
+
 impl ImplBlock {
     pub(crate) fn containing(
         module_impl_blocks: Arc<ModuleImplBlocks>,
@@ -58,13 +67,10 @@ impl ImplBlock {
     }
 
     /// Returns the syntax of the impl block
-    pub fn source(
-        &self,
-        db: &(impl DefDatabase + AstDatabase),
-    ) -> (HirFileId, TreeArc<ast::ImplBlock>) {
+    pub fn source(&self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::ImplBlock>> {
         let source_map = db.impls_in_module_with_source_map(self.module).1;
         let (file_id, source) = self.module.definition_source(db);
-        (file_id, source_map.get(&source, self.impl_id))
+        (file_id, source_map.get(&source, self.impl_id)).into()
     }
 
     pub fn id(&self) -> ImplId {
-- 
cgit v1.2.3


From 8b94b429e5a76a0518b07111f8faf0dca7457948 Mon Sep 17 00:00:00 2001
From: Aleksey Kladov <aleksey.kladov@gmail.com>
Date: Tue, 11 Jun 2019 17:40:18 +0300
Subject: use Source for MacroDef

---
 crates/ra_hir/src/code_model.rs | 15 ++++++++++-----
 crates/ra_hir/src/docs.rs       |  2 +-
 2 files changed, 11 insertions(+), 6 deletions(-)

(limited to 'crates/ra_hir/src')

diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs
index 5b56f890e..adb61a804 100644
--- a/crates/ra_hir/src/code_model.rs
+++ b/crates/ra_hir/src/code_model.rs
@@ -1003,12 +1003,17 @@ pub struct MacroDef {
     pub(crate) id: MacroDefId,
 }
 
+impl HasSource for MacroDef {
+    type Ast = TreeArc<ast::MacroCall>;
+
+    fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::MacroCall>> {
+        (self.id.0.file_id(), self.id.0.to_node(db)).into()
+    }
+}
+
 impl MacroDef {
-    pub fn source(
-        &self,
-        db: &(impl DefDatabase + AstDatabase),
-    ) -> (HirFileId, TreeArc<ast::MacroCall>) {
-        (self.id.0.file_id(), self.id.0.to_node(db))
+    pub fn source(&self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::MacroCall>> {
+        (self.id.0.file_id(), self.id.0.to_node(db)).into()
     }
 }
 
diff --git a/crates/ra_hir/src/docs.rs b/crates/ra_hir/src/docs.rs
index f736f3875..cbf7ae10b 100644
--- a/crates/ra_hir/src/docs.rs
+++ b/crates/ra_hir/src/docs.rs
@@ -85,7 +85,7 @@ pub(crate) fn documentation_query(
         DocDef::Union(it) => docs_from_ast(&*it.source(db).ast),
         DocDef::Trait(it) => docs_from_ast(&*it.source(db).ast),
         DocDef::TypeAlias(it) => docs_from_ast(&*it.source(db).ast),
-        DocDef::MacroDef(it) => docs_from_ast(&*it.source(db).1),
+        DocDef::MacroDef(it) => docs_from_ast(&*it.source(db).ast),
     }
 }
 
-- 
cgit v1.2.3


From 178d8e96b5c810f40e7dd282ab06bb25d1fc8a2a Mon Sep 17 00:00:00 2001
From: Aleksey Kladov <aleksey.kladov@gmail.com>
Date: Tue, 11 Jun 2019 17:43:36 +0300
Subject: use Source for StructField

---
 crates/ra_hir/src/code_model.rs | 11 +++++++++--
 crates/ra_hir/src/docs.rs       |  2 +-
 2 files changed, 10 insertions(+), 3 deletions(-)

(limited to 'crates/ra_hir/src')

diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs
index adb61a804..4c121503e 100644
--- a/crates/ra_hir/src/code_model.rs
+++ b/crates/ra_hir/src/code_model.rs
@@ -346,13 +346,20 @@ pub enum FieldSource {
     Pos(TreeArc<ast::PosFieldDef>),
 }
 
+impl HasSource for StructField {
+    type Ast = FieldSource;
+    fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<FieldSource> {
+        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()
     }
 
-    pub fn source(&self, db: &(impl DefDatabase + AstDatabase)) -> (HirFileId, FieldSource) {
-        self.source_impl(db)
+    pub fn source(&self, db: &(impl DefDatabase + AstDatabase)) -> Source<FieldSource> {
+        self.source_impl(db).into()
     }
 
     pub fn ty(&self, db: &impl HirDatabase) -> Ty {
diff --git a/crates/ra_hir/src/docs.rs b/crates/ra_hir/src/docs.rs
index cbf7ae10b..ae82d55a5 100644
--- a/crates/ra_hir/src/docs.rs
+++ b/crates/ra_hir/src/docs.rs
@@ -72,7 +72,7 @@ pub(crate) fn documentation_query(
 ) -> Option<Documentation> {
     match def {
         DocDef::Module(it) => docs_from_ast(&*it.declaration_source(db)?.1),
-        DocDef::StructField(it) => match it.source(db).1 {
+        DocDef::StructField(it) => match it.source(db).ast {
             FieldSource::Named(named) => docs_from_ast(&*named),
             FieldSource::Pos(..) => return None,
         },
-- 
cgit v1.2.3


From 0145d06515d990f8b7bf45e261674c265c52d858 Mon Sep 17 00:00:00 2001
From: Aleksey Kladov <aleksey.kladov@gmail.com>
Date: Tue, 11 Jun 2019 17:47:24 +0300
Subject: use Source for module, part 1

---
 crates/ra_hir/src/code_model.rs    | 13 +++++--------
 crates/ra_hir/src/impl_block.rs    | 14 +++++++-------
 crates/ra_hir/src/lang_item.rs     |  2 +-
 crates/ra_hir/src/source_binder.rs |  6 +++---
 4 files changed, 16 insertions(+), 19 deletions(-)

(limited to 'crates/ra_hir/src')

diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs
index 4c121503e..e920256e5 100644
--- a/crates/ra_hir/src/code_model.rs
+++ b/crates/ra_hir/src/code_model.rs
@@ -196,16 +196,13 @@ 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),
-    ) -> (HirFileId, ModuleSource) {
+    pub fn definition_source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<ModuleSource> {
         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)
+        (file_id, module_source).into()
     }
 
     /// Returns a node which declares this module, either a `mod foo;` or a `mod foo {}`.
@@ -226,9 +223,9 @@ impl Module {
         db: &impl HirDatabase,
         import: ImportId,
     ) -> Either<TreeArc<ast::UseTree>, TreeArc<ast::ExternCrateItem>> {
-        let (file_id, source) = self.definition_source(db);
-        let (_, source_map) = db.raw_items_with_source_map(file_id);
-        source_map.get(&source, import)
+        let src = self.definition_source(db);
+        let (_, source_map) = db.raw_items_with_source_map(src.file_id);
+        source_map.get(&src.ast, import)
     }
 
     /// Returns the crate this module is part of.
diff --git a/crates/ra_hir/src/impl_block.rs b/crates/ra_hir/src/impl_block.rs
index 8194f38d4..646b603d3 100644
--- a/crates/ra_hir/src/impl_block.rs
+++ b/crates/ra_hir/src/impl_block.rs
@@ -48,8 +48,8 @@ impl HasSource for ImplBlock {
     type Ast = TreeArc<ast::ImplBlock>;
     fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::ImplBlock>> {
         let source_map = db.impls_in_module_with_source_map(self.module).1;
-        let (file_id, source) = self.module.definition_source(db);
-        (file_id, source_map.get(&source, self.impl_id)).into()
+        let src = self.module.definition_source(db);
+        (src.file_id, source_map.get(&src.ast, self.impl_id)).into()
     }
 }
 
@@ -69,8 +69,8 @@ impl ImplBlock {
     /// Returns the syntax of the impl block
     pub fn source(&self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::ImplBlock>> {
         let source_map = db.impls_in_module_with_source_map(self.module).1;
-        let (file_id, source) = self.module.definition_source(db);
-        (file_id, source_map.get(&source, self.impl_id)).into()
+        let src = self.module.definition_source(db);
+        (src.file_id, source_map.get(&src.ast, self.impl_id)).into()
     }
 
     pub fn id(&self) -> ImplId {
@@ -207,8 +207,8 @@ impl ModuleImplBlocks {
             impls_by_def: FxHashMap::default(),
         };
 
-        let (file_id, module_source) = m.module.definition_source(db);
-        let node = match &module_source {
+        let src = m.module.definition_source(db);
+        let node = match &src.ast {
             ModuleSource::SourceFile(node) => node.syntax(),
             ModuleSource::Module(node) => {
                 node.item_list().expect("inline module should have item list").syntax()
@@ -216,7 +216,7 @@ impl ModuleImplBlocks {
         };
 
         for impl_block_ast in node.children().filter_map(ast::ImplBlock::cast) {
-            let impl_block = ImplData::from_ast(db, file_id, m.module, impl_block_ast);
+            let impl_block = ImplData::from_ast(db, src.file_id, m.module, impl_block_ast);
             let id = m.impls.alloc(impl_block);
             for &impl_item in &m.impls[id].items {
                 m.impls_by_def.insert(impl_item, id);
diff --git a/crates/ra_hir/src/lang_item.rs b/crates/ra_hir/src/lang_item.rs
index 684fbc068..cdc9182d6 100644
--- a/crates/ra_hir/src/lang_item.rs
+++ b/crates/ra_hir/src/lang_item.rs
@@ -84,7 +84,7 @@ impl LangItems {
     ) {
         // Look for impl targets
         let (impl_blocks, source_map) = db.impls_in_module_with_source_map(module.clone());
-        let source = module.definition_source(db).1;
+        let source = module.definition_source(db).ast;
         for (impl_id, _) in impl_blocks.impls.iter() {
             let impl_block = source_map.get(&source, impl_id);
             let lang_item_name = impl_block
diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs
index 876ebe0e3..4f9e8c5a9 100644
--- a/crates/ra_hir/src/source_binder.rs
+++ b/crates/ra_hir/src/source_binder.rs
@@ -97,13 +97,13 @@ pub fn struct_from_module(
     module: Module,
     struct_def: &ast::StructDef,
 ) -> Struct {
-    let (file_id, _) = module.definition_source(db);
+    let file_id = module.definition_source(db).file_id;
     let ctx = LocationCtx::new(db, module, file_id);
     Struct { id: ctx.to_def(struct_def) }
 }
 
 pub fn enum_from_module(db: &impl HirDatabase, module: Module, enum_def: &ast::EnumDef) -> Enum {
-    let (file_id, _) = module.definition_source(db);
+    let file_id = module.definition_source(db).file_id;
     let ctx = LocationCtx::new(db, module, file_id);
     Enum { id: ctx.to_def(enum_def) }
 }
@@ -113,7 +113,7 @@ pub fn trait_from_module(
     module: Module,
     trait_def: &ast::TraitDef,
 ) -> Trait {
-    let (file_id, _) = module.definition_source(db);
+    let file_id = module.definition_source(db).file_id;
     let ctx = LocationCtx::new(db, module, file_id);
     Trait { id: ctx.to_def(trait_def) }
 }
-- 
cgit v1.2.3


From dd63f17027d5c873a5782dcbb08e9b068fc8ee00 Mon Sep 17 00:00:00 2001
From: Aleksey Kladov <aleksey.kladov@gmail.com>
Date: Tue, 11 Jun 2019 17:48:27 +0300
Subject: use Source for module, part 2

---
 crates/ra_hir/src/code_model.rs | 4 ++--
 crates/ra_hir/src/docs.rs       | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

(limited to 'crates/ra_hir/src')

diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs
index e920256e5..1a33127fa 100644
--- a/crates/ra_hir/src/code_model.rs
+++ b/crates/ra_hir/src/code_model.rs
@@ -210,11 +210,11 @@ impl Module {
     pub fn declaration_source(
         self,
         db: &(impl DefDatabase + AstDatabase),
-    ) -> Option<(HirFileId, TreeArc<ast::Module>)> {
+    ) -> Option<Source<TreeArc<ast::Module>>> {
         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))
+        Some((decl.file_id(), ast).into())
     }
 
     /// Returns the syntax of the last path segment corresponding to this import
diff --git a/crates/ra_hir/src/docs.rs b/crates/ra_hir/src/docs.rs
index ae82d55a5..4db066c43 100644
--- a/crates/ra_hir/src/docs.rs
+++ b/crates/ra_hir/src/docs.rs
@@ -71,7 +71,7 @@ pub(crate) fn documentation_query(
     def: DocDef,
 ) -> Option<Documentation> {
     match def {
-        DocDef::Module(it) => docs_from_ast(&*it.declaration_source(db)?.1),
+        DocDef::Module(it) => docs_from_ast(&*it.declaration_source(db)?.ast),
         DocDef::StructField(it) => match it.source(db).ast {
             FieldSource::Named(named) => docs_from_ast(&*named),
             FieldSource::Pos(..) => return None,
-- 
cgit v1.2.3


From c4512fadb1b332b13bb41b0aa8a28aa964664842 Mon Sep 17 00:00:00 2001
From: Aleksey Kladov <aleksey.kladov@gmail.com>
Date: Tue, 11 Jun 2019 17:54:51 +0300
Subject: remove inherent source impls

---
 crates/ra_hir/src/adt.rs             |  2 +-
 crates/ra_hir/src/code_model.rs      | 51 +-----------------------------------
 crates/ra_hir/src/docs.rs            |  2 +-
 crates/ra_hir/src/expr.rs            |  1 +
 crates/ra_hir/src/expr/validation.rs |  2 +-
 crates/ra_hir/src/generics.rs        |  4 ++-
 crates/ra_hir/src/traits.rs          |  2 +-
 crates/ra_hir/src/ty/infer.rs        |  2 +-
 crates/ra_hir/src/type_alias.rs      |  2 +-
 9 files changed, 11 insertions(+), 57 deletions(-)

(limited to 'crates/ra_hir/src')

diff --git a/crates/ra_hir/src/adt.rs b/crates/ra_hir/src/adt.rs
index 2b372333f..6b8604b3e 100644
--- a/crates/ra_hir/src/adt.rs
+++ b/crates/ra_hir/src/adt.rs
@@ -11,7 +11,7 @@ use ra_syntax::{
 
 use crate::{
     Name, AsName, Struct, Union, Enum, EnumVariant, Crate, AstDatabase,
-    HirDatabase, HirFileId, StructField, FieldSource, Source,
+    HirDatabase, HirFileId, StructField, FieldSource, Source, HasSource,
     type_ref::TypeRef, DefDatabase,
 };
 
diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs
index 1a33127fa..282bd15de 100644
--- a/crates/ra_hir/src/code_model.rs
+++ b/crates/ra_hir/src/code_model.rs
@@ -355,10 +355,6 @@ impl StructField {
         self.parent.variant_data(db).fields().unwrap()[self.id].name.clone()
     }
 
-    pub fn source(&self, db: &(impl DefDatabase + AstDatabase)) -> Source<FieldSource> {
-        self.source_impl(db).into()
-    }
-
     pub fn ty(&self, db: &impl HirDatabase) -> Ty {
         db.type_for_field(*self)
     }
@@ -381,10 +377,6 @@ impl HasSource for Struct {
 }
 
 impl Struct {
-    pub fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StructDef>> {
-        self.id.source(db).into()
-    }
-
     pub fn module(self, db: &impl HirDatabase) -> Module {
         self.id.module(db)
     }
@@ -446,10 +438,6 @@ impl HasSource for Union {
 }
 
 impl Union {
-    pub fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StructDef>> {
-        self.id.source(db).into()
-    }
-
     pub fn name(self, db: &impl DefDatabase) -> Option<Name> {
         db.struct_data(Struct { id: self.id }).name.clone()
     }
@@ -483,10 +471,6 @@ impl HasSource for Enum {
 }
 
 impl Enum {
-    pub fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::EnumDef>> {
-        self.id.source(db).into()
-    }
-
     pub fn module(self, db: &impl HirDatabase) -> Module {
         self.id.module(db)
     }
@@ -537,12 +521,6 @@ impl HasSource for EnumVariant {
 }
 
 impl EnumVariant {
-    pub fn source(
-        &self,
-        db: &(impl DefDatabase + AstDatabase),
-    ) -> Source<TreeArc<ast::EnumVariant>> {
-        self.source_impl(db)
-    }
     pub fn module(&self, db: &impl HirDatabase) -> Module {
         self.parent.module(db)
     }
@@ -692,10 +670,6 @@ impl FnSignature {
 }
 
 impl Function {
-    pub fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::FnDef>> {
-        self.id.source(db).into()
-    }
-
     pub fn module(self, db: &impl DefDatabase) -> Module {
         self.id.module(db)
     }
@@ -778,10 +752,6 @@ impl HasSource for Const {
 }
 
 impl Const {
-    pub fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::ConstDef>> {
-        self.id.source(db).into()
-    }
-
     pub fn module(self, db: &impl DefDatabase) -> Module {
         self.id.module(db)
     }
@@ -866,10 +836,6 @@ impl HasSource for Static {
 }
 
 impl Static {
-    pub fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StaticDef>> {
-        self.id.source(db).into()
-    }
-
     pub fn module(self, db: &impl DefDatabase) -> Module {
         self.id.module(db)
     }
@@ -902,10 +868,6 @@ impl HasSource for Trait {
 }
 
 impl Trait {
-    pub fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::TraitDef>> {
-        self.id.source(db).into()
-    }
-
     pub fn module(self, db: &impl DefDatabase) -> Module {
         self.id.module(db)
     }
@@ -952,13 +914,6 @@ impl HasSource for TypeAlias {
 }
 
 impl TypeAlias {
-    pub fn source(
-        self,
-        db: &(impl DefDatabase + AstDatabase),
-    ) -> Source<TreeArc<ast::TypeAliasDef>> {
-        self.id.source(db).into()
-    }
-
     pub fn module(self, db: &impl DefDatabase) -> Module {
         self.id.module(db)
     }
@@ -1015,11 +970,7 @@ impl HasSource for MacroDef {
     }
 }
 
-impl MacroDef {
-    pub fn source(&self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::MacroCall>> {
-        (self.id.0.file_id(), self.id.0.to_node(db)).into()
-    }
-}
+impl MacroDef {}
 
 pub enum Container {
     Trait(Trait),
diff --git a/crates/ra_hir/src/docs.rs b/crates/ra_hir/src/docs.rs
index 4db066c43..da2b9b854 100644
--- a/crates/ra_hir/src/docs.rs
+++ b/crates/ra_hir/src/docs.rs
@@ -3,7 +3,7 @@ use std::sync::Arc;
 use ra_syntax::ast;
 
 use crate::{
-    HirDatabase, DefDatabase, AstDatabase,
+    HirDatabase, DefDatabase, AstDatabase, HasSource,
     Module, StructField, Struct, Enum, EnumVariant, Static, Const, Function, Union, Trait, TypeAlias, FieldSource, MacroDef,
 };
 
diff --git a/crates/ra_hir/src/expr.rs b/crates/ra_hir/src/expr.rs
index 48e597519..b1973d19d 100644
--- a/crates/ra_hir/src/expr.rs
+++ b/crates/ra_hir/src/expr.rs
@@ -11,6 +11,7 @@ use ra_syntax::{
 
 use crate::{
     Path, Name, HirDatabase, Resolver,DefWithBody, Either, HirFileId, MacroCallLoc, MacroFileKind,
+    HasSource,
     name::AsName,
     type_ref::{Mutability, TypeRef},
 };
diff --git a/crates/ra_hir/src/expr/validation.rs b/crates/ra_hir/src/expr/validation.rs
index ff5e5f68e..534fd482b 100644
--- a/crates/ra_hir/src/expr/validation.rs
+++ b/crates/ra_hir/src/expr/validation.rs
@@ -5,7 +5,7 @@ use ra_syntax::ast::{AstNode, StructLit};
 
 use crate::{
     expr::AstPtr,
-    HirDatabase, Function, Name,
+    HirDatabase, Function, Name, HasSource,
     diagnostics::{DiagnosticSink, MissingFields},
     adt::AdtDef,
     Path,
diff --git a/crates/ra_hir/src/generics.rs b/crates/ra_hir/src/generics.rs
index 0b8bd5700..462b136b7 100644
--- a/crates/ra_hir/src/generics.rs
+++ b/crates/ra_hir/src/generics.rs
@@ -8,8 +8,10 @@ use std::sync::Arc;
 use ra_syntax::ast::{self, NameOwner, TypeParamsOwner, TypeBoundsOwner, DefaultTypeParamOwner};
 
 use crate::{
+    HasSource,
+    Name, AsName, Function, Struct, Union, Enum, Trait, TypeAlias, ImplBlock, Container, AdtDef,
     db::{HirDatabase, DefDatabase, AstDatabase},
-    Name, AsName, Function, Struct, Union, Enum, Trait, TypeAlias, ImplBlock, Container, path::Path, type_ref::TypeRef, AdtDef
+    path::Path, type_ref::TypeRef,
 };
 
 /// Data about a generic parameter (to a function, struct, impl, ...).
diff --git a/crates/ra_hir/src/traits.rs b/crates/ra_hir/src/traits.rs
index 86dceb2e0..f2950e1b2 100644
--- a/crates/ra_hir/src/traits.rs
+++ b/crates/ra_hir/src/traits.rs
@@ -6,7 +6,7 @@ use rustc_hash::FxHashMap;
 use ra_syntax::ast::{self, NameOwner};
 
 use crate::{
-    Function, Const, TypeAlias, Name, DefDatabase, Trait, AstDatabase, Module,
+    Function, Const, TypeAlias, Name, DefDatabase, Trait, AstDatabase, Module, HasSource,
     ids::LocationCtx, name::AsName,
 };
 
diff --git a/crates/ra_hir/src/ty/infer.rs b/crates/ra_hir/src/ty/infer.rs
index a534c2336..fef0f1d24 100644
--- a/crates/ra_hir/src/ty/infer.rs
+++ b/crates/ra_hir/src/ty/infer.rs
@@ -1415,7 +1415,7 @@ mod diagnostics {
     use crate::{
         expr::ExprId,
         diagnostics::{DiagnosticSink, NoSuchField},
-        HirDatabase, Function,
+        HirDatabase, Function, HasSource,
 };
 
     #[derive(Debug, PartialEq, Eq, Clone)]
diff --git a/crates/ra_hir/src/type_alias.rs b/crates/ra_hir/src/type_alias.rs
index c449d7346..87b9caa8a 100644
--- a/crates/ra_hir/src/type_alias.rs
+++ b/crates/ra_hir/src/type_alias.rs
@@ -2,7 +2,7 @@
 
 use std::sync::Arc;
 
-use crate::{TypeAlias, DefDatabase, AstDatabase, type_ref::TypeRef};
+use crate::{TypeAlias, DefDatabase, AstDatabase, HasSource, type_ref::TypeRef};
 
 pub(crate) fn type_alias_ref_query(
     db: &(impl DefDatabase + AstDatabase),
-- 
cgit v1.2.3


From 0dcaded439ae4bd4670bc6a2fbf739cd4fce60af Mon Sep 17 00:00:00 2001
From: Aleksey Kladov <aleksey.kladov@gmail.com>
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/ra_hir/src')

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<T> {
-    pub file_id: HirFileId,
-    pub ast: T,
-}
-
-impl<T> From<(HirFileId, T)> for Source<T> {
-    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<Self::Ast>;
-}
-
 /// 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<ModuleSource> {
-        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<Source<TreeArc<ast::Module>>> {
-        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<ast::PosFieldDef>),
 }
 
-impl HasSource for StructField {
-    type Ast = FieldSource;
-    fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<FieldSource> {
-        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<ast::StructDef>;
-    fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StructDef>> {
-        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<ast::StructDef>;
-    fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StructDef>> {
-        self.id.source(db).into()
-    }
-}
-
 impl Union {
     pub fn name(self, db: &impl DefDatabase) -> Option<Name> {
         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<ast::EnumDef>;
-    fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::EnumDef>> {
-        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<ast::EnumVariant>;
-    fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::EnumVariant>> {
-        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<ast::FnDef>;
-
-    fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::FnDef>> {
-        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<ast::ConstDef>;
-
-    fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::ConstDef>> {
-        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<ast::StaticDef>;
-
-    fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StaticDef>> {
-        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<ast::TraitDef>;
-    fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::TraitDef>> {
-        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<ast::TypeAliasDef>;
-    fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::TypeAliasDef>> {
-        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<ast::MacroCall>;
-
-    fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::MacroCall>> {
-        (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<T> {
+    pub file_id: HirFileId,
+    pub ast: T,
+}
+
+impl<T> From<(HirFileId, T)> for Source<T> {
+    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<Self::Ast>;
+}
+
+/// 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<ModuleSource> {
+        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<Source<TreeArc<ast::Module>>> {
+        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<FieldSource> {
+        self.source_impl(db).into()
+    }
+}
+impl HasSource for Struct {
+    type Ast = TreeArc<ast::StructDef>;
+    fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StructDef>> {
+        self.id.source(db).into()
+    }
+}
+impl HasSource for Union {
+    type Ast = TreeArc<ast::StructDef>;
+    fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StructDef>> {
+        self.id.source(db).into()
+    }
+}
+impl HasSource for Enum {
+    type Ast = TreeArc<ast::EnumDef>;
+    fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::EnumDef>> {
+        self.id.source(db).into()
+    }
+}
+impl HasSource for EnumVariant {
+    type Ast = TreeArc<ast::EnumVariant>;
+    fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::EnumVariant>> {
+        self.source_impl(db)
+    }
+}
+impl HasSource for Function {
+    type Ast = TreeArc<ast::FnDef>;
+
+    fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::FnDef>> {
+        self.id.source(db).into()
+    }
+}
+impl HasSource for Const {
+    type Ast = TreeArc<ast::ConstDef>;
+
+    fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::ConstDef>> {
+        self.id.source(db).into()
+    }
+}
+impl HasSource for Static {
+    type Ast = TreeArc<ast::StaticDef>;
+
+    fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StaticDef>> {
+        self.id.source(db).into()
+    }
+}
+impl HasSource for Trait {
+    type Ast = TreeArc<ast::TraitDef>;
+    fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::TraitDef>> {
+        self.id.source(db).into()
+    }
+}
+impl HasSource for TypeAlias {
+    type Ast = TreeArc<ast::TypeAliasDef>;
+    fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::TypeAliasDef>> {
+        self.id.source(db).into()
+    }
+}
+impl HasSource for MacroDef {
+    type Ast = TreeArc<ast::MacroCall>;
+
+    fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::MacroCall>> {
+        (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


From 26753f0e4931e2980f008015cbd709a77d71c0f3 Mon Sep 17 00:00:00 2001
From: Aleksey Kladov <aleksey.kladov@gmail.com>
Date: Tue, 11 Jun 2019 18:07:42 +0300
Subject: remove unneded From(..) impl

---
 crates/ra_hir/src/adt.rs            | 11 ++++-------
 crates/ra_hir/src/code_model/src.rs | 32 +++++++++++++-------------------
 crates/ra_hir/src/ids.rs            |  6 +++---
 crates/ra_hir/src/impl_block.rs     |  9 +--------
 4 files changed, 21 insertions(+), 37 deletions(-)

(limited to 'crates/ra_hir/src')

diff --git a/crates/ra_hir/src/adt.rs b/crates/ra_hir/src/adt.rs
index 6b8604b3e..b3843b35c 100644
--- a/crates/ra_hir/src/adt.rs
+++ b/crates/ra_hir/src/adt.rs
@@ -11,7 +11,7 @@ use ra_syntax::{
 
 use crate::{
     Name, AsName, Struct, Union, Enum, EnumVariant, Crate, AstDatabase,
-    HirDatabase, HirFileId, StructField, FieldSource, Source, HasSource,
+    HirDatabase, StructField, FieldSource, Source, HasSource,
     type_ref::TypeRef, DefDatabase,
 };
 
@@ -201,10 +201,7 @@ impl VariantDef {
 }
 
 impl StructField {
-    pub(crate) fn source_impl(
-        &self,
-        db: &(impl DefDatabase + AstDatabase),
-    ) -> (HirFileId, FieldSource) {
+    pub(crate) fn source_impl(&self, db: &(impl DefDatabase + AstDatabase)) -> Source<FieldSource> {
         let var_data = self.parent.variant_data(db);
         let fields = var_data.fields().unwrap();
         let ss;
@@ -229,12 +226,12 @@ impl StructField {
             }
             ast::StructKind::Unit => Vec::new(),
         };
-        let field = field_sources
+        let ast = field_sources
             .into_iter()
             .zip(fields.iter())
             .find(|(_syntax, (id, _))| *id == self.id)
             .unwrap()
             .0;
-        (file_id, field)
+        Source { file_id, ast }
     }
 }
diff --git a/crates/ra_hir/src/code_model/src.rs b/crates/ra_hir/src/code_model/src.rs
index 7484faf04..7d8abb39e 100644
--- a/crates/ra_hir/src/code_model/src.rs
+++ b/crates/ra_hir/src/code_model/src.rs
@@ -11,12 +11,6 @@ pub struct Source<T> {
     pub ast: T,
 }
 
-impl<T> From<(HirFileId, T)> for Source<T> {
-    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<Self::Ast>;
@@ -30,9 +24,9 @@ impl Module {
         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 ast = 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()
+        Source { file_id, ast }
     }
 
     /// Returns a node which declares this module, either a `mod foo;` or a `mod foo {}`.
@@ -44,32 +38,32 @@ impl Module {
         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())
+        Some(Source { file_id: decl.file_id(), ast })
     }
 }
 
 impl HasSource for StructField {
     type Ast = FieldSource;
     fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<FieldSource> {
-        self.source_impl(db).into()
+        self.source_impl(db)
     }
 }
 impl HasSource for Struct {
     type Ast = TreeArc<ast::StructDef>;
     fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StructDef>> {
-        self.id.source(db).into()
+        self.id.source(db)
     }
 }
 impl HasSource for Union {
     type Ast = TreeArc<ast::StructDef>;
     fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StructDef>> {
-        self.id.source(db).into()
+        self.id.source(db)
     }
 }
 impl HasSource for Enum {
     type Ast = TreeArc<ast::EnumDef>;
     fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::EnumDef>> {
-        self.id.source(db).into()
+        self.id.source(db)
     }
 }
 impl HasSource for EnumVariant {
@@ -82,39 +76,39 @@ impl HasSource for Function {
     type Ast = TreeArc<ast::FnDef>;
 
     fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::FnDef>> {
-        self.id.source(db).into()
+        self.id.source(db)
     }
 }
 impl HasSource for Const {
     type Ast = TreeArc<ast::ConstDef>;
 
     fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::ConstDef>> {
-        self.id.source(db).into()
+        self.id.source(db)
     }
 }
 impl HasSource for Static {
     type Ast = TreeArc<ast::StaticDef>;
 
     fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StaticDef>> {
-        self.id.source(db).into()
+        self.id.source(db)
     }
 }
 impl HasSource for Trait {
     type Ast = TreeArc<ast::TraitDef>;
     fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::TraitDef>> {
-        self.id.source(db).into()
+        self.id.source(db)
     }
 }
 impl HasSource for TypeAlias {
     type Ast = TreeArc<ast::TypeAliasDef>;
     fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::TypeAliasDef>> {
-        self.id.source(db).into()
+        self.id.source(db)
     }
 }
 impl HasSource for MacroDef {
     type Ast = TreeArc<ast::MacroCall>;
 
     fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::MacroCall>> {
-        (self.id.0.file_id(), self.id.0.to_node(db)).into()
+        Source { file_id: self.id.0.file_id(), ast: self.id.0.to_node(db) }
     }
 }
diff --git a/crates/ra_hir/src/ids.rs b/crates/ra_hir/src/ids.rs
index a95561812..352f9ffd9 100644
--- a/crates/ra_hir/src/ids.rs
+++ b/crates/ra_hir/src/ids.rs
@@ -9,7 +9,7 @@ use ra_prof::profile;
 use mbe::MacroRules;
 
 use crate::{
-    Module, DefDatabase, AstId, FileAstId, AstDatabase,
+    Module, DefDatabase, AstId, FileAstId, AstDatabase, Source,
 };
 
 /// hir makes heavy use of ids: integer (u32) handlers to various things. You
@@ -265,10 +265,10 @@ pub(crate) trait AstItemDef<N: AstNode>: salsa::InternKey + Clone {
         let loc = ItemLoc { module: ctx.module, ast_id: ast_id.with_file_id(ctx.file_id) };
         Self::intern(ctx.db, loc)
     }
-    fn source(self, db: &(impl AstDatabase + DefDatabase)) -> (HirFileId, TreeArc<N>) {
+    fn source(self, db: &(impl AstDatabase + DefDatabase)) -> Source<TreeArc<N>> {
         let loc = self.lookup_intern(db);
         let ast = loc.ast_id.to_node(db);
-        (loc.ast_id.file_id(), ast)
+        Source { file_id: loc.ast_id.file_id(), ast }
     }
     fn module(self, db: &impl DefDatabase) -> Module {
         let loc = self.lookup_intern(db);
diff --git a/crates/ra_hir/src/impl_block.rs b/crates/ra_hir/src/impl_block.rs
index 646b603d3..fb9daf1bf 100644
--- a/crates/ra_hir/src/impl_block.rs
+++ b/crates/ra_hir/src/impl_block.rs
@@ -49,7 +49,7 @@ impl HasSource for ImplBlock {
     fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::ImplBlock>> {
         let source_map = db.impls_in_module_with_source_map(self.module).1;
         let src = self.module.definition_source(db);
-        (src.file_id, source_map.get(&src.ast, self.impl_id)).into()
+        Source { file_id: src.file_id, ast: source_map.get(&src.ast, self.impl_id) }
     }
 }
 
@@ -66,13 +66,6 @@ impl ImplBlock {
         ImplBlock { module, impl_id }
     }
 
-    /// Returns the syntax of the impl block
-    pub fn source(&self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::ImplBlock>> {
-        let source_map = db.impls_in_module_with_source_map(self.module).1;
-        let src = self.module.definition_source(db);
-        (src.file_id, source_map.get(&src.ast, self.impl_id)).into()
-    }
-
     pub fn id(&self) -> ImplId {
         self.impl_id
     }
-- 
cgit v1.2.3


From 14b1f8763486fe7bc4a468c70fce827ae34d3d74 Mon Sep 17 00:00:00 2001
From: Aleksey Kladov <aleksey.kladov@gmail.com>
Date: Tue, 11 Jun 2019 18:09:39 +0300
Subject: minor formatting

---
 crates/ra_hir/src/code_model/src.rs | 4 ----
 1 file changed, 4 deletions(-)

(limited to 'crates/ra_hir/src')

diff --git a/crates/ra_hir/src/code_model/src.rs b/crates/ra_hir/src/code_model/src.rs
index 7d8abb39e..76adc7869 100644
--- a/crates/ra_hir/src/code_model/src.rs
+++ b/crates/ra_hir/src/code_model/src.rs
@@ -74,21 +74,18 @@ impl HasSource for EnumVariant {
 }
 impl HasSource for Function {
     type Ast = TreeArc<ast::FnDef>;
-
     fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::FnDef>> {
         self.id.source(db)
     }
 }
 impl HasSource for Const {
     type Ast = TreeArc<ast::ConstDef>;
-
     fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::ConstDef>> {
         self.id.source(db)
     }
 }
 impl HasSource for Static {
     type Ast = TreeArc<ast::StaticDef>;
-
     fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StaticDef>> {
         self.id.source(db)
     }
@@ -107,7 +104,6 @@ impl HasSource for TypeAlias {
 }
 impl HasSource for MacroDef {
     type Ast = TreeArc<ast::MacroCall>;
-
     fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::MacroCall>> {
         Source { file_id: self.id.0.file_id(), ast: self.id.0.to_node(db) }
     }
-- 
cgit v1.2.3


From f6c227babdeb2d6b6888b36ddcbd8eb220240fa2 Mon Sep 17 00:00:00 2001
From: Aleksey Kladov <aleksey.kladov@gmail.com>
Date: Tue, 11 Jun 2019 18:11:17 +0300
Subject: fix compilation

---
 crates/ra_hir/src/code_model/src.rs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'crates/ra_hir/src')

diff --git a/crates/ra_hir/src/code_model/src.rs b/crates/ra_hir/src/code_model/src.rs
index 76adc7869..5785d3b26 100644
--- a/crates/ra_hir/src/code_model/src.rs
+++ b/crates/ra_hir/src/code_model/src.rs
@@ -16,7 +16,7 @@ pub trait HasSource {
     fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<Self::Ast>;
 }
 
-/// NB: Module is !HasSource, becase it has two source nodes at the same time:
+/// NB: Module is !HasSource, because 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.
-- 
cgit v1.2.3


From ff6f6b3a5223ddab81c7357a3c59bdb09936a552 Mon Sep 17 00:00:00 2001
From: Aleksey Kladov <aleksey.kladov@gmail.com>
Date: Tue, 11 Jun 2019 18:14:27 +0300
Subject: move docs under code model

---
 crates/ra_hir/src/code_model.rs      |  1 +
 crates/ra_hir/src/code_model/docs.rs | 96 ++++++++++++++++++++++++++++++++++++
 crates/ra_hir/src/db.rs              |  4 +-
 crates/ra_hir/src/docs.rs            | 96 ------------------------------------
 crates/ra_hir/src/lib.rs             |  3 +-
 5 files changed, 100 insertions(+), 100 deletions(-)
 create mode 100644 crates/ra_hir/src/code_model/docs.rs
 delete mode 100644 crates/ra_hir/src/docs.rs

(limited to 'crates/ra_hir/src')

diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs
index 0cfab27dc..830aea1f3 100644
--- a/crates/ra_hir/src/code_model.rs
+++ b/crates/ra_hir/src/code_model.rs
@@ -1,4 +1,5 @@
 pub(crate) mod src;
+pub(crate) mod docs;
 
 use std::sync::Arc;
 
diff --git a/crates/ra_hir/src/code_model/docs.rs b/crates/ra_hir/src/code_model/docs.rs
new file mode 100644
index 000000000..da2b9b854
--- /dev/null
+++ b/crates/ra_hir/src/code_model/docs.rs
@@ -0,0 +1,96 @@
+use std::sync::Arc;
+
+use ra_syntax::ast;
+
+use crate::{
+    HirDatabase, DefDatabase, AstDatabase, HasSource,
+    Module, StructField, Struct, Enum, EnumVariant, Static, Const, Function, Union, Trait, TypeAlias, FieldSource, MacroDef,
+};
+
+#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
+pub enum DocDef {
+    Module(Module),
+    StructField(StructField),
+    Struct(Struct),
+    Enum(Enum),
+    EnumVariant(EnumVariant),
+    Static(Static),
+    Const(Const),
+    Function(Function),
+    Union(Union),
+    Trait(Trait),
+    TypeAlias(TypeAlias),
+    MacroDef(MacroDef),
+}
+
+impl_froms!(
+    DocDef: Module,
+    StructField,
+    Struct,
+    Enum,
+    EnumVariant,
+    Static,
+    Const,
+    Function,
+    Union,
+    Trait,
+    TypeAlias,
+    MacroDef
+);
+
+/// Holds documentation
+#[derive(Debug, Clone, PartialEq, Eq)]
+pub struct Documentation(Arc<str>);
+
+impl Documentation {
+    fn new(s: &str) -> Documentation {
+        Documentation(s.into())
+    }
+
+    pub fn as_str(&self) -> &str {
+        &*self.0
+    }
+}
+
+impl Into<String> for Documentation {
+    fn into(self) -> String {
+        self.as_str().to_owned()
+    }
+}
+
+pub trait Docs {
+    fn docs(&self, db: &impl HirDatabase) -> Option<Documentation>;
+}
+
+pub(crate) fn docs_from_ast(node: &impl ast::DocCommentsOwner) -> Option<Documentation> {
+    node.doc_comment_text().map(|it| Documentation::new(&it))
+}
+
+pub(crate) fn documentation_query(
+    db: &(impl DefDatabase + AstDatabase),
+    def: DocDef,
+) -> Option<Documentation> {
+    match def {
+        DocDef::Module(it) => docs_from_ast(&*it.declaration_source(db)?.ast),
+        DocDef::StructField(it) => match it.source(db).ast {
+            FieldSource::Named(named) => docs_from_ast(&*named),
+            FieldSource::Pos(..) => return None,
+        },
+        DocDef::Struct(it) => docs_from_ast(&*it.source(db).ast),
+        DocDef::Enum(it) => docs_from_ast(&*it.source(db).ast),
+        DocDef::EnumVariant(it) => docs_from_ast(&*it.source(db).ast),
+        DocDef::Static(it) => docs_from_ast(&*it.source(db).ast),
+        DocDef::Const(it) => docs_from_ast(&*it.source(db).ast),
+        DocDef::Function(it) => docs_from_ast(&*it.source(db).ast),
+        DocDef::Union(it) => docs_from_ast(&*it.source(db).ast),
+        DocDef::Trait(it) => docs_from_ast(&*it.source(db).ast),
+        DocDef::TypeAlias(it) => docs_from_ast(&*it.source(db).ast),
+        DocDef::MacroDef(it) => docs_from_ast(&*it.source(db).ast),
+    }
+}
+
+impl<T: Into<DocDef> + Copy> Docs for T {
+    fn docs(&self, db: &impl HirDatabase) -> Option<Documentation> {
+        db.documentation((*self).into())
+    }
+}
diff --git a/crates/ra_hir/src/db.rs b/crates/ra_hir/src/db.rs
index d2a372f3b..d2d6f95b7 100644
--- a/crates/ra_hir/src/db.rs
+++ b/crates/ra_hir/src/db.rs
@@ -128,8 +128,8 @@ pub trait DefDatabase: SourceDatabase {
     #[salsa::invoke(crate::lang_item::LangItems::lang_item_query)]
     fn lang_item(&self, start_crate: Crate, item: SmolStr) -> Option<LangItemTarget>;
 
-    #[salsa::invoke(crate::docs::documentation_query)]
-    fn documentation(&self, def: crate::docs::DocDef) -> Option<crate::docs::Documentation>;
+    #[salsa::invoke(crate::code_model::docs::documentation_query)]
+    fn documentation(&self, def: crate::DocDef) -> Option<crate::Documentation>;
 }
 
 #[salsa::query_group(HirDatabaseStorage)]
diff --git a/crates/ra_hir/src/docs.rs b/crates/ra_hir/src/docs.rs
deleted file mode 100644
index da2b9b854..000000000
--- a/crates/ra_hir/src/docs.rs
+++ /dev/null
@@ -1,96 +0,0 @@
-use std::sync::Arc;
-
-use ra_syntax::ast;
-
-use crate::{
-    HirDatabase, DefDatabase, AstDatabase, HasSource,
-    Module, StructField, Struct, Enum, EnumVariant, Static, Const, Function, Union, Trait, TypeAlias, FieldSource, MacroDef,
-};
-
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
-pub enum DocDef {
-    Module(Module),
-    StructField(StructField),
-    Struct(Struct),
-    Enum(Enum),
-    EnumVariant(EnumVariant),
-    Static(Static),
-    Const(Const),
-    Function(Function),
-    Union(Union),
-    Trait(Trait),
-    TypeAlias(TypeAlias),
-    MacroDef(MacroDef),
-}
-
-impl_froms!(
-    DocDef: Module,
-    StructField,
-    Struct,
-    Enum,
-    EnumVariant,
-    Static,
-    Const,
-    Function,
-    Union,
-    Trait,
-    TypeAlias,
-    MacroDef
-);
-
-/// Holds documentation
-#[derive(Debug, Clone, PartialEq, Eq)]
-pub struct Documentation(Arc<str>);
-
-impl Documentation {
-    fn new(s: &str) -> Documentation {
-        Documentation(s.into())
-    }
-
-    pub fn as_str(&self) -> &str {
-        &*self.0
-    }
-}
-
-impl Into<String> for Documentation {
-    fn into(self) -> String {
-        self.as_str().to_owned()
-    }
-}
-
-pub trait Docs {
-    fn docs(&self, db: &impl HirDatabase) -> Option<Documentation>;
-}
-
-pub(crate) fn docs_from_ast(node: &impl ast::DocCommentsOwner) -> Option<Documentation> {
-    node.doc_comment_text().map(|it| Documentation::new(&it))
-}
-
-pub(crate) fn documentation_query(
-    db: &(impl DefDatabase + AstDatabase),
-    def: DocDef,
-) -> Option<Documentation> {
-    match def {
-        DocDef::Module(it) => docs_from_ast(&*it.declaration_source(db)?.ast),
-        DocDef::StructField(it) => match it.source(db).ast {
-            FieldSource::Named(named) => docs_from_ast(&*named),
-            FieldSource::Pos(..) => return None,
-        },
-        DocDef::Struct(it) => docs_from_ast(&*it.source(db).ast),
-        DocDef::Enum(it) => docs_from_ast(&*it.source(db).ast),
-        DocDef::EnumVariant(it) => docs_from_ast(&*it.source(db).ast),
-        DocDef::Static(it) => docs_from_ast(&*it.source(db).ast),
-        DocDef::Const(it) => docs_from_ast(&*it.source(db).ast),
-        DocDef::Function(it) => docs_from_ast(&*it.source(db).ast),
-        DocDef::Union(it) => docs_from_ast(&*it.source(db).ast),
-        DocDef::Trait(it) => docs_from_ast(&*it.source(db).ast),
-        DocDef::TypeAlias(it) => docs_from_ast(&*it.source(db).ast),
-        DocDef::MacroDef(it) => docs_from_ast(&*it.source(db).ast),
-    }
-}
-
-impl<T: Into<DocDef> + Copy> Docs for T {
-    fn docs(&self, db: &impl HirDatabase) -> Option<Documentation> {
-        db.documentation((*self).into())
-    }
-}
diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs
index 1690296e5..2e99bdac8 100644
--- a/crates/ra_hir/src/lib.rs
+++ b/crates/ra_hir/src/lib.rs
@@ -38,7 +38,6 @@ mod impl_block;
 mod expr;
 mod lang_item;
 mod generics;
-mod docs;
 mod resolve;
 pub mod diagnostics;
 
@@ -64,7 +63,6 @@ pub use self::{
     nameres::{PerNs, Namespace, ImportId},
     ty::{Ty, ApplicationTy, TypeCtor, TraitRef, Substs, display::HirDisplay, CallableDef},
     impl_block::{ImplBlock, ImplItem},
-    docs::{Docs, Documentation},
     adt::AdtDef,
     expr::ExprScopes,
     resolve::Resolution,
@@ -83,4 +81,5 @@ pub use self::code_model::{
     Trait, TypeAlias, MacroDef, Container,
     BuiltinType,
     src::{Source, HasSource},
+    docs::{Docs, Documentation, DocDef},
 };
-- 
cgit v1.2.3