mirror of
https://github.com/astral-sh/ruff.git
synced 2025-08-15 08:00:19 +00:00
Simplify iteration idioms (#13834)
Remove unnecessary uses of `.as_ref()`, `.iter()`, `&**` and similar, mostly in situations when iterating over variables. Many of these changes are only possible following #13826, when we bumped our MSRV to 1.80: several useful implementations on `&Box<[T]>` were only stabilised in Rust 1.80. Some of these changes we could have done earlier, however.
This commit is contained in:
parent
7fd8e30eed
commit
72adb09bf3
36 changed files with 72 additions and 73 deletions
|
@ -487,7 +487,7 @@ fn check_type<T: TypeChecker>(binding: &Binding, semantic: &SemanticModel) -> bo
|
|||
// The type checker might know how to infer the type based on `init_expr`.
|
||||
Some(Stmt::Assign(ast::StmtAssign { targets, value, .. })) => targets
|
||||
.iter()
|
||||
.find_map(|target| match_value(binding, target, value.as_ref()))
|
||||
.find_map(|target| match_value(binding, target, value))
|
||||
.is_some_and(|value| T::match_initializer(value, semantic)),
|
||||
|
||||
// ```python
|
||||
|
@ -496,7 +496,7 @@ fn check_type<T: TypeChecker>(binding: &Binding, semantic: &SemanticModel) -> bo
|
|||
//
|
||||
// In this situation, we check only the annotation.
|
||||
Some(Stmt::AnnAssign(ast::StmtAnnAssign { annotation, .. })) => {
|
||||
T::match_annotation(annotation.as_ref(), semantic)
|
||||
T::match_annotation(annotation, semantic)
|
||||
}
|
||||
|
||||
_ => false,
|
||||
|
@ -512,7 +512,7 @@ fn check_type<T: TypeChecker>(binding: &Binding, semantic: &SemanticModel) -> bo
|
|||
.expressions(source)
|
||||
.find_map(|expr| expr.as_named_expr())
|
||||
.and_then(|ast::ExprNamed { target, value, .. }| {
|
||||
match_value(binding, target.as_ref(), value.as_ref())
|
||||
match_value(binding, target, value)
|
||||
})
|
||||
.is_some_and(|value| T::match_initializer(value, semantic))
|
||||
})
|
||||
|
@ -543,13 +543,13 @@ fn check_type<T: TypeChecker>(binding: &Binding, semantic: &SemanticModel) -> bo
|
|||
//
|
||||
// We trust the annotation and see if the type checker matches the annotation.
|
||||
Some(Stmt::FunctionDef(ast::StmtFunctionDef { parameters, .. })) => {
|
||||
let Some(parameter) = find_parameter(parameters.as_ref(), binding) else {
|
||||
let Some(parameter) = find_parameter(parameters, binding) else {
|
||||
return false;
|
||||
};
|
||||
let Some(ref annotation) = parameter.parameter.annotation else {
|
||||
return false;
|
||||
};
|
||||
T::match_annotation(annotation.as_ref(), semantic)
|
||||
T::match_annotation(annotation, semantic)
|
||||
}
|
||||
|
||||
_ => false,
|
||||
|
@ -562,7 +562,7 @@ fn check_type<T: TypeChecker>(binding: &Binding, semantic: &SemanticModel) -> bo
|
|||
//
|
||||
// It's a typed declaration, type annotation is the only source of information.
|
||||
Some(Stmt::AnnAssign(ast::StmtAnnAssign { annotation, .. })) => {
|
||||
T::match_annotation(annotation.as_ref(), semantic)
|
||||
T::match_annotation(annotation, semantic)
|
||||
}
|
||||
_ => false,
|
||||
},
|
||||
|
@ -726,7 +726,7 @@ impl TypeChecker for IoBaseChecker {
|
|||
|
||||
// Ex) `open("file.txt")`
|
||||
semantic
|
||||
.resolve_qualified_name(func.as_ref())
|
||||
.resolve_qualified_name(func)
|
||||
.is_some_and(|qualified_name| {
|
||||
matches!(
|
||||
qualified_name.segments(),
|
||||
|
@ -899,7 +899,7 @@ pub fn find_binding_value<'a>(binding: &Binding, semantic: &'a SemanticModel) ->
|
|||
.expressions(parent_id)
|
||||
.find_map(|expr| expr.as_named_expr());
|
||||
if let Some(ast::ExprNamed { target, value, .. }) = parent {
|
||||
return match_value(binding, target.as_ref(), value.as_ref());
|
||||
return match_value(binding, target, value);
|
||||
}
|
||||
}
|
||||
// Ex) `x = 1`
|
||||
|
@ -907,14 +907,14 @@ pub fn find_binding_value<'a>(binding: &Binding, semantic: &'a SemanticModel) ->
|
|||
Some(Stmt::Assign(ast::StmtAssign { value, targets, .. })) => {
|
||||
return targets
|
||||
.iter()
|
||||
.find_map(|target| match_value(binding, target, value.as_ref()))
|
||||
.find_map(|target| match_value(binding, target, value))
|
||||
}
|
||||
Some(Stmt::AnnAssign(ast::StmtAnnAssign {
|
||||
value: Some(value),
|
||||
target,
|
||||
..
|
||||
})) => {
|
||||
return match_value(binding, target, value.as_ref());
|
||||
return match_value(binding, target, value);
|
||||
}
|
||||
_ => {}
|
||||
},
|
||||
|
@ -958,7 +958,7 @@ fn match_value<'a>(binding: &Binding, target: &Expr, value: &'a Expr) -> Option<
|
|||
|
||||
/// Given a target and value, find the value that's assigned to the given symbol.
|
||||
fn match_target<'a>(binding: &Binding, targets: &[Expr], values: &'a [Expr]) -> Option<&'a Expr> {
|
||||
for (target, value) in targets.iter().zip(values.iter()) {
|
||||
for (target, value) in targets.iter().zip(values) {
|
||||
match target {
|
||||
Expr::Tuple(ast::ExprTuple {
|
||||
elts: target_elts, ..
|
||||
|
|
|
@ -795,7 +795,7 @@ impl<'a> SemanticModel<'a> {
|
|||
let resolved: QualifiedName = qualified_name
|
||||
.segments()
|
||||
.iter()
|
||||
.chain(tail.iter())
|
||||
.chain(tail)
|
||||
.copied()
|
||||
.collect();
|
||||
Some(resolved)
|
||||
|
@ -809,7 +809,7 @@ impl<'a> SemanticModel<'a> {
|
|||
.segments()
|
||||
.iter()
|
||||
.take(1)
|
||||
.chain(tail.iter())
|
||||
.chain(tail)
|
||||
.copied()
|
||||
.collect(),
|
||||
)
|
||||
|
@ -832,7 +832,7 @@ impl<'a> SemanticModel<'a> {
|
|||
qualified_name
|
||||
.segments()
|
||||
.iter()
|
||||
.chain(tail.iter())
|
||||
.chain(tail)
|
||||
.copied()
|
||||
.collect()
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue