Parse assignment annotations prior to targets

This commit is contained in:
Charlie Marsh 2022-09-07 22:32:57 -04:00
parent 994f12050d
commit b0ab14aab3
3 changed files with 54 additions and 51 deletions

View File

@ -1,6 +1,7 @@
from __future__ import all_feature_names from __future__ import all_feature_names
import os import os
import functools import functools
from datetime import datetime
from collections import ( from collections import (
Counter, Counter,
OrderedDict, OrderedDict,
@ -15,6 +16,8 @@ from blah import ClassA, ClassB, ClassC
class X: class X:
datetime: datetime
def a(self) -> "namedtuple": def a(self) -> "namedtuple":
x = os.environ["1"] x = os.environ["1"]
y = Counter() y = Counter()

View File

@ -316,12 +316,12 @@ mod tests {
}, },
Check { Check {
kind: CheckKind::UnusedImport("collections.OrderedDict".to_string()), kind: CheckKind::UnusedImport("collections.OrderedDict".to_string()),
location: Location::new(4, 1), location: Location::new(5, 1),
fix: None, fix: None,
}, },
Check { Check {
kind: CheckKind::UnusedImport("logging.handlers".to_string()), kind: CheckKind::UnusedImport("logging.handlers".to_string()),
location: Location::new(12, 1), location: Location::new(13, 1),
fix: None, fix: None,
}, },
]; ];

View File

@ -72,13 +72,13 @@ pub fn walk_stmt<'a, V: Visitor<'a> + ?Sized>(visitor: &mut V, stmt: &'a Stmt) {
} => { } => {
visitor.visit_arguments(args); visitor.visit_arguments(args);
for expr in decorator_list { for expr in decorator_list {
visitor.visit_expr(expr) visitor.visit_expr(expr);
} }
for expr in returns { for expr in returns {
visitor.visit_annotation(expr); visitor.visit_annotation(expr);
} }
for stmt in body { for stmt in body {
visitor.visit_stmt(stmt) visitor.visit_stmt(stmt);
} }
} }
StmtKind::AsyncFunctionDef { StmtKind::AsyncFunctionDef {
@ -90,13 +90,13 @@ pub fn walk_stmt<'a, V: Visitor<'a> + ?Sized>(visitor: &mut V, stmt: &'a Stmt) {
} => { } => {
visitor.visit_arguments(args); visitor.visit_arguments(args);
for expr in decorator_list { for expr in decorator_list {
visitor.visit_expr(expr) visitor.visit_expr(expr);
} }
for expr in returns { for expr in returns {
visitor.visit_annotation(expr); visitor.visit_annotation(expr);
} }
for stmt in body { for stmt in body {
visitor.visit_stmt(stmt) visitor.visit_stmt(stmt);
} }
} }
StmtKind::ClassDef { StmtKind::ClassDef {
@ -107,33 +107,33 @@ pub fn walk_stmt<'a, V: Visitor<'a> + ?Sized>(visitor: &mut V, stmt: &'a Stmt) {
.. ..
} => { } => {
for expr in bases { for expr in bases {
visitor.visit_expr(expr) visitor.visit_expr(expr);
} }
for keyword in keywords { for keyword in keywords {
visitor.visit_keyword(keyword) visitor.visit_keyword(keyword);
} }
for expr in decorator_list { for expr in decorator_list {
visitor.visit_expr(expr) visitor.visit_expr(expr);
} }
for stmt in body { for stmt in body {
visitor.visit_stmt(stmt) visitor.visit_stmt(stmt);
} }
} }
StmtKind::Return { value } => { StmtKind::Return { value } => {
if let Some(expr) = value { if let Some(expr) = value {
visitor.visit_expr(expr) visitor.visit_expr(expr);
} }
} }
StmtKind::Delete { targets } => { StmtKind::Delete { targets } => {
for expr in targets { for expr in targets {
visitor.visit_expr(expr) visitor.visit_expr(expr);
} }
} }
StmtKind::Assign { targets, value, .. } => { StmtKind::Assign { targets, value, .. } => {
visitor.visit_expr(value);
for expr in targets { for expr in targets {
visitor.visit_expr(expr) visitor.visit_expr(expr);
} }
visitor.visit_expr(value)
} }
StmtKind::AugAssign { target, op, value } => { StmtKind::AugAssign { target, op, value } => {
visitor.visit_expr(target); visitor.visit_expr(target);
@ -146,11 +146,11 @@ pub fn walk_stmt<'a, V: Visitor<'a> + ?Sized>(visitor: &mut V, stmt: &'a Stmt) {
value, value,
.. ..
} => { } => {
visitor.visit_expr(target);
visitor.visit_annotation(annotation); visitor.visit_annotation(annotation);
if let Some(expr) = value { if let Some(expr) = value {
visitor.visit_expr(expr) visitor.visit_expr(expr);
} }
visitor.visit_expr(target);
} }
StmtKind::For { StmtKind::For {
target, target,
@ -162,10 +162,10 @@ pub fn walk_stmt<'a, V: Visitor<'a> + ?Sized>(visitor: &mut V, stmt: &'a Stmt) {
visitor.visit_expr(target); visitor.visit_expr(target);
visitor.visit_expr(iter); visitor.visit_expr(iter);
for stmt in body { for stmt in body {
visitor.visit_stmt(stmt) visitor.visit_stmt(stmt);
} }
for stmt in orelse { for stmt in orelse {
visitor.visit_stmt(stmt) visitor.visit_stmt(stmt);
} }
} }
StmtKind::AsyncFor { StmtKind::AsyncFor {
@ -178,28 +178,28 @@ pub fn walk_stmt<'a, V: Visitor<'a> + ?Sized>(visitor: &mut V, stmt: &'a Stmt) {
visitor.visit_expr(target); visitor.visit_expr(target);
visitor.visit_expr(iter); visitor.visit_expr(iter);
for stmt in body { for stmt in body {
visitor.visit_stmt(stmt) visitor.visit_stmt(stmt);
} }
for stmt in orelse { for stmt in orelse {
visitor.visit_stmt(stmt) visitor.visit_stmt(stmt);
} }
} }
StmtKind::While { test, body, orelse } => { StmtKind::While { test, body, orelse } => {
visitor.visit_expr(test); visitor.visit_expr(test);
for stmt in body { for stmt in body {
visitor.visit_stmt(stmt) visitor.visit_stmt(stmt);
} }
for stmt in orelse { for stmt in orelse {
visitor.visit_stmt(stmt) visitor.visit_stmt(stmt);
} }
} }
StmtKind::If { test, body, orelse } => { StmtKind::If { test, body, orelse } => {
visitor.visit_expr(test); visitor.visit_expr(test);
for stmt in body { for stmt in body {
visitor.visit_stmt(stmt) visitor.visit_stmt(stmt);
} }
for stmt in orelse { for stmt in orelse {
visitor.visit_stmt(stmt) visitor.visit_stmt(stmt);
} }
} }
StmtKind::With { items, body, .. } => { StmtKind::With { items, body, .. } => {
@ -207,7 +207,7 @@ pub fn walk_stmt<'a, V: Visitor<'a> + ?Sized>(visitor: &mut V, stmt: &'a Stmt) {
visitor.visit_withitem(withitem); visitor.visit_withitem(withitem);
} }
for stmt in body { for stmt in body {
visitor.visit_stmt(stmt) visitor.visit_stmt(stmt);
} }
} }
StmtKind::AsyncWith { items, body, .. } => { StmtKind::AsyncWith { items, body, .. } => {
@ -215,7 +215,7 @@ pub fn walk_stmt<'a, V: Visitor<'a> + ?Sized>(visitor: &mut V, stmt: &'a Stmt) {
visitor.visit_withitem(withitem); visitor.visit_withitem(withitem);
} }
for stmt in body { for stmt in body {
visitor.visit_stmt(stmt) visitor.visit_stmt(stmt);
} }
} }
StmtKind::Match { subject, cases } => { StmtKind::Match { subject, cases } => {
@ -227,10 +227,10 @@ pub fn walk_stmt<'a, V: Visitor<'a> + ?Sized>(visitor: &mut V, stmt: &'a Stmt) {
} }
StmtKind::Raise { exc, cause } => { StmtKind::Raise { exc, cause } => {
if let Some(expr) = exc { if let Some(expr) = exc {
visitor.visit_expr(expr) visitor.visit_expr(expr);
}; };
if let Some(expr) = cause { if let Some(expr) = cause {
visitor.visit_expr(expr) visitor.visit_expr(expr);
}; };
} }
StmtKind::Try { StmtKind::Try {
@ -240,22 +240,22 @@ pub fn walk_stmt<'a, V: Visitor<'a> + ?Sized>(visitor: &mut V, stmt: &'a Stmt) {
finalbody, finalbody,
} => { } => {
for stmt in body { for stmt in body {
visitor.visit_stmt(stmt) visitor.visit_stmt(stmt);
} }
for excepthandler in handlers { for excepthandler in handlers {
visitor.visit_excepthandler(excepthandler) visitor.visit_excepthandler(excepthandler)
} }
for stmt in orelse { for stmt in orelse {
visitor.visit_stmt(stmt) visitor.visit_stmt(stmt);
} }
for stmt in finalbody { for stmt in finalbody {
visitor.visit_stmt(stmt) visitor.visit_stmt(stmt);
} }
} }
StmtKind::Assert { test, msg } => { StmtKind::Assert { test, msg } => {
visitor.visit_expr(test); visitor.visit_expr(test);
if let Some(expr) = msg { if let Some(expr) = msg {
visitor.visit_expr(expr) visitor.visit_expr(expr);
} }
} }
StmtKind::Import { names } => { StmtKind::Import { names } => {
@ -282,7 +282,7 @@ pub fn walk_expr<'a, V: Visitor<'a> + ?Sized>(visitor: &mut V, expr: &'a Expr) {
ExprKind::BoolOp { op, values } => { ExprKind::BoolOp { op, values } => {
visitor.visit_boolop(op); visitor.visit_boolop(op);
for expr in values { for expr in values {
visitor.visit_expr(expr) visitor.visit_expr(expr);
} }
} }
ExprKind::NamedExpr { target, value } => { ExprKind::NamedExpr { target, value } => {
@ -309,26 +309,26 @@ pub fn walk_expr<'a, V: Visitor<'a> + ?Sized>(visitor: &mut V, expr: &'a Expr) {
} }
ExprKind::Dict { keys, values } => { ExprKind::Dict { keys, values } => {
for expr in keys { for expr in keys {
visitor.visit_expr(expr) visitor.visit_expr(expr);
} }
for expr in values { for expr in values {
visitor.visit_expr(expr) visitor.visit_expr(expr);
} }
} }
ExprKind::Set { elts } => { ExprKind::Set { elts } => {
for expr in elts { for expr in elts {
visitor.visit_expr(expr) visitor.visit_expr(expr);
} }
} }
ExprKind::ListComp { elt, generators } => { ExprKind::ListComp { elt, generators } => {
for comprehension in generators { for comprehension in generators {
visitor.visit_comprehension(comprehension) visitor.visit_comprehension(comprehension);
} }
visitor.visit_expr(elt); visitor.visit_expr(elt);
} }
ExprKind::SetComp { elt, generators } => { ExprKind::SetComp { elt, generators } => {
for comprehension in generators { for comprehension in generators {
visitor.visit_comprehension(comprehension) visitor.visit_comprehension(comprehension);
} }
visitor.visit_expr(elt); visitor.visit_expr(elt);
} }
@ -338,21 +338,21 @@ pub fn walk_expr<'a, V: Visitor<'a> + ?Sized>(visitor: &mut V, expr: &'a Expr) {
generators, generators,
} => { } => {
for comprehension in generators { for comprehension in generators {
visitor.visit_comprehension(comprehension) visitor.visit_comprehension(comprehension);
} }
visitor.visit_expr(key); visitor.visit_expr(key);
visitor.visit_expr(value); visitor.visit_expr(value);
} }
ExprKind::GeneratorExp { elt, generators } => { ExprKind::GeneratorExp { elt, generators } => {
for comprehension in generators { for comprehension in generators {
visitor.visit_comprehension(comprehension) visitor.visit_comprehension(comprehension);
} }
visitor.visit_expr(elt); visitor.visit_expr(elt);
} }
ExprKind::Await { value } => visitor.visit_expr(value), ExprKind::Await { value } => visitor.visit_expr(value),
ExprKind::Yield { value } => { ExprKind::Yield { value } => {
if let Some(expr) = value { if let Some(expr) = value {
visitor.visit_expr(expr) visitor.visit_expr(expr);
} }
} }
ExprKind::YieldFrom { value } => visitor.visit_expr(value), ExprKind::YieldFrom { value } => visitor.visit_expr(value),
@ -366,7 +366,7 @@ pub fn walk_expr<'a, V: Visitor<'a> + ?Sized>(visitor: &mut V, expr: &'a Expr) {
visitor.visit_cmpop(cmpop); visitor.visit_cmpop(cmpop);
} }
for expr in comparators { for expr in comparators {
visitor.visit_expr(expr) visitor.visit_expr(expr);
} }
} }
ExprKind::Call { ExprKind::Call {
@ -387,12 +387,12 @@ pub fn walk_expr<'a, V: Visitor<'a> + ?Sized>(visitor: &mut V, expr: &'a Expr) {
} => { } => {
visitor.visit_expr(value); visitor.visit_expr(value);
if let Some(expr) = format_spec { if let Some(expr) = format_spec {
visitor.visit_expr(expr) visitor.visit_expr(expr);
} }
} }
ExprKind::JoinedStr { values } => { ExprKind::JoinedStr { values } => {
for expr in values { for expr in values {
visitor.visit_expr(expr) visitor.visit_expr(expr);
} }
} }
ExprKind::Constant { value, .. } => visitor.visit_constant(value), ExprKind::Constant { value, .. } => visitor.visit_constant(value),
@ -481,25 +481,25 @@ pub fn walk_arguments<'a, V: Visitor<'a> + ?Sized>(visitor: &mut V, arguments: &
visitor.visit_arg(arg); visitor.visit_arg(arg);
} }
if let Some(arg) = &arguments.vararg { if let Some(arg) = &arguments.vararg {
visitor.visit_arg(arg) visitor.visit_arg(arg);
} }
for arg in &arguments.kwonlyargs { for arg in &arguments.kwonlyargs {
visitor.visit_arg(arg); visitor.visit_arg(arg);
} }
for expr in &arguments.kw_defaults { for expr in &arguments.kw_defaults {
visitor.visit_expr(expr) visitor.visit_expr(expr);
} }
if let Some(arg) = &arguments.kwarg { if let Some(arg) = &arguments.kwarg {
visitor.visit_arg(arg) visitor.visit_arg(arg);
} }
for expr in &arguments.defaults { for expr in &arguments.defaults {
visitor.visit_expr(expr) visitor.visit_expr(expr);
} }
} }
pub fn walk_arg<'a, V: Visitor<'a> + ?Sized>(visitor: &mut V, arg: &'a Arg) { pub fn walk_arg<'a, V: Visitor<'a> + ?Sized>(visitor: &mut V, arg: &'a Arg) {
if let Some(expr) = &arg.node.annotation { if let Some(expr) = &arg.node.annotation {
visitor.visit_annotation(expr) visitor.visit_annotation(expr);
} }
} }
@ -530,7 +530,7 @@ pub fn walk_pattern<'a, V: Visitor<'a> + ?Sized>(visitor: &mut V, pattern: &'a P
PatternKind::MatchSingleton { value } => visitor.visit_constant(value), PatternKind::MatchSingleton { value } => visitor.visit_constant(value),
PatternKind::MatchSequence { patterns } => { PatternKind::MatchSequence { patterns } => {
for pattern in patterns { for pattern in patterns {
visitor.visit_pattern(pattern) visitor.visit_pattern(pattern);
} }
} }
PatternKind::MatchMapping { keys, patterns, .. } => { PatternKind::MatchMapping { keys, patterns, .. } => {
@ -559,7 +559,7 @@ pub fn walk_pattern<'a, V: Visitor<'a> + ?Sized>(visitor: &mut V, pattern: &'a P
PatternKind::MatchStar { .. } => {} PatternKind::MatchStar { .. } => {}
PatternKind::MatchAs { pattern, .. } => { PatternKind::MatchAs { pattern, .. } => {
if let Some(pattern) = pattern { if let Some(pattern) = pattern {
visitor.visit_pattern(pattern) visitor.visit_pattern(pattern);
} }
} }
PatternKind::MatchOr { patterns } => { PatternKind::MatchOr { patterns } => {