Skip to main content

ruff_python_ast/
relocate.rs

1use ruff_text_size::TextRange;
2
3use crate::visitor::transformer::{Transformer, walk_expr, walk_keyword};
4use crate::{self as ast};
5use crate::{Expr, Keyword};
6
7/// Change an expression's location (recursively) to match a desired, fixed
8/// range.
9pub fn relocate_expr(expr: &mut Expr, range: TextRange) {
10    Relocator { range }.visit_expr(expr);
11}
12
13#[derive(Debug)]
14struct Relocator {
15    range: TextRange,
16}
17
18impl Transformer for Relocator {
19    fn visit_expr(&self, expr: &mut Expr) {
20        match expr {
21            Expr::BoolOp(ast::ExprBoolOp { range, .. }) => {
22                *range = self.range;
23            }
24            Expr::Named(ast::ExprNamed { range, .. }) => {
25                *range = self.range;
26            }
27            Expr::BinOp(ast::ExprBinOp { range, .. }) => {
28                *range = self.range;
29            }
30            Expr::UnaryOp(ast::ExprUnaryOp { range, .. }) => {
31                *range = self.range;
32            }
33            Expr::Lambda(ast::ExprLambda { range, .. }) => {
34                *range = self.range;
35            }
36            Expr::If(ast::ExprIf { range, .. }) => {
37                *range = self.range;
38            }
39            Expr::Dict(ast::ExprDict { range, .. }) => {
40                *range = self.range;
41            }
42            Expr::Set(ast::ExprSet { range, .. }) => {
43                *range = self.range;
44            }
45            Expr::ListComp(ast::ExprListComp { range, .. }) => {
46                *range = self.range;
47            }
48            Expr::SetComp(ast::ExprSetComp { range, .. }) => {
49                *range = self.range;
50            }
51            Expr::DictComp(ast::ExprDictComp { range, .. }) => {
52                *range = self.range;
53            }
54            Expr::Generator(ast::ExprGenerator { range, .. }) => {
55                *range = self.range;
56            }
57            Expr::Await(ast::ExprAwait { range, .. }) => {
58                *range = self.range;
59            }
60            Expr::Yield(ast::ExprYield { range, .. }) => {
61                *range = self.range;
62            }
63            Expr::YieldFrom(ast::ExprYieldFrom { range, .. }) => {
64                *range = self.range;
65            }
66            Expr::Compare(ast::ExprCompare { range, .. }) => {
67                *range = self.range;
68            }
69            Expr::Call(ast::ExprCall { range, .. }) => {
70                *range = self.range;
71            }
72            Expr::FString(ast::ExprFString { range, .. }) => {
73                *range = self.range;
74            }
75            Expr::TString(ast::ExprTString { range, .. }) => {
76                *range = self.range;
77            }
78            Expr::StringLiteral(ast::ExprStringLiteral { range, .. }) => {
79                *range = self.range;
80            }
81            Expr::BytesLiteral(ast::ExprBytesLiteral { range, .. }) => {
82                *range = self.range;
83            }
84            Expr::NumberLiteral(ast::ExprNumberLiteral { range, .. }) => {
85                *range = self.range;
86            }
87            Expr::BooleanLiteral(ast::ExprBooleanLiteral { range, .. }) => {
88                *range = self.range;
89            }
90            Expr::NoneLiteral(ast::ExprNoneLiteral { range, .. }) => {
91                *range = self.range;
92            }
93            Expr::EllipsisLiteral(ast::ExprEllipsisLiteral { range, .. }) => {
94                *range = self.range;
95            }
96            Expr::Attribute(ast::ExprAttribute { range, .. }) => {
97                *range = self.range;
98            }
99            Expr::Subscript(ast::ExprSubscript { range, .. }) => {
100                *range = self.range;
101            }
102            Expr::Starred(ast::ExprStarred { range, .. }) => {
103                *range = self.range;
104            }
105            Expr::Name(ast::ExprName { range, .. }) => {
106                *range = self.range;
107            }
108            Expr::List(ast::ExprList { range, .. }) => {
109                *range = self.range;
110            }
111            Expr::Tuple(ast::ExprTuple { range, .. }) => {
112                *range = self.range;
113            }
114            Expr::Slice(ast::ExprSlice { range, .. }) => {
115                *range = self.range;
116            }
117            Expr::IpyEscapeCommand(ast::ExprIpyEscapeCommand { range, .. }) => {
118                *range = self.range;
119            }
120        }
121        walk_expr(self, expr);
122    }
123
124    fn visit_keyword(&self, keyword: &mut Keyword) {
125        keyword.range = self.range;
126        walk_keyword(self, keyword);
127    }
128}