mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-25 12:33:33 +00:00
Refactor
This commit is contained in:
parent
aaca7d003b
commit
7f4b07a907
2 changed files with 16 additions and 20 deletions
|
@ -8,7 +8,7 @@ use libsyntax2::{
|
|||
|
||||
use {
|
||||
AtomEdit, find_node_at_offset,
|
||||
scope::{FnScopes, compute_scopes},
|
||||
scope::FnScopes,
|
||||
};
|
||||
|
||||
#[derive(Debug)]
|
||||
|
@ -25,7 +25,7 @@ pub fn scope_completion(file: &File, offset: TextUnit) -> Option<Vec<CompletionI
|
|||
};
|
||||
let name_ref = find_node_at_offset::<ast::NameRef>(file.syntax(), offset)?;
|
||||
let fn_def = ancestors(name_ref.syntax()).filter_map(ast::FnDef::cast).next()?;
|
||||
let scopes = compute_scopes(fn_def);
|
||||
let scopes = FnScopes::new(fn_def);
|
||||
Some(complete(name_ref, &scopes))
|
||||
}
|
||||
|
||||
|
|
|
@ -9,20 +9,6 @@ use libsyntax2::{
|
|||
algo::{ancestors, generate, walk::preorder}
|
||||
};
|
||||
|
||||
pub fn compute_scopes(fn_def: ast::FnDef) -> FnScopes {
|
||||
let mut scopes = FnScopes::new();
|
||||
let root = scopes.root_scope();
|
||||
fn_def.param_list().into_iter()
|
||||
.flat_map(|it| it.params())
|
||||
.filter_map(|it| it.pat())
|
||||
.for_each(|it| scopes.add_bindings(root, it));
|
||||
|
||||
if let Some(body) = fn_def.body() {
|
||||
compute_block_scopes(body, &mut scopes, root)
|
||||
}
|
||||
scopes
|
||||
}
|
||||
|
||||
fn compute_block_scopes(block: ast::Block, scopes: &mut FnScopes, mut scope: ScopeId) {
|
||||
for stmt in block.statements() {
|
||||
match stmt {
|
||||
|
@ -106,11 +92,21 @@ pub struct FnScopes {
|
|||
}
|
||||
|
||||
impl FnScopes {
|
||||
fn new() -> FnScopes {
|
||||
FnScopes {
|
||||
scopes: vec![],
|
||||
scope_for: HashMap::new(),
|
||||
pub fn new(fn_def: ast::FnDef) -> FnScopes {
|
||||
let mut scopes = FnScopes {
|
||||
scopes: Vec::new(),
|
||||
scope_for: HashMap::new()
|
||||
};
|
||||
let root = scopes.root_scope();
|
||||
fn_def.param_list().into_iter()
|
||||
.flat_map(|it| it.params())
|
||||
.filter_map(|it| it.pat())
|
||||
.for_each(|it| scopes.add_bindings(root, it));
|
||||
|
||||
if let Some(body) = fn_def.body() {
|
||||
compute_block_scopes(body, &mut scopes, root)
|
||||
}
|
||||
scopes
|
||||
}
|
||||
pub fn entries(&self, scope: ScopeId) -> &[ScopeEntry] {
|
||||
&self.scopes[scope].entries
|
||||
|
|
Loading…
Reference in a new issue