about summary refs log tree commit diff
path: root/src/libsyntax/parse/lexer.rs
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2014-03-20 11:21:17 -0700
committerAlex Crichton <alex@alexcrichton.com>2014-03-20 18:51:52 -0700
commit84a91b860330c2b83fd0546b33a949079d422166 (patch)
tree1ef0a81e5d7d6c076ac9669a16fab8faa3c80b34 /src/libsyntax/parse/lexer.rs
parent4e00cf613428d24d305a89e4f8e79b70ea8e8322 (diff)
downloadrust-84a91b860330c2b83fd0546b33a949079d422166.tar.gz
rust-84a91b860330c2b83fd0546b33a949079d422166.zip
syntax: Tidy up parsing the new attribute syntax
Diffstat (limited to 'src/libsyntax/parse/lexer.rs')
-rw-r--r--src/libsyntax/parse/lexer.rs30
1 files changed, 18 insertions, 12 deletions
diff --git a/src/libsyntax/parse/lexer.rs b/src/libsyntax/parse/lexer.rs
index 061d460af5e..ca2fbd24587 100644
--- a/src/libsyntax/parse/lexer.rs
+++ b/src/libsyntax/parse/lexer.rs
@@ -18,9 +18,10 @@ use parse::token::{str_to_ident};
 
 use std::cell::{Cell, RefCell};
 use std::char;
-use std::rc::Rc;
 use std::mem::replace;
 use std::num::from_str_radix;
+use std::rc::Rc;
+use std::str;
 
 pub use ext::tt::transcribe::{TtReader, new_tt_reader};
 
@@ -272,16 +273,6 @@ pub fn bump(rdr: &StringReader) {
     }
 }
 
-// EFFECT: Peek 'n' characters ahead.
-pub fn peek(rdr: &StringReader, n: uint) -> Option<char> {
-    let offset = byte_offset(rdr, rdr.pos.get()).to_uint() + (n - 1);
-    if offset < (rdr.filemap.src).len() {
-        Some(rdr.filemap.src.char_at(offset))
-    } else {
-        None
-    }
-}
-
 pub fn is_eof(rdr: &StringReader) -> bool {
     rdr.curr.get().is_none()
 }
@@ -298,6 +289,21 @@ pub fn nextch_is(rdr: &StringReader, c: char) -> bool {
     nextch(rdr) == Some(c)
 }
 
+pub fn nextnextch(rdr: &StringReader) -> Option<char> {
+    let offset = byte_offset(rdr, rdr.pos.get()).to_uint();
+    let s = rdr.filemap.deref().src.as_slice();
+    if offset >= s.len() { return None }
+    let str::CharRange { next, .. } = s.char_range_at(offset);
+    if next < s.len() {
+        Some(s.char_at(next))
+    } else {
+        None
+    }
+}
+pub fn nextnextch_is(rdr: &StringReader, c: char) -> bool {
+    nextnextch(rdr) == Some(c)
+}
+
 fn hex_digit_val(c: Option<char>) -> int {
     let d = c.unwrap_or('\x00');
 
@@ -384,7 +390,7 @@ fn consume_any_line_comment(rdr: &StringReader)
         if nextch_is(rdr, '!') {
 
             // Parse an inner attribute.
-            if peek(rdr, 2).unwrap() == '[' {
+            if nextnextch_is(rdr, '[') {
                 return None;
             }