#syntax-tree #ide #replace #edit #search #write #syn

synsert

A primitive for writing structural search and replace programs for rust

2 releases

0.1.1 Jul 12, 2024
0.1.0 Oct 5, 2023

#258 in Procedural macros

MIT/Apache

21KB
231 lines

A primitive for programatically editing files using [syn].

syn is the de-facto standard for parsing Rust. Its syntax tree is easy to use, but it is lossy - if you parse a file, edit it with syn, and unparse it, you'll lose all your comments and spacing (for example).

Rust Analyzer's syntax crate has a lossless syntax tree, which powers IDE assists, but it's far more difficult to use.

Editor allows you to use syn's syntax tree to write your Structured Search and Replace tools, or IDE assists.

let source_code = "const NUM: usize = 1;"; // get the source text

// create an AST and a helper struct from the same source code
let (mut editor, ast) = synsert::Editor::new_with_ast::<syn::ItemConst>(source_code).unwrap();

let edited = editor
    .append(ast.ident, "_YAKS")
    .replace(ast.expr, "9001")
    .finish();

assert_eq!(edited, "const NUM_YAKS: usize = 9001;");

See the examples for a more in-depth case using a syn::visit::Visitor

Dependencies

~5–12MB
~140K SLoC