Handle accesses within inner functions

This commit is contained in:
Charlie Marsh 2022-09-11 10:27:34 -04:00
parent e3c8f61340
commit 6b10bb5035
1 changed files with 17 additions and 10 deletions

View File

@ -37,6 +37,7 @@ struct Checker<'a> {
deferred_annotations: Vec<(Location, &'a str)>, deferred_annotations: Vec<(Location, &'a str)>,
deferred_functions: Vec<(&'a Stmt, Vec<usize>, Vec<usize>)>, deferred_functions: Vec<(&'a Stmt, Vec<usize>, Vec<usize>)>,
deferred_lambdas: Vec<(&'a Expr, Vec<usize>, Vec<usize>)>, deferred_lambdas: Vec<(&'a Expr, Vec<usize>, Vec<usize>)>,
deferred_assignments: Vec<usize>,
// Derivative state. // Derivative state.
in_f_string: bool, in_f_string: bool,
in_annotation: bool, in_annotation: bool,
@ -66,6 +67,7 @@ impl<'a> Checker<'a> {
deferred_annotations: vec![], deferred_annotations: vec![],
deferred_functions: vec![], deferred_functions: vec![],
deferred_lambdas: vec![], deferred_lambdas: vec![],
deferred_assignments: vec![],
in_f_string: false, in_f_string: false,
in_annotation: false, in_annotation: false,
in_literal: false, in_literal: false,
@ -1038,11 +1040,8 @@ impl<'a> Checker<'a> {
_ => {} _ => {}
} }
if self.settings.select.contains(&CheckCode::F841) { self.deferred_assignments
let scope = .push(*self.scope_stack.last().expect("No current scope found."));
&self.scopes[*(self.scope_stack.last().expect("No current scope found."))];
self.checks.extend(checks::check_unused_variables(scope));
}
self.pop_scope(); self.pop_scope();
} }
@ -1061,16 +1060,23 @@ impl<'a> Checker<'a> {
self.visit_expr(body); self.visit_expr(body);
} }
if self.settings.select.contains(&CheckCode::F841) { self.deferred_assignments
let scope = .push(*self.scope_stack.last().expect("No current scope found."));
&self.scopes[*(self.scope_stack.last().expect("No current scope found."))];
self.checks.extend(checks::check_unused_variables(scope));
}
self.pop_scope(); self.pop_scope();
} }
} }
fn check_deferred_assignments(&mut self) {
while !self.deferred_assignments.is_empty() {
let index = self.deferred_assignments.pop().unwrap();
if self.settings.select.contains(&CheckCode::F841) {
self.checks
.extend(checks::check_unused_variables(&self.scopes[index]));
}
}
}
fn check_dead_scopes(&mut self) { fn check_dead_scopes(&mut self) {
if !self.settings.select.contains(&CheckCode::F822) if !self.settings.select.contains(&CheckCode::F822)
&& !self.settings.select.contains(&CheckCode::F401) && !self.settings.select.contains(&CheckCode::F401)
@ -1148,6 +1154,7 @@ pub fn check_ast(
// Check any deferred statements. // Check any deferred statements.
checker.check_deferred_functions(); checker.check_deferred_functions();
checker.check_deferred_lambdas(); checker.check_deferred_lambdas();
checker.check_deferred_assignments();
let mut allocator = vec![]; let mut allocator = vec![];
checker.check_deferred_annotations(path, &mut allocator); checker.check_deferred_annotations(path, &mut allocator);