Skip to content

Commit 36b7528

Browse files
authored
Implement AnyNode/AnyNodeRef for FStringFormatSpec (#9836)
## Summary This PR adds the `AnyNode` and `AnyNodeRef` implementation for `FStringFormatSpec` node which will be required in the f-string formatting. The main usage for this is so that we can pass in the node directly to `suppressed_node` in case debug expression is used to format is as verbatim text.
1 parent b3dc565 commit 36b7528

File tree

2 files changed

+69
-0
lines changed

2 files changed

+69
-0
lines changed

crates/ruff_python_ast/src/node.rs

+68
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ pub enum AnyNode {
8989
ExceptHandlerExceptHandler(ast::ExceptHandlerExceptHandler),
9090
FStringExpressionElement(ast::FStringExpressionElement),
9191
FStringLiteralElement(ast::FStringLiteralElement),
92+
FStringFormatSpec(ast::FStringFormatSpec),
9293
PatternMatchValue(ast::PatternMatchValue),
9394
PatternMatchSingleton(ast::PatternMatchSingleton),
9495
PatternMatchSequence(ast::PatternMatchSequence),
@@ -169,6 +170,7 @@ impl AnyNode {
169170
| AnyNode::ExprCall(_)
170171
| AnyNode::FStringExpressionElement(_)
171172
| AnyNode::FStringLiteralElement(_)
173+
| AnyNode::FStringFormatSpec(_)
172174
| AnyNode::ExprFString(_)
173175
| AnyNode::ExprStringLiteral(_)
174176
| AnyNode::ExprBytesLiteral(_)
@@ -281,6 +283,7 @@ impl AnyNode {
281283
| AnyNode::ExceptHandlerExceptHandler(_)
282284
| AnyNode::FStringExpressionElement(_)
283285
| AnyNode::FStringLiteralElement(_)
286+
| AnyNode::FStringFormatSpec(_)
284287
| AnyNode::PatternMatchValue(_)
285288
| AnyNode::PatternMatchSingleton(_)
286289
| AnyNode::PatternMatchSequence(_)
@@ -361,6 +364,7 @@ impl AnyNode {
361364
| AnyNode::ExprCall(_)
362365
| AnyNode::FStringExpressionElement(_)
363366
| AnyNode::FStringLiteralElement(_)
367+
| AnyNode::FStringFormatSpec(_)
364368
| AnyNode::ExprFString(_)
365369
| AnyNode::ExprStringLiteral(_)
366370
| AnyNode::ExprBytesLiteral(_)
@@ -465,6 +469,7 @@ impl AnyNode {
465469
| AnyNode::ExprCall(_)
466470
| AnyNode::FStringExpressionElement(_)
467471
| AnyNode::FStringLiteralElement(_)
472+
| AnyNode::FStringFormatSpec(_)
468473
| AnyNode::ExprFString(_)
469474
| AnyNode::ExprStringLiteral(_)
470475
| AnyNode::ExprBytesLiteral(_)
@@ -554,6 +559,7 @@ impl AnyNode {
554559
| AnyNode::ExprCall(_)
555560
| AnyNode::FStringExpressionElement(_)
556561
| AnyNode::FStringLiteralElement(_)
562+
| AnyNode::FStringFormatSpec(_)
557563
| AnyNode::ExprFString(_)
558564
| AnyNode::ExprStringLiteral(_)
559565
| AnyNode::ExprBytesLiteral(_)
@@ -668,6 +674,7 @@ impl AnyNode {
668674
Self::ExprCall(node) => AnyNodeRef::ExprCall(node),
669675
Self::FStringExpressionElement(node) => AnyNodeRef::FStringExpressionElement(node),
670676
Self::FStringLiteralElement(node) => AnyNodeRef::FStringLiteralElement(node),
677+
Self::FStringFormatSpec(node) => AnyNodeRef::FStringFormatSpec(node),
671678
Self::ExprFString(node) => AnyNodeRef::ExprFString(node),
672679
Self::ExprStringLiteral(node) => AnyNodeRef::ExprStringLiteral(node),
673680
Self::ExprBytesLiteral(node) => AnyNodeRef::ExprBytesLiteral(node),
@@ -2628,6 +2635,43 @@ impl AstNode for ast::ExprCall {
26282635
visitor.visit_arguments(arguments);
26292636
}
26302637
}
2638+
impl AstNode for ast::FStringFormatSpec {
2639+
fn cast(kind: AnyNode) -> Option<Self>
2640+
where
2641+
Self: Sized,
2642+
{
2643+
if let AnyNode::FStringFormatSpec(node) = kind {
2644+
Some(node)
2645+
} else {
2646+
None
2647+
}
2648+
}
2649+
2650+
fn cast_ref(kind: AnyNodeRef) -> Option<&Self> {
2651+
if let AnyNodeRef::FStringFormatSpec(node) = kind {
2652+
Some(node)
2653+
} else {
2654+
None
2655+
}
2656+
}
2657+
2658+
fn as_any_node_ref(&self) -> AnyNodeRef {
2659+
AnyNodeRef::from(self)
2660+
}
2661+
2662+
fn into_any_node(self) -> AnyNode {
2663+
AnyNode::from(self)
2664+
}
2665+
2666+
fn visit_preorder<'a, V>(&'a self, visitor: &mut V)
2667+
where
2668+
V: PreorderVisitor<'a> + ?Sized,
2669+
{
2670+
for element in &self.elements {
2671+
visitor.visit_f_string_element(element);
2672+
}
2673+
}
2674+
}
26312675
impl AstNode for ast::FStringExpressionElement {
26322676
fn cast(kind: AnyNode) -> Option<Self>
26332677
where
@@ -4854,6 +4898,12 @@ impl From<ast::FStringLiteralElement> for AnyNode {
48544898
}
48554899
}
48564900

4901+
impl From<ast::FStringFormatSpec> for AnyNode {
4902+
fn from(node: ast::FStringFormatSpec) -> Self {
4903+
AnyNode::FStringFormatSpec(node)
4904+
}
4905+
}
4906+
48574907
impl From<ast::ExprFString> for AnyNode {
48584908
fn from(node: ast::ExprFString) -> Self {
48594909
AnyNode::ExprFString(node)
@@ -5150,6 +5200,7 @@ impl Ranged for AnyNode {
51505200
AnyNode::ExprCall(node) => node.range(),
51515201
AnyNode::FStringExpressionElement(node) => node.range(),
51525202
AnyNode::FStringLiteralElement(node) => node.range(),
5203+
AnyNode::FStringFormatSpec(node) => node.range(),
51535204
AnyNode::ExprFString(node) => node.range(),
51545205
AnyNode::ExprStringLiteral(node) => node.range(),
51555206
AnyNode::ExprBytesLiteral(node) => node.range(),
@@ -5246,6 +5297,7 @@ pub enum AnyNodeRef<'a> {
52465297
ExprCall(&'a ast::ExprCall),
52475298
FStringExpressionElement(&'a ast::FStringExpressionElement),
52485299
FStringLiteralElement(&'a ast::FStringLiteralElement),
5300+
FStringFormatSpec(&'a ast::FStringFormatSpec),
52495301
ExprFString(&'a ast::ExprFString),
52505302
ExprStringLiteral(&'a ast::ExprStringLiteral),
52515303
ExprBytesLiteral(&'a ast::ExprBytesLiteral),
@@ -5341,6 +5393,7 @@ impl<'a> AnyNodeRef<'a> {
53415393
AnyNodeRef::ExprCall(node) => NonNull::from(*node).cast(),
53425394
AnyNodeRef::FStringExpressionElement(node) => NonNull::from(*node).cast(),
53435395
AnyNodeRef::FStringLiteralElement(node) => NonNull::from(*node).cast(),
5396+
AnyNodeRef::FStringFormatSpec(node) => NonNull::from(*node).cast(),
53445397
AnyNodeRef::ExprFString(node) => NonNull::from(*node).cast(),
53455398
AnyNodeRef::ExprStringLiteral(node) => NonNull::from(*node).cast(),
53465399
AnyNodeRef::ExprBytesLiteral(node) => NonNull::from(*node).cast(),
@@ -5442,6 +5495,7 @@ impl<'a> AnyNodeRef<'a> {
54425495
AnyNodeRef::ExprCall(_) => NodeKind::ExprCall,
54435496
AnyNodeRef::FStringExpressionElement(_) => NodeKind::FStringExpressionElement,
54445497
AnyNodeRef::FStringLiteralElement(_) => NodeKind::FStringLiteralElement,
5498+
AnyNodeRef::FStringFormatSpec(_) => NodeKind::FStringFormatSpec,
54455499
AnyNodeRef::ExprFString(_) => NodeKind::ExprFString,
54465500
AnyNodeRef::ExprStringLiteral(_) => NodeKind::ExprStringLiteral,
54475501
AnyNodeRef::ExprBytesLiteral(_) => NodeKind::ExprBytesLiteral,
@@ -5538,6 +5592,7 @@ impl<'a> AnyNodeRef<'a> {
55385592
| AnyNodeRef::ExprCall(_)
55395593
| AnyNodeRef::FStringExpressionElement(_)
55405594
| AnyNodeRef::FStringLiteralElement(_)
5595+
| AnyNodeRef::FStringFormatSpec(_)
55415596
| AnyNodeRef::ExprFString(_)
55425597
| AnyNodeRef::ExprStringLiteral(_)
55435598
| AnyNodeRef::ExprBytesLiteral(_)
@@ -5650,6 +5705,7 @@ impl<'a> AnyNodeRef<'a> {
56505705
| AnyNodeRef::ExceptHandlerExceptHandler(_)
56515706
| AnyNodeRef::FStringExpressionElement(_)
56525707
| AnyNodeRef::FStringLiteralElement(_)
5708+
| AnyNodeRef::FStringFormatSpec(_)
56535709
| AnyNodeRef::PatternMatchValue(_)
56545710
| AnyNodeRef::PatternMatchSingleton(_)
56555711
| AnyNodeRef::PatternMatchSequence(_)
@@ -5729,6 +5785,7 @@ impl<'a> AnyNodeRef<'a> {
57295785
| AnyNodeRef::ExprCall(_)
57305786
| AnyNodeRef::FStringExpressionElement(_)
57315787
| AnyNodeRef::FStringLiteralElement(_)
5788+
| AnyNodeRef::FStringFormatSpec(_)
57325789
| AnyNodeRef::ExprFString(_)
57335790
| AnyNodeRef::ExprStringLiteral(_)
57345791
| AnyNodeRef::ExprBytesLiteral(_)
@@ -5833,6 +5890,7 @@ impl<'a> AnyNodeRef<'a> {
58335890
| AnyNodeRef::ExprCall(_)
58345891
| AnyNodeRef::FStringExpressionElement(_)
58355892
| AnyNodeRef::FStringLiteralElement(_)
5893+
| AnyNodeRef::FStringFormatSpec(_)
58365894
| AnyNodeRef::ExprFString(_)
58375895
| AnyNodeRef::ExprStringLiteral(_)
58385896
| AnyNodeRef::ExprBytesLiteral(_)
@@ -5922,6 +5980,7 @@ impl<'a> AnyNodeRef<'a> {
59225980
| AnyNodeRef::ExprCall(_)
59235981
| AnyNodeRef::FStringExpressionElement(_)
59245982
| AnyNodeRef::FStringLiteralElement(_)
5983+
| AnyNodeRef::FStringFormatSpec(_)
59255984
| AnyNodeRef::ExprFString(_)
59265985
| AnyNodeRef::ExprStringLiteral(_)
59275986
| AnyNodeRef::ExprBytesLiteral(_)
@@ -6030,6 +6089,7 @@ impl<'a> AnyNodeRef<'a> {
60306089
AnyNodeRef::ExprCall(node) => node.visit_preorder(visitor),
60316090
AnyNodeRef::FStringExpressionElement(node) => node.visit_preorder(visitor),
60326091
AnyNodeRef::FStringLiteralElement(node) => node.visit_preorder(visitor),
6092+
AnyNodeRef::FStringFormatSpec(node) => node.visit_preorder(visitor),
60336093
AnyNodeRef::ExprFString(node) => node.visit_preorder(visitor),
60346094
AnyNodeRef::ExprStringLiteral(node) => node.visit_preorder(visitor),
60356095
AnyNodeRef::ExprBytesLiteral(node) => node.visit_preorder(visitor),
@@ -6420,6 +6480,12 @@ impl<'a> From<&'a ast::FStringLiteralElement> for AnyNodeRef<'a> {
64206480
}
64216481
}
64226482

6483+
impl<'a> From<&'a ast::FStringFormatSpec> for AnyNodeRef<'a> {
6484+
fn from(node: &'a ast::FStringFormatSpec) -> Self {
6485+
AnyNodeRef::FStringFormatSpec(node)
6486+
}
6487+
}
6488+
64236489
impl<'a> From<&'a ast::ExprFString> for AnyNodeRef<'a> {
64246490
fn from(node: &'a ast::ExprFString) -> Self {
64256491
AnyNodeRef::ExprFString(node)
@@ -6842,6 +6908,7 @@ impl Ranged for AnyNodeRef<'_> {
68426908
AnyNodeRef::ExprCall(node) => node.range(),
68436909
AnyNodeRef::FStringExpressionElement(node) => node.range(),
68446910
AnyNodeRef::FStringLiteralElement(node) => node.range(),
6911+
AnyNodeRef::FStringFormatSpec(node) => node.range(),
68456912
AnyNodeRef::ExprFString(node) => node.range(),
68466913
AnyNodeRef::ExprStringLiteral(node) => node.range(),
68476914
AnyNodeRef::ExprBytesLiteral(node) => node.range(),
@@ -6940,6 +7007,7 @@ pub enum NodeKind {
69407007
ExprCall,
69417008
FStringExpressionElement,
69427009
FStringLiteralElement,
7010+
FStringFormatSpec,
69437011
ExprFString,
69447012
ExprStringLiteral,
69457013
ExprBytesLiteral,

crates/ruff_python_formatter/src/range.rs

+1
Original file line numberDiff line numberDiff line change
@@ -666,6 +666,7 @@ impl Format<PyFormatContext<'_>> for FormatEnclosingNode<'_> {
666666
| AnyNodeRef::ExprCall(_)
667667
| AnyNodeRef::FStringExpressionElement(_)
668668
| AnyNodeRef::FStringLiteralElement(_)
669+
| AnyNodeRef::FStringFormatSpec(_)
669670
| AnyNodeRef::ExprFString(_)
670671
| AnyNodeRef::ExprStringLiteral(_)
671672
| AnyNodeRef::ExprBytesLiteral(_)

0 commit comments

Comments
 (0)