fxrank_lang_python/detect/
expr.rs1use libcst_native::{Expression, Name};
4
5pub fn render_expr(expr: &Expression) -> Option<String> {
9 match expr {
10 Expression::Name(n) => Some(n.value.to_owned()),
11 Expression::Attribute(a) => {
12 let base = render_expr(&a.value)?;
13 Some(format!("{base}.{}", a.attr.value))
14 }
15 _ => None,
16 }
17}
18
19pub fn leftmost_name<'a>(expr: &'a Expression<'a>) -> Option<&'a Name<'a>> {
21 match expr {
22 Expression::Name(n) => Some(n),
23 Expression::Attribute(a) => leftmost_name(&a.value),
24 Expression::Call(c) => leftmost_name(&c.func),
25 Expression::Subscript(s) => leftmost_name(&s.value),
26 Expression::Await(a) => leftmost_name(&a.expression),
27 _ => None,
28 }
29}