use syn::{
Expr,
ExprField,
ExprPath,
Ident,
};
use syn::Member::Named;
use syn::visit::{Visit, visit_expr};
use super::parser::dummy_ident;
pub struct ModelVariableVisitor {
pub idents: Vec<Ident>,
}
impl ModelVariableVisitor {
pub fn new() -> Self {
ModelVariableVisitor {
idents: vec![],
}
}
}
impl<'ast> Visit<'ast> for ModelVariableVisitor {
fn visit_expr(&mut self, expr: &'ast Expr) {
if let Expr::Field(ExprField { base: ref obj, member: ref field, .. }) = *expr {
if let Expr::Field(ExprField { base: ref expr, member: ref model_ident, .. }) = **obj {
if let Expr::Path(ExprPath { ref path, .. }) = **expr {
if let Named(ref model_ident) = *model_ident {
if path.is_ident(&dummy_ident("self")) && model_ident == "model" {
if let Named(ref field) = *field {
self.idents.push(field.clone());
}
}
}
}
}
}
visit_expr(self, expr);
}
}