summaryrefslogtreecommitdiff
path: root/vendor/rustc_lexer/src/cursor.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/rustc_lexer/src/cursor.rs')
-rw-r--r--vendor/rustc_lexer/src/cursor.rs57
1 files changed, 57 insertions, 0 deletions
diff --git a/vendor/rustc_lexer/src/cursor.rs b/vendor/rustc_lexer/src/cursor.rs
new file mode 100644
index 00000000..5831159c
--- /dev/null
+++ b/vendor/rustc_lexer/src/cursor.rs
@@ -0,0 +1,57 @@
+use std::str::Chars;
+
+pub(crate) struct Cursor<'a> {
+ initial_len: usize,
+ chars: Chars<'a>,
+ #[cfg(debug_assertions)]
+ prev: char,
+}
+
+pub(crate) const EOF_CHAR: char = '\0';
+
+impl<'a> Cursor<'a> {
+ pub(crate) fn new(input: &'a str) -> Cursor<'a> {
+ Cursor {
+ initial_len: input.len(),
+ chars: input.chars(),
+ #[cfg(debug_assertions)]
+ prev: EOF_CHAR,
+ }
+ }
+ /// For debug assertions only
+ pub(crate) fn prev(&self) -> char {
+ #[cfg(debug_assertions)]
+ {
+ self.prev
+ }
+
+ #[cfg(not(debug_assertions))]
+ {
+ '\0'
+ }
+ }
+ pub(crate) fn nth_char(&self, n: usize) -> char {
+ self.chars().nth(n).unwrap_or(EOF_CHAR)
+ }
+ pub(crate) fn is_eof(&self) -> bool {
+ self.chars.as_str().is_empty()
+ }
+ pub(crate) fn len_consumed(&self) -> usize {
+ self.initial_len - self.chars.as_str().len()
+ }
+ /// Returns an iterator over the remaining characters.
+ fn chars(&self) -> Chars<'a> {
+ self.chars.clone()
+ }
+ /// Moves to the next character.
+ pub(crate) fn bump(&mut self) -> Option<char> {
+ let c = self.chars.next()?;
+
+ #[cfg(debug_assertions)]
+ {
+ self.prev = c;
+ }
+
+ Some(c)
+ }
+}