Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/parser/src/input.rs')
-rw-r--r--crates/parser/src/input.rs18
1 files changed, 13 insertions, 5 deletions
diff --git a/crates/parser/src/input.rs b/crates/parser/src/input.rs
index 331bc58dd0..57eeb431cd 100644
--- a/crates/parser/src/input.rs
+++ b/crates/parser/src/input.rs
@@ -1,5 +1,7 @@
//! See [`Input`].
+use edition::Edition;
+
use crate::SyntaxKind;
#[allow(non_camel_case_types)]
@@ -16,6 +18,7 @@ pub struct Input {
kind: Vec<SyntaxKind>,
joint: Vec<bits>,
contextual_kind: Vec<SyntaxKind>,
+ edition: Vec<Edition>,
}
/// `pub` impl used by callers to create `Tokens`.
@@ -26,15 +29,16 @@ impl Input {
kind: Vec::with_capacity(capacity),
joint: Vec::with_capacity(capacity / size_of::<bits>()),
contextual_kind: Vec::with_capacity(capacity),
+ edition: Vec::with_capacity(capacity),
}
}
#[inline]
- pub fn push(&mut self, kind: SyntaxKind) {
- self.push_impl(kind, SyntaxKind::EOF)
+ pub fn push(&mut self, kind: SyntaxKind, edition: Edition) {
+ self.push_impl(kind, SyntaxKind::EOF, edition)
}
#[inline]
- pub fn push_ident(&mut self, contextual_kind: SyntaxKind) {
- self.push_impl(SyntaxKind::IDENT, contextual_kind)
+ pub fn push_ident(&mut self, contextual_kind: SyntaxKind, edition: Edition) {
+ self.push_impl(SyntaxKind::IDENT, contextual_kind, edition)
}
/// Sets jointness for the last token we've pushed.
///
@@ -59,13 +63,14 @@ impl Input {
self.joint[idx] |= 1 << b_idx;
}
#[inline]
- fn push_impl(&mut self, kind: SyntaxKind, contextual_kind: SyntaxKind) {
+ fn push_impl(&mut self, kind: SyntaxKind, contextual_kind: SyntaxKind, edition: Edition) {
let idx = self.len();
if idx.is_multiple_of(bits::BITS as usize) {
self.joint.push(0);
}
self.kind.push(kind);
self.contextual_kind.push(contextual_kind);
+ self.edition.push(edition);
}
}
@@ -77,6 +82,9 @@ impl Input {
pub(crate) fn contextual_kind(&self, idx: usize) -> SyntaxKind {
self.contextual_kind.get(idx).copied().unwrap_or(SyntaxKind::EOF)
}
+ pub(crate) fn edition(&self, idx: usize) -> Edition {
+ self.edition[idx]
+ }
pub(crate) fn is_joint(&self, n: usize) -> bool {
let (idx, b_idx) = self.bit_index(n);
self.joint[idx] & (1 << b_idx) != 0