Skip to content

Commit 22074af

Browse files
authored
Merge pull request #18847 from github/redsun82/rust-trait-path
Rust: fix `<X as Y>` path extraction
2 parents 8ef2029 + d8dad7d commit 22074af

25 files changed

+282
-272
lines changed

rust/ast-generator/src/main.rs

+139-165
Original file line numberDiff line numberDiff line change
@@ -166,213 +166,187 @@ struct FieldInfo {
166166
name: String,
167167
ty: FieldType,
168168
}
169-
fn get_fields(node: &AstNodeSrc) -> Vec<FieldInfo> {
170-
let mut result = Vec::new();
171-
let predicates = [
172-
"async", "auto", "const", "default", "gen", "move", "mut", "raw", "ref", "static", "try",
173-
"unsafe",
174-
];
175-
for field in &node.fields {
176-
if let Field::Token(name) = field {
177-
if predicates.contains(&name.as_str()) {
178-
result.push(FieldInfo {
179-
name: format!("is_{name}"),
180-
ty: FieldType::Predicate,
181-
});
182-
}
183-
}
184-
}
185169

170+
fn get_additional_fields(node: &AstNodeSrc) -> Vec<FieldInfo> {
186171
match node.name.as_str() {
187-
"Name" | "NameRef" | "Lifetime" => {
188-
result.push(FieldInfo {
189-
name: "text".to_string(),
190-
ty: FieldType::String,
191-
});
192-
}
193-
"Abi" => {
194-
result.push(FieldInfo {
195-
name: "abi_string".to_string(),
196-
ty: FieldType::String,
197-
});
198-
}
199-
"Literal" => {
200-
result.push(FieldInfo {
201-
name: "text_value".to_string(),
202-
ty: FieldType::String,
203-
});
204-
}
205-
"PrefixExpr" => {
206-
result.push(FieldInfo {
207-
name: "operator_name".to_string(),
208-
ty: FieldType::String,
209-
});
210-
}
211-
"BinExpr" => {
212-
result.push(FieldInfo {
172+
"Name" | "NameRef" | "Lifetime" => vec![FieldInfo {
173+
name: "text".to_string(),
174+
ty: FieldType::String,
175+
}],
176+
"Abi" => vec![FieldInfo {
177+
name: "abi_string".to_string(),
178+
ty: FieldType::String,
179+
}],
180+
"Literal" => vec![FieldInfo {
181+
name: "text_value".to_string(),
182+
ty: FieldType::String,
183+
}],
184+
"PrefixExpr" => vec![FieldInfo {
185+
name: "operator_name".to_string(),
186+
ty: FieldType::String,
187+
}],
188+
"BinExpr" => vec![
189+
FieldInfo {
213190
name: "lhs".to_string(),
214191
ty: FieldType::Optional("Expr".to_string()),
215-
});
216-
result.push(FieldInfo {
192+
},
193+
FieldInfo {
217194
name: "rhs".to_string(),
218195
ty: FieldType::Optional("Expr".to_string()),
219-
});
220-
result.push(FieldInfo {
196+
},
197+
FieldInfo {
221198
name: "operator_name".to_string(),
222199
ty: FieldType::String,
223-
});
224-
}
225-
"IfExpr" => {
226-
result.push(FieldInfo {
200+
},
201+
],
202+
"IfExpr" => vec![
203+
FieldInfo {
227204
name: "then_branch".to_string(),
228205
ty: FieldType::Optional("BlockExpr".to_string()),
229-
});
230-
result.push(FieldInfo {
206+
},
207+
FieldInfo {
231208
name: "else_branch".to_string(),
232209
ty: FieldType::Optional("ElseBranch".to_string()),
233-
});
234-
result.push(FieldInfo {
210+
},
211+
FieldInfo {
235212
name: "condition".to_string(),
236213
ty: FieldType::Optional("Expr".to_string()),
237-
});
238-
}
239-
"RangeExpr" => {
240-
result.push(FieldInfo {
214+
},
215+
],
216+
"RangeExpr" => vec![
217+
FieldInfo {
241218
name: "start".to_string(),
242219
ty: FieldType::Optional("Expr".to_string()),
243-
});
244-
result.push(FieldInfo {
220+
},
221+
FieldInfo {
245222
name: "end".to_string(),
246223
ty: FieldType::Optional("Expr".to_string()),
247-
});
248-
result.push(FieldInfo {
224+
},
225+
FieldInfo {
249226
name: "operator_name".to_string(),
250227
ty: FieldType::String,
251-
});
252-
}
253-
"RangePat" => {
254-
result.push(FieldInfo {
228+
},
229+
],
230+
"RangePat" => vec![
231+
FieldInfo {
255232
name: "start".to_string(),
256233
ty: FieldType::Optional("Pat".to_string()),
257-
});
258-
result.push(FieldInfo {
234+
},
235+
FieldInfo {
259236
name: "end".to_string(),
260237
ty: FieldType::Optional("Pat".to_string()),
261-
});
262-
result.push(FieldInfo {
238+
},
239+
FieldInfo {
263240
name: "operator_name".to_string(),
264241
ty: FieldType::String,
265-
});
266-
}
267-
"IndexExpr" => {
268-
result.push(FieldInfo {
242+
},
243+
],
244+
"IndexExpr" => vec![
245+
FieldInfo {
269246
name: "index".to_string(),
270247
ty: FieldType::Optional("Expr".to_string()),
271-
});
272-
result.push(FieldInfo {
248+
},
249+
FieldInfo {
273250
name: "base".to_string(),
274251
ty: FieldType::Optional("Expr".to_string()),
275-
});
276-
}
277-
"Impl" => {
278-
result.push(FieldInfo {
252+
},
253+
],
254+
"Impl" => vec![
255+
FieldInfo {
279256
name: "trait_".to_string(),
280257
ty: FieldType::Optional("Type".to_string()),
281-
});
282-
result.push(FieldInfo {
258+
},
259+
FieldInfo {
283260
name: "self_ty".to_string(),
284261
ty: FieldType::Optional("Type".to_string()),
285-
});
286-
}
287-
"ForExpr" => {
288-
result.push(FieldInfo {
289-
name: "iterable".to_string(),
290-
ty: FieldType::Optional("Expr".to_string()),
291-
});
292-
}
293-
"WhileExpr" => {
294-
result.push(FieldInfo {
295-
name: "condition".to_string(),
296-
ty: FieldType::Optional("Expr".to_string()),
297-
});
298-
}
299-
"MatchGuard" => {
300-
result.push(FieldInfo {
301-
name: "condition".to_string(),
302-
ty: FieldType::Optional("Expr".to_string()),
303-
});
304-
}
305-
"MacroDef" => {
306-
result.push(FieldInfo {
262+
},
263+
],
264+
"ForExpr" => vec![FieldInfo {
265+
name: "iterable".to_string(),
266+
ty: FieldType::Optional("Expr".to_string()),
267+
}],
268+
"WhileExpr" => vec![FieldInfo {
269+
name: "condition".to_string(),
270+
ty: FieldType::Optional("Expr".to_string()),
271+
}],
272+
"MatchGuard" => vec![FieldInfo {
273+
name: "condition".to_string(),
274+
ty: FieldType::Optional("Expr".to_string()),
275+
}],
276+
"MacroDef" => vec![
277+
FieldInfo {
307278
name: "args".to_string(),
308279
ty: FieldType::Optional("TokenTree".to_string()),
309-
});
310-
result.push(FieldInfo {
280+
},
281+
FieldInfo {
311282
name: "body".to_string(),
312283
ty: FieldType::Optional("TokenTree".to_string()),
313-
});
314-
}
315-
"FormatArgsExpr" => {
316-
result.push(FieldInfo {
317-
name: "args".to_string(),
318-
ty: FieldType::List("FormatArgsArg".to_string()),
319-
});
320-
}
321-
"ArgList" => {
322-
result.push(FieldInfo {
323-
name: "args".to_string(),
324-
ty: FieldType::List("Expr".to_string()),
325-
});
326-
}
327-
"Fn" => {
328-
result.push(FieldInfo {
329-
name: "body".to_string(),
330-
ty: FieldType::Optional("BlockExpr".to_string()),
331-
});
332-
}
333-
"Const" => {
334-
result.push(FieldInfo {
335-
name: "body".to_string(),
336-
ty: FieldType::Optional("Expr".to_string()),
337-
});
338-
}
339-
"Static" => {
340-
result.push(FieldInfo {
341-
name: "body".to_string(),
342-
ty: FieldType::Optional("Expr".to_string()),
343-
});
344-
}
345-
"ClosureExpr" => {
346-
result.push(FieldInfo {
347-
name: "body".to_string(),
348-
ty: FieldType::Optional("Expr".to_string()),
349-
});
350-
}
351-
"ArrayExpr" => {
352-
result.push(FieldInfo {
353-
name: "is_semicolon".to_string(),
354-
ty: FieldType::Predicate,
355-
});
356-
}
357-
"SelfParam" => {
358-
result.push(FieldInfo {
359-
name: "is_amp".to_string(),
360-
ty: FieldType::Predicate,
361-
});
362-
}
363-
"UseTree" => {
364-
result.push(FieldInfo {
365-
name: "is_star".to_string(),
366-
ty: FieldType::Predicate,
367-
});
284+
},
285+
],
286+
"FormatArgsExpr" => vec![FieldInfo {
287+
name: "args".to_string(),
288+
ty: FieldType::List("FormatArgsArg".to_string()),
289+
}],
290+
"ArgList" => vec![FieldInfo {
291+
name: "args".to_string(),
292+
ty: FieldType::List("Expr".to_string()),
293+
}],
294+
"Fn" => vec![FieldInfo {
295+
name: "body".to_string(),
296+
ty: FieldType::Optional("BlockExpr".to_string()),
297+
}],
298+
"Const" => vec![FieldInfo {
299+
name: "body".to_string(),
300+
ty: FieldType::Optional("Expr".to_string()),
301+
}],
302+
"Static" => vec![FieldInfo {
303+
name: "body".to_string(),
304+
ty: FieldType::Optional("Expr".to_string()),
305+
}],
306+
"ClosureExpr" => vec![FieldInfo {
307+
name: "body".to_string(),
308+
ty: FieldType::Optional("Expr".to_string()),
309+
}],
310+
"ArrayExpr" => vec![FieldInfo {
311+
name: "is_semicolon".to_string(),
312+
ty: FieldType::Predicate,
313+
}],
314+
"SelfParam" => vec![FieldInfo {
315+
name: "is_amp".to_string(),
316+
ty: FieldType::Predicate,
317+
}],
318+
"UseTree" => vec![FieldInfo {
319+
name: "is_star".to_string(),
320+
ty: FieldType::Predicate,
321+
}],
322+
_ => vec![],
323+
}
324+
}
325+
fn get_fields(node: &AstNodeSrc) -> Vec<FieldInfo> {
326+
let mut result = Vec::new();
327+
let predicates = [
328+
"async", "auto", "const", "default", "gen", "move", "mut", "raw", "ref", "static", "try",
329+
"unsafe",
330+
];
331+
for field in &node.fields {
332+
if let Field::Token(name) = field {
333+
if predicates.contains(&name.as_str()) {
334+
result.push(FieldInfo {
335+
name: format!("is_{name}"),
336+
ty: FieldType::Predicate,
337+
});
338+
}
368339
}
369-
_ => {}
370340
}
371341

342+
result.extend(get_additional_fields(node));
343+
372344
for field in &node.fields {
373-
// The ArrayExpr type also has an 'exprs' field
374-
if node.name == "ArrayExpr" && field.method_name() == "expr" {
375-
continue;
345+
match (node.name.as_str(), field.method_name().as_str()) {
346+
("ArrayExpr", "expr") // The ArrayExpr type also has an 'exprs' field
347+
| ("PathSegment", "ty" | "path_type") // these are broken, handling them manually
348+
=> continue,
349+
_ => {}
376350
}
377351
let ty = match field {
378352
Field::Token(_) => continue,

rust/extractor/src/generated/.generated.list

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust/extractor/src/generated/top.rs

+9-8
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)