From 109a7f3717612c58c73c5c153b632385b922fc9d Mon Sep 17 00:00:00 2001 From: Aleksey Kladov 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 { + 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