Prepare more for new proc_macro API
* Move storage of `Span` information on `Literal` and `Term` into the
stable/unstable layers as the unstable one will soon encompass this
* Remove `PartialEq` for `Span` as it's being replaced by an `eq` method.
diff --git a/src/stable.rs b/src/stable.rs
index b04e4ca..8741d51 100644
--- a/src/stable.rs
+++ b/src/stable.rs
@@ -8,7 +8,6 @@
use std::collections::HashMap;
use std::fmt;
use std::iter;
-use std::marker::PhantomData;
use std::rc::Rc;
use std::str::FromStr;
use std::vec;
@@ -105,13 +104,7 @@
Spacing::Joint => joint = true,
}
}
- TokenTree::Literal(ref tt) => {
- write!(f, "{}", tt)?;
- // handle comments
- if tt.inner.0.starts_with("/") {
- write!(f, "\n")?;
- }
- }
+ TokenTree::Literal(ref tt) => write!(f, "{}", tt)?,
}
}
@@ -404,16 +397,16 @@
#[derive(Copy, Clone)]
pub struct Term {
intern: usize,
- not_send_sync: PhantomData<*const ()>,
+ span: Span,
}
thread_local!(static SYMBOLS: RefCell<Interner> = RefCell::new(Interner::new()));
impl Term {
- pub fn intern(string: &str) -> Term {
+ pub fn new(string: &str, span: Span) -> Term {
Term {
intern: SYMBOLS.with(|s| s.borrow_mut().intern(string)),
- not_send_sync: PhantomData,
+ span,
}
}
@@ -424,6 +417,14 @@
unsafe { &*(s as *const str) }
})
}
+
+ pub fn span(&self) -> Span {
+ self.span
+ }
+
+ pub fn set_span(&mut self, span: Span) {
+ self.span = span;
+ }
}
impl fmt::Debug for Term {
@@ -471,18 +472,28 @@
}
#[derive(Clone, Debug)]
-pub struct Literal(String);
+pub struct Literal {
+ text: String,
+ span: Span,
+}
impl Literal {
+ fn _new(text: String) -> Literal {
+ Literal {
+ text,
+ span: Span::call_site(),
+ }
+ }
+
pub fn byte_char(byte: u8) -> Literal {
match byte {
- 0 => Literal(format!("b'\\0'")),
- b'\"' => Literal(format!("b'\"'")),
+ 0 => Literal::_new(format!("b'\\0'")),
+ b'\"' => Literal::_new(format!("b'\"'")),
n => {
let mut escaped = "b'".to_string();
escaped.extend(ascii::escape_default(n).map(|c| c as char));
escaped.push('\'');
- Literal(escaped)
+ Literal::_new(escaped)
}
}
}
@@ -502,11 +513,7 @@
}
}
escaped.push('"');
- Literal(escaped)
- }
-
- pub fn doccomment(s: &str) -> Literal {
- Literal(s.to_string())
+ Literal::_new(escaped)
}
pub fn float(n: f64) -> Literal {
@@ -517,37 +524,25 @@
if !s.contains('.') {
s += ".0";
}
- Literal(s)
+ Literal::_new(s)
}
pub fn integer(s: i64) -> Literal {
- Literal(s.to_string())
+ Literal::_new(s.to_string())
}
- pub fn raw_string(s: &str, pounds: usize) -> Literal {
- let mut ret = format!("r");
- ret.extend((0..pounds).map(|_| "#"));
- ret.push('"');
- ret.push_str(s);
- ret.push('"');
- ret.extend((0..pounds).map(|_| "#"));
- Literal(ret)
+ pub fn span(&self) -> Span {
+ self.span
}
- pub fn raw_byte_string(s: &str, pounds: usize) -> Literal {
- let mut ret = format!("br");
- ret.extend((0..pounds).map(|_| "#"));
- ret.push('"');
- ret.push_str(s);
- ret.push('"');
- ret.extend((0..pounds).map(|_| "#"));
- Literal(ret)
+ pub fn set_span(&mut self, span: Span) {
+ self.span = span;
}
}
impl fmt::Display for Literal {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- self.0.fmt(f)
+ self.text.fmt(f)
}
}
@@ -555,7 +550,7 @@
($($t:ty,)*) => {$(
impl From<$t> for Literal {
fn from(t: $t) -> Literal {
- Literal(format!(concat!("{}", stringify!($t)), t))
+ Literal::_new(format!(concat!("{}", stringify!($t)), t))
}
}
)*}
@@ -572,7 +567,7 @@
fn from(t: $t) -> Literal {
assert!(!t.is_nan());
assert!(!t.is_infinite());
- Literal(format!(concat!("{}", stringify!($t)), t))
+ Literal::_new(format!(concat!("{}", stringify!($t)), t))
}
}
)*}
@@ -589,13 +584,13 @@
.collect::<String>();
s.push('"');
s.insert(0, '"');
- Literal(s)
+ Literal::_new(s)
}
}
impl From<char> for Literal {
fn from(t: char) -> Literal {
- Literal(format!("'{}'", t.escape_default().collect::<String>()))
+ Literal::_new(format!("'{}'", t.escape_default().collect::<String>()))
}
}
@@ -710,7 +705,7 @@
let end = start + len;
Ok((
a,
- ::Literal::_new(Literal(input.rest[start..end].to_string())),
+ ::Literal::_new(Literal::_new(input.rest[start..end].to_string())),
))
}
Err(LexError) => Err(LexError),