itroduce FunctionDescriptor
This commit is contained in:
parent
f4d0cb64fc
commit
109a7f3717
3 changed files with 36 additions and 9 deletions
|
@ -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,
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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()))
|
||||
|
|
Loading…
Add table
Reference in a new issue