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.
Those changes are a nice simplification!
MichaReiser
left a comment
There was a problem hiding this comment.
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
MichaReiser
left a comment
There was a problem hiding this comment.
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
|
|
||
| match key { | ||
| Expr::Constant(_) | Expr::Tuple(_) | Expr::FString(_) => { | ||
| Expr::StringLiteral(_) |
There was a problem hiding this comment.
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
MichaReiser
left a comment
There was a problem hiding this comment.
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
Constantenum as individual literal nodes. It introduces the following new nodes for each variant:ExprStringLiteralExprBytesLiteralExprNumberLiteralExprBooleanLiteralExprNoneLiteralExprEllipsisLiteralThe 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::Byteswhich 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_expror matching againstExpr::StringLiteralas oppose to matching against theExprConstantand 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_exprmethod 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
maindhruv/constant-to-literal