summaryrefslogtreecommitdiff
path: root/src/syntax
diff options
context:
space:
mode:
Diffstat (limited to 'src/syntax')
-rw-r--r--src/syntax/mod.rs66
1 files changed, 25 insertions, 41 deletions
diff --git a/src/syntax/mod.rs b/src/syntax/mod.rs
index c1d7b8d3..d6658fd3 100644
--- a/src/syntax/mod.rs
+++ b/src/syntax/mod.rs
@@ -94,7 +94,7 @@ impl Green {
replace: Span,
replacement_len: usize,
offset: usize,
- parent_mode: NodeMode,
+ parent_mode: TokenMode,
outermost: bool,
) -> bool {
match self {
@@ -221,7 +221,7 @@ impl GreenNode {
return false;
}
- self.incremental_int(src, replace, replacement_len, 0, NodeMode::Markup, true)
+ self.incremental_int(src, replace, replacement_len, 0, TokenMode::Markup, true)
}
fn incremental_int(
@@ -230,11 +230,11 @@ impl GreenNode {
replace: Span,
replacement_len: usize,
mut offset: usize,
- parent_mode: NodeMode,
+ parent_mode: TokenMode,
outermost: bool,
) -> bool {
let kind = self.kind().clone();
- let mode = kind.mode().apply(parent_mode);
+ let mode = kind.mode().contextualize(parent_mode);
eprintln!("in {:?} (mode {:?})", kind, mode);
let mut loop_result = None;
@@ -266,15 +266,11 @@ impl GreenNode {
// This didn't work, so we try to replace the child at this
// level.
- let (function, policy) = match child
- .kind()
- .reparsing_function(mode.child_mode().as_token_mode())
- {
- Ok(p) => p,
- _ => {
- return false;
- }
- };
+ let (function, policy) =
+ match child.kind().reparsing_function(kind.mode().child_mode()) {
+ Ok(p) => p,
+ _ => return false,
+ };
loop_result =
Some((i, child_span, i == last && outermost, function, policy));
break;
@@ -320,8 +316,7 @@ impl GreenNode {
eprintln!("function failed");
return false;
};
- let child_mode =
- self.children[child_idx].kind().mode().child_mode().as_token_mode();
+ let child_mode = self.children[child_idx].kind().mode().child_mode();
eprintln!("child mode {:?}", child_mode);
// Check if the children / child has the right type.
@@ -365,7 +360,7 @@ impl GreenNode {
}
// Check if the neighbor invariants are still true.
- if mode.as_token_mode() == TokenMode::Markup {
+ if mode == TokenMode::Markup {
if child_idx > 0 {
if self.children[child_idx - 1].kind().incremental_safety()
== IncrementalSafety::EnsureRightWhitespace
@@ -1023,10 +1018,10 @@ impl NodeKind {
return Err(policy);
}
- let mode = self.mode();
- let is_code = mode == NodeMode::Universal && parent_mode == TokenMode::Code
- || mode == NodeMode::Code;
- if mode == NodeMode::Code && policy == IncrementalSafety::UnsafeLayer {
+ let contextualized = self.mode().contextualize(parent_mode);
+ let is_code = contextualized == TokenMode::Code;
+
+ if is_code && policy == IncrementalSafety::UnsafeLayer {
return Err(policy);
}
@@ -1047,12 +1042,9 @@ impl NodeKind {
return Ok((parser, policy));
}
- let parser: fn(&str, bool) -> _ = match mode {
- NodeMode::Markup if self == &Self::Markup => parse_markup,
- NodeMode::Markup => parse_markup_elements,
- NodeMode::Universal if parent_mode == TokenMode::Markup => {
- parse_markup_elements
- }
+ let parser: fn(&str, bool) -> _ = match contextualized {
+ TokenMode::Markup if self == &Self::Markup => parse_markup,
+ TokenMode::Markup => parse_markup_elements,
_ => return Err(policy),
};
@@ -1403,28 +1395,20 @@ pub enum NodeMode {
impl NodeMode {
/// Returns a new mode considering the parent node.
- pub fn apply(&self, old: Self) -> Self {
- match self {
- Self::Markup => Self::Markup,
- Self::Code => Self::Code,
- Self::Universal if old != Self::Markup => Self::Code,
- Self::Universal => Self::Universal,
- }
- }
-
- /// Return the corresponding token mode.
- pub fn as_token_mode(&self) -> TokenMode {
+ pub fn contextualize(&self, old: TokenMode) -> TokenMode {
match self {
- Self::Markup | Self::Universal => TokenMode::Markup,
+ Self::Markup => TokenMode::Markup,
Self::Code => TokenMode::Code,
+ Self::Universal if old != TokenMode::Markup => TokenMode::Code,
+ Self::Universal => TokenMode::Markup,
}
}
/// The mode of the children of this node.
- pub fn child_mode(&self) -> Self {
+ pub fn child_mode(&self) -> TokenMode {
match self {
- Self::Markup => Self::Markup,
- Self::Code | Self::Universal => Self::Code,
+ Self::Markup => TokenMode::Markup,
+ Self::Code | Self::Universal => TokenMode::Code,
}
}
}