syn_error_experiment/
lib.rs1#![doc(html_root_url = "https://docs.rs/syn-error-experiment/0.0.0")]
2
3extern crate proc_macro2;
4extern crate syn;
5
6#[cfg(feature = "proc-macro")]
7extern crate proc_macro;
8
9#[macro_use]
10pub mod token;
11
12#[macro_use]
13pub mod parse;
14
15#[macro_use]
16mod group;
17
18mod ast;
19mod error;
20mod lookahead;
21
22pub use ast::*;
23pub use proc_macro2::Ident;
24
25#[doc(hidden)]
27pub mod export;
28
29use std::str::FromStr;
30
31use proc_macro2::Span;
32use syn::buffer::TokenBuffer;
33
34use parse::{Parse, ParseBuffer, Result};
35
36#[cfg(feature = "proc-macro")]
38pub fn parse<T: Parse>(input: proc_macro::TokenStream) -> Result<T> {
39 parse2(proc_macro2::TokenStream::from(input))
40}
41
42pub fn parse2<T: Parse>(input: proc_macro2::TokenStream) -> Result<T> {
44 let buf = TokenBuffer::new2(input);
45 let state = ParseBuffer::new(Span::call_site(), buf.begin());
46 T::parse(&state)
47}
48
49pub fn parse_str<T: Parse>(input: &str) -> Result<T> {
51 let tokens = proc_macro2::TokenStream::from_str(input)?;
52 parse2(tokens)
53}
54
55#[cfg(feature = "proc-macro")]
92#[macro_export]
93macro_rules! parse_macro_input {
94 ($tokenstream:ident as $ty:ty) => {
95 match $crate::parse::<$ty>($tokenstream) {
96 $crate::export::Ok(data) => data,
97 $crate::export::Err(err) => {
98 return $crate::export::TokenStream::from(err.into_compile_error());
99 }
100 };
101 };
102}