A poorly documented invariant about node ids is that all operations that can be overloaded have an extra node id allocated before them, to provide a node id to hang information about the overloaded function. (See ast_util::op_expr_callee_id). Generators of syntax trees need to respect this invariant, but the syntax extension build facilities don't.