summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorJohn Hodge <tpg@ucc.asn.au>2017-11-19 16:59:58 +0800
committerJohn Hodge <tpg@ucc.asn.au>2017-11-19 16:59:58 +0800
commitc3644014de94c711b8233b6ca06351a17a284499 (patch)
tree06c0a1bf7fd499d76509a31100395549b3e90a29 /lib
parentf0671868e80330e8e6a23c51f67ab06bf535a273 (diff)
downloadmrust-c3644014de94c711b8233b6ca06351a17a284499.tar.gz
libproc_macro - Rough handling of char literals, handle lifetime names with leading underscores
Diffstat (limited to 'lib')
-rw-r--r--lib/libproc_macro/src/lib.rs22
1 files changed, 19 insertions, 3 deletions
diff --git a/lib/libproc_macro/src/lib.rs b/lib/libproc_macro/src/lib.rs
index 6de1140e..14cbad8c 100644
--- a/lib/libproc_macro/src/lib.rs
+++ b/lib/libproc_macro/src/lib.rs
@@ -103,7 +103,7 @@ impl ::std::fmt::Debug for LexError {
impl FromStr for TokenStream {
type Err = LexError;
fn from_str(src: &str) -> Result<TokenStream, LexError> {
- //eprintln!("TokenStream::from_str({:?})\r", src);
+ debug!("TokenStream::from_str({:?})\r", src);
let rv = Vec::new();
let mut it = CharStream::new(src.chars());
@@ -167,14 +167,30 @@ impl FromStr for TokenStream {
{
it.consume();
c = it.cur();
- if c.is_xid_start() && it.next().map(|x| x != '\'').unwrap_or(true) {
+ if (c.is_xid_start() || c == '_') && it.next().map(|x| x != '\'').unwrap_or(true) {
// Lifetime
let ident = get_ident(&mut it, String::new());
rv.push(Token::Lifetime(ident))
}
else {
// Char lit
- panic!("TODO: char literal");
+ if c == '\\' {
+ panic!("TODO: char literal with escape");
+ }
+ else {
+ rv.push(Token::CharLit(c));
+ match it.consume()
+ {
+ Some('\'') => {},
+ Some(c) => {
+ debug!("Stray charcter '{}'", c);
+ return err("Multiple characters in char literal");
+ },
+ None => {
+ return err("Unterminated char literal");
+ },
+ }
+ }
}
}
else if c == '/' && it.next() == Some('/')