...It offers rich data structures, fine-grained parsing, span tracking (for error reporting), traversal and mutation APIs (visit, fold, visit_mut), printing back to tokens, and strong feature-gating so you only compile what you need. The documentation emphasises that while the crate is geared for procedural macros (and custom derives), some of the APIs may be of more general use. Using syn you can effectively write code that analyzes or generates Rust code at compile time.