mirror of
https://github.com/astral-sh/ruff.git
synced 2025-10-16 05:19:57 +00:00
Fix false negatives in Truthiness::from_expr
for lambdas, generators, and f-strings (#20704)
This commit is contained in:
parent
f73bb45be6
commit
c69fa75cd5
9 changed files with 285 additions and 4 deletions
|
@ -12,7 +12,7 @@ use crate::parenthesize::parenthesized_range;
|
|||
use crate::statement_visitor::StatementVisitor;
|
||||
use crate::visitor::Visitor;
|
||||
use crate::{
|
||||
self as ast, Arguments, AtomicNodeIndex, CmpOp, DictItem, ExceptHandler, Expr,
|
||||
self as ast, Arguments, AtomicNodeIndex, CmpOp, DictItem, ExceptHandler, Expr, ExprNoneLiteral,
|
||||
InterpolatedStringElement, MatchCase, Operator, Pattern, Stmt, TypeParam,
|
||||
};
|
||||
use crate::{AnyNodeRef, ExprContext};
|
||||
|
@ -1219,6 +1219,8 @@ impl Truthiness {
|
|||
F: Fn(&str) -> bool,
|
||||
{
|
||||
match expr {
|
||||
Expr::Lambda(_) => Self::Truthy,
|
||||
Expr::Generator(_) => Self::Truthy,
|
||||
Expr::StringLiteral(ast::ExprStringLiteral { value, .. }) => {
|
||||
if value.is_empty() {
|
||||
Self::Falsey
|
||||
|
@ -1388,7 +1390,9 @@ fn is_non_empty_f_string(expr: &ast::ExprFString) -> bool {
|
|||
Expr::FString(f_string) => is_non_empty_f_string(f_string),
|
||||
// These literals may or may not be empty.
|
||||
Expr::StringLiteral(ast::ExprStringLiteral { value, .. }) => !value.is_empty(),
|
||||
Expr::BytesLiteral(ast::ExprBytesLiteral { value, .. }) => !value.is_empty(),
|
||||
// Confusingly, f"{b""}" renders as the string 'b""', which is non-empty.
|
||||
// Therefore, any bytes interpolation is guaranteed non-empty when stringified.
|
||||
Expr::BytesLiteral(_) => true,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1397,7 +1401,9 @@ fn is_non_empty_f_string(expr: &ast::ExprFString) -> bool {
|
|||
ast::FStringPart::FString(f_string) => {
|
||||
f_string.elements.iter().all(|element| match element {
|
||||
InterpolatedStringElement::Literal(string_literal) => !string_literal.is_empty(),
|
||||
InterpolatedStringElement::Interpolation(f_string) => inner(&f_string.expression),
|
||||
InterpolatedStringElement::Interpolation(f_string) => {
|
||||
f_string.debug_text.is_some() || inner(&f_string.expression)
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
|
@ -1493,7 +1499,7 @@ pub fn pep_604_optional(expr: &Expr) -> Expr {
|
|||
ast::ExprBinOp {
|
||||
left: Box::new(expr.clone()),
|
||||
op: Operator::BitOr,
|
||||
right: Box::new(Expr::NoneLiteral(ast::ExprNoneLiteral::default())),
|
||||
right: Box::new(Expr::NoneLiteral(ExprNoneLiteral::default())),
|
||||
range: TextRange::default(),
|
||||
node_index: AtomicNodeIndex::NONE,
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue