-
Notifications
You must be signed in to change notification settings - Fork 1.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Split Constant
to individual literal nodes
#8064
Conversation
Current dependencies on/for this PR:
This stack of pull requests is managed by Graphite. |
2b94722
to
07dce4c
Compare
5b20992
to
66ae3fc
Compare
07dce4c
to
db9d767
Compare
fd9f090
to
7111576
Compare
PR Check ResultsEcosystem✅ ecosystem check detected no linter changes. ✅ ecosystem check detected no format changes. |
crates/ruff_linter/src/rules/flake8_simplify/rules/if_else_block_instead_of_dict_lookup.rs
Show resolved
Hide resolved
crates/ruff_python_formatter/src/expression/expr_bytes_literal.rs
Outdated
Show resolved
Hide resolved
db9d767
to
666eb09
Compare
7111576
to
f544b3f
Compare
crates/ruff_python_formatter/src/expression/expr_bytes_literal.rs
Outdated
Show resolved
Hide resolved
crates/ruff_python_formatter/src/expression/expr_ellipsis_literal.rs
Outdated
Show resolved
Hide resolved
Expr::Constant(ast::ExprConstant { | ||
value: Constant::Str(value), | ||
range: _, | ||
}) => { | ||
Expr::StringLiteral(ast::ExprStringLiteral { value, .. }) => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Those changes are a nice simplification!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I haven't managed to get through all of it yet, but here a first few comments.
crates/ruff_linter/src/rules/flake8_pyi/rules/redundant_literal_union.rs
Show resolved
Hide resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good to me. Thanks for working on this large refactor.
I think adding a LiteralExpression
union would be useful in a few places and might be something you want to consider adding as part of this PR or as a follow up PR
@@ -149,7 +149,14 @@ pub(crate) fn repeated_keys(checker: &mut Checker, dict: &ast::ExprDict) { | |||
}; | |||
|
|||
match key { | |||
Expr::Constant(_) | Expr::Tuple(_) | Expr::FString(_) => { | |||
Expr::StringLiteral(_) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not having a single union will make it more challenging to identify all places where a new literal type would need to be added. But that's probably fine, new literal types don't happen everyday.
crates/ruff_python_formatter/src/expression/expr_boolean_literal.rs
Outdated
Show resolved
Hide resolved
crates/ruff_python_formatter/src/expression/expr_bytes_literal.rs
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good to me. Thanks for working on this large refactor.
I think adding a LiteralExpression
union would be useful in a few places and might be something you want to consider adding as part of this PR or as a follow up PR
Thanks for the review! I'll make most of the smaller changes in this PR and move a few larger ones in the follow-up PRs:
|
666eb09
to
9321710
Compare
f544b3f
to
d623cf9
Compare
cf8ee21
to
aaf65a1
Compare
Summary
This PR splits the
Constant
enum as individual literal nodes. It introduces the following new nodes for each variant:ExprStringLiteral
ExprBytesLiteral
ExprNumberLiteral
ExprBooleanLiteral
ExprNoneLiteral
ExprEllipsisLiteral
The main motivation behind this refactor is to introduce the new AST node for implicit string concatenation in the coming PR. The elements of that node will be either a string literal, bytes literal or a f-string which can be implemented using an enum. This means that a string or bytes literal cannot be represented by
Constant::Str
/Constant::Bytes
which creates an inconsistency.This PR avoids that inconsistency by splitting the constant nodes into it's own literal nodes, literal being the more appropriate naming convention from a static analysis tool perspective.
This also makes working with literals in the linter and formatter much more ergonomic like, for example, if one would want to check if this is a string literal, it can be done easily using
Expr::is_string_literal_expr
or matching againstExpr::StringLiteral
as oppose to matching against theExprConstant
and enumConstant
. A few AST helper methods can be simplified as well which will be done in a follow-up PR.This introduces a new
Expr::is_literal_expr
method which is the same asExpr::is_constant_expr
. There are also intermediary changes related to implicit string concatenation which are quiet less. This is done so as to avoid having a huge PR which this already is.Test Plan
Formatter ecosystem check
main
dhruv/constant-to-literal