You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: macros.rs
    path of file: ./repos/c2rust/c2rust-refactor/src/collapse
    
    the code of the file until where you have to start completion: //! Handles collapsing of macros, turning `std::io::_print(...)` into `println!(...)` and so on.
//!
//! This also computes edges to add to `NodeMap`.  Most of these are identity edges (mapping each
//! node's `x.id -> x.id`), but in cases where nonterminals get merged we do something a bit more
//! interesting (see `token_rewrite_map` for details).  Edges for different categories of nodes get
//! added in different places: macro invocations in `CollapseMac
    
    fn visit_expr(&mut self, e: &mut P<Expr>) {
        if let Some(invoc_id) = self.mac_table.get(e.id).map(|m| m.id) {
            if let Some(new_args) = self.new_args.get(&invoc_id).cloned() {
                // NB: Don't walk, so we never run `self.new_id` on `e.id`.  matched_ids entries
                // for macro invocations get handled by the CollapseMacros pass.
                expect!([e.kind] ExprKind::Mac(ref mut mac) => *mac.args = new_args);
            }
        }
        mut_visit::noop_visit_expr(e, self)
    }