ruff_python_ast/
relocate.rs1use ruff_text_size::TextRange;
2
3use crate::visitor::transformer::{Transformer, walk_expr, walk_keyword};
4use crate::{self as ast};
5use crate::{Expr, Keyword};
6
7pub 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}