blob: 67cdbe6ab4f6c98bcbaaa2fa8fe6f81bdca9b576 [file] [log] [blame]
Alex Crichton44bffbc2017-05-19 17:51:59 -07001extern crate proc_macro;
2
3#[macro_use]
4extern crate synom;
5
6use std::fmt;
7use std::ops;
8use std::str::FromStr;
9use std::iter::FromIterator;
10
11#[path = "stable.rs"]
12mod imp;
13
14#[derive(Clone)]
15pub struct TokenStream(imp::TokenStream);
16
17#[derive(Debug)]
18pub struct LexError(imp::LexError);
19
20impl FromStr for TokenStream {
21 type Err = LexError;
22
23 fn from_str(src: &str) -> Result<TokenStream, LexError> {
24 match src.parse() {
25 Ok(e) => Ok(TokenStream(e)),
26 Err(e) => Err(LexError(e)),
27 }
28 }
29}
30
31impl fmt::Display for TokenStream {
32 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
33 self.0.fmt(f)
34 }
35}
36
37impl From<proc_macro::TokenStream> for TokenStream {
38 fn from(inner: proc_macro::TokenStream) -> TokenStream {
39 TokenStream(inner.into())
40 }
41}
42
43impl From<TokenStream> for proc_macro::TokenStream {
44 fn from(inner: TokenStream) -> proc_macro::TokenStream {
45 inner.0.into()
46 }
47}
48
49impl From<TokenTree> for TokenStream {
50 fn from(tree: TokenTree) -> TokenStream {
51 TokenStream(tree.into())
52 }
53}
54
55impl From<TokenKind> for TokenStream {
56 fn from(kind: TokenKind) -> TokenStream {
57 TokenTree::from(kind).into()
58 }
59}
60
61impl<T: Into<TokenStream>> FromIterator<T> for TokenStream {
62 fn from_iter<I: IntoIterator<Item = T>>(streams: I) -> Self {
63 TokenStream(streams.into_iter().map(|t| t.into().0).collect())
64 }
65}
66
67impl IntoIterator for TokenStream {
68 type Item = TokenTree;
69 type IntoIter = TokenIter;
70
71 fn into_iter(self) -> TokenIter {
72 TokenIter(self.0.into_iter())
73 }
74}
75
76impl TokenStream {
77 pub fn empty() -> TokenStream {
78 TokenStream(imp::TokenStream::empty())
79 }
80
81 pub fn is_empty(&self) -> bool {
82 self.0.is_empty()
83 }
84}
85
86#[derive(Copy, Clone)]
87pub struct Span(imp::Span);
88
89impl Default for Span {
90 fn default() -> Span {
91 Span(imp::Span::default())
92 }
93}
94
95impl Span {
96 pub fn call_site() -> Span {
97 Span(imp::Span::call_site())
98 }
99}
100
101#[derive(Clone)]
102pub struct TokenTree {
103 pub span: Span,
104 pub kind: TokenKind,
105}
106
107impl From<TokenKind> for TokenTree {
108 fn from(kind: TokenKind) -> TokenTree {
109 TokenTree {
110 span: Span::default(),
111 kind: kind,
112 }
113 }
114}
115
116impl fmt::Display for TokenTree {
117 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
118 TokenStream::from(self.clone()).fmt(f)
119 }
120}
121
122#[derive(Clone)]
123pub enum TokenKind {
124 Sequence(Delimiter, TokenStream),
125 Word(Symbol),
126 Op(char, OpKind),
127 Literal(Literal),
128}
129
130#[derive(Copy, Clone)]
131pub enum Delimiter {
132 Parenthesis,
133 Brace,
134 Bracket,
135 None,
136}
137
138#[derive(Copy, Clone)]
139pub struct Symbol(imp::Symbol);
140
141impl<'a> From<&'a str> for Symbol {
142 fn from(string: &'a str) -> Symbol {
143 Symbol(string.into())
144 }
145}
146
Alex Crichton852d53d2017-05-19 19:25:08 -0700147impl From<String> for Symbol {
148 fn from(string: String) -> Symbol {
149 Symbol(string[..].into())
150 }
151}
152
Alex Crichton44bffbc2017-05-19 17:51:59 -0700153impl ops::Deref for Symbol {
154 type Target = str;
155
156 fn deref(&self) -> &str {
157 &self.0
158 }
159}
160
161#[derive(Copy, Clone)]
162pub enum OpKind {
163 Alone,
164 Joint,
165}
166
167#[derive(Clone)]
168pub struct Literal(imp::Literal);
169
170impl fmt::Display for Literal {
171 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
172 self.0.fmt(f)
173 }
174}
175
Alex Crichton852d53d2017-05-19 19:25:08 -0700176impl Literal {
177 pub fn bytestring(s: &[u8]) -> Literal {
178 Literal(imp::Literal::bytestring(s))
179 }
180}
181
Alex Crichton44bffbc2017-05-19 17:51:59 -0700182macro_rules! tys {
183 ($($t:ty,)*) => {$(
184 impl<'a> From<$t> for Literal {
185 fn from(t: $t) -> Literal {
186 Literal(t.into())
187 }
188 }
189 )*}
190}
191
192tys! {
Alex Crichton852d53d2017-05-19 19:25:08 -0700193 u8, u16, u32, u64, usize,
194 i8, i16, i32, i64, isize,
195 f32, f64, char, &'a str, bool,
Alex Crichton44bffbc2017-05-19 17:51:59 -0700196}
197
198pub struct TokenIter(imp::TokenIter);
199
200impl Iterator for TokenIter {
201 type Item = TokenTree;
202
203 fn next(&mut self) -> Option<TokenTree> {
204 self.0.next()
205 }
206}