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 {
70                range_start,
71                arguments,
72                ..
73            }) => {
74                *range_start = self.range.start();
75                arguments.range = self.range;
76            }
77            Expr::FString(ast::ExprFString { range, .. }) => {
78                *range = self.range;
79            }
80            Expr::TString(ast::ExprTString { range, .. }) => {
81                *range = self.range;
82            }
83            Expr::StringLiteral(ast::ExprStringLiteral { range, .. }) => {
84                *range = self.range;
85            }
86            Expr::BytesLiteral(ast::ExprBytesLiteral { range, .. }) => {
87                *range = self.range;
88            }
89            Expr::NumberLiteral(ast::ExprNumberLiteral { range, .. }) => {
90                *range = self.range;
91            }
92            Expr::BooleanLiteral(ast::ExprBooleanLiteral { range, .. }) => {
93                *range = self.range;
94            }
95            Expr::NoneLiteral(ast::ExprNoneLiteral { range, .. }) => {
96                *range = self.range;
97            }
98            Expr::EllipsisLiteral(ast::ExprEllipsisLiteral { range, .. }) => {
99                *range = self.range;
100            }
101            Expr::Attribute(ast::ExprAttribute { range, .. }) => {
102                *range = self.range;
103            }
104            Expr::Subscript(ast::ExprSubscript { range, .. }) => {
105                *range = self.range;
106            }
107            Expr::Starred(ast::ExprStarred { range, .. }) => {
108                *range = self.range;
109            }
110            Expr::Name(ast::ExprName { range, .. }) => {
111                *range = self.range;
112            }
113            Expr::List(ast::ExprList { range, .. }) => {
114                *range = self.range;
115            }
116            Expr::Tuple(ast::ExprTuple { range, .. }) => {
117                *range = self.range;
118            }
119            Expr::Slice(ast::ExprSlice { range, .. }) => {
120                *range = self.range;
121            }
122            Expr::IpyEscapeCommand(ast::ExprIpyEscapeCommand { range, .. }) => {
123                *range = self.range;
124            }
125        }
126        walk_expr(self, expr);
127    }
128
129    fn visit_keyword(&self, keyword: &mut Keyword) {
130        keyword.range = self.range;
131        walk_keyword(self, keyword);
132    }
133}