From 109a7f3717612c58c73c5c153b632385b922fc9d Mon Sep 17 00:00:00 2001
From: Aleksey Kladov <aleksey.kladov@gmail.com>
Date: Tue, 27 Nov 2018 22:58:09 +0300
Subject: itroduce FunctionDescriptor

---
 crates/ra_analysis/src/hir/function/mod.rs | 25 ++++++++++++++++++++++++-
 crates/ra_analysis/src/hir/mod.rs          |  9 ++++++---
 crates/ra_analysis/src/imp.rs              | 11 ++++++-----
 3 files changed, 36 insertions(+), 9 deletions(-)

(limited to 'crates/ra_analysis/src')

diff --git a/crates/ra_analysis/src/hir/function/mod.rs b/crates/ra_analysis/src/hir/function/mod.rs
index 86eee5e93..c8af6bc21 100644
--- a/crates/ra_analysis/src/hir/function/mod.rs
+++ b/crates/ra_analysis/src/hir/function/mod.rs
@@ -1,7 +1,10 @@
 pub(super) mod imp;
 mod scope;
 
-use std::cmp::{max, min};
+use std::{
+    cmp::{max, min},
+    sync::Arc,
+};
 
 use ra_syntax::{
     ast::{self, AstNode, DocCommentsOwner, NameOwner},
@@ -9,6 +12,7 @@ use ra_syntax::{
 };
 
 use crate::{
+    hir::HirDatabase,
     syntax_ptr::SyntaxPtr, FileId,
     loc2id::IdDatabase,
 };
@@ -23,6 +27,25 @@ impl FnId {
     }
 }
 
+pub(crate) struct FunctionDescriptor {
+    fn_id: FnId,
+}
+
+impl FunctionDescriptor {
+    pub(crate) fn guess_from_source(
+        db: &impl HirDatabase,
+        file_id: FileId,
+        fn_def: ast::FnDef,
+    ) -> FunctionDescriptor {
+        let fn_id = FnId::get(db, file_id, fn_def);
+        FunctionDescriptor { fn_id }
+    }
+
+    pub(crate) fn scope(&self, db: &impl HirDatabase) -> Arc<FnScopes> {
+        db.fn_scopes(self.fn_id)
+    }
+}
+
 #[derive(Debug, Clone)]
 pub struct FnDescriptor {
     pub name: String,
diff --git a/crates/ra_analysis/src/hir/mod.rs b/crates/ra_analysis/src/hir/mod.rs
index 232a8558b..edeaeb8e6 100644
--- a/crates/ra_analysis/src/hir/mod.rs
+++ b/crates/ra_analysis/src/hir/mod.rs
@@ -21,7 +21,7 @@ use crate::{
     db::SyntaxDatabase,
     hir::function::{resolve_local_name, FnId, FnScopes},
     hir::module::{
-        ModuleId, ModuleTree, ModuleSource, ModuleDescriptor,
+        ModuleId, ModuleTree, ModuleSource,
         nameres::{ItemMap, InputModuleItems, FileItems}
     },
     input::SourceRootId,
@@ -30,8 +30,11 @@ use crate::{
     Cancelable,
 };
 
-pub(crate) use self::path::{Path, PathKind};
-pub(crate) use self::module::nameres::FileItemId;
+pub(crate) use self::{
+    path::{Path, PathKind},
+    module::{ModuleDescriptor, nameres::FileItemId},
+    function::FunctionDescriptor,
+};
 
 salsa::query_group! {
 pub(crate) trait HirDatabase: SyntaxDatabase + IdDatabase {
diff --git a/crates/ra_analysis/src/imp.rs b/crates/ra_analysis/src/imp.rs
index 6dadc059f..ad4b40c58 100644
--- a/crates/ra_analysis/src/imp.rs
+++ b/crates/ra_analysis/src/imp.rs
@@ -20,9 +20,10 @@ use crate::{
     completion::{completions, CompletionItem},
     db::{self, FileSyntaxQuery, SyntaxDatabase},
     hir::{
-        function::{FnDescriptor, FnId},
-        module::{ModuleDescriptor, Problem},
-        DeclarationDescriptor, HirDatabase,
+        FunctionDescriptor, ModuleDescriptor,
+        function::FnDescriptor,
+        module::{Problem},
+        DeclarationDescriptor,
     },
     input::{FilesDatabase, SourceRoot, SourceRootId, WORKSPACE},
     symbol_index::SymbolIndex,
@@ -587,8 +588,8 @@ fn resolve_local_name(
     name_ref: ast::NameRef,
 ) -> Option<(SmolStr, TextRange)> {
     let fn_def = name_ref.syntax().ancestors().find_map(ast::FnDef::cast)?;
-    let fn_id = FnId::get(db, file_id, fn_def);
-    let scopes = db.fn_scopes(fn_id);
+    let function = FunctionDescriptor::guess_from_source(db, file_id, fn_def);
+    let scopes = function.scope(db);
     let scope_entry = crate::hir::function::resolve_local_name(name_ref, &scopes)?;
     let syntax = db.resolve_syntax_ptr(scope_entry.ptr().into_global(file_id));
     Some((scope_entry.name().clone(), syntax.range()))
-- 
cgit v1.2.3