summaryrefslogtreecommitdiff
path: root/src/source.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/source.rs')
-rw-r--r--src/source.rs52
1 files changed, 22 insertions, 30 deletions
diff --git a/src/source.rs b/src/source.rs
index 069edd29..2d18ece3 100644
--- a/src/source.rs
+++ b/src/source.rs
@@ -2,7 +2,7 @@
use std::collections::HashMap;
use std::io;
-use std::ops::Range;
+use std::ops::{Not, Range};
use std::path::{Path, PathBuf};
use std::rc::Rc;
@@ -10,9 +10,9 @@ use serde::{Deserialize, Serialize};
use crate::diag::TypResult;
use crate::loading::{FileHash, Loader};
-use crate::parse::{is_newline, parse, Scanner};
+use crate::parse::{is_newline, parse, parse_block, Scanner};
use crate::syntax::ast::Markup;
-use crate::syntax::{self, Category, GreenNode, RedNode};
+use crate::syntax::{self, Category, GreenNode, NodeKind, RedNode, Span};
use crate::util::PathExt;
#[cfg(feature = "codespan-reporting")]
@@ -284,37 +284,28 @@ impl SourceFile {
.extend(newlines(&self.src[start ..]).map(|idx| start + idx));
// Update the root node.
- #[cfg(not(feature = "parse-cache"))]
- {
- self.root = parse(&self.src);
- }
-
- #[cfg(feature = "parse-cache")]
- {
- let insertion_span = replace.into_span(self.id);
- let incremental_target =
- Rc::make_mut(&mut self.root).incremental_parent(insertion_span);
-
- match incremental_target {
- Some((child_idx, parent, offset)) => {
- let child = &parent.children()[child_idx];
- let src = &self.src[offset .. offset + child.len()];
- let parse_res = match child.kind() {
- NodeKind::Markup => Some(parse(src)),
- _ => parse_block(src),
- }
- .and_then(|x| x.data().erroneous().not().then(|| x));
-
- if let Some(parse_res) = parse_res {
- parent.replace_child(child_idx, parse_res);
- } else {
- self.root = parse(&self.src);
- }
+ let insertion_span = Span::new(self.id, replace.start, replace.end);
+ let incremental_target =
+ Rc::make_mut(&mut self.root).incremental_parent(insertion_span);
+
+ match incremental_target {
+ Some((child, offset)) => {
+ let src = &self.src[offset .. offset + child.len()];
+ let parse_res = match child.kind() {
+ NodeKind::Markup => Some(parse(src)),
+ _ => parse_block(src),
}
- None => {
+ .and_then(|x| x.erroneous.not().then(|| x));
+
+ if let Some(parse_res) = parse_res {
+ *child = Rc::try_unwrap(parse_res).unwrap();
+ } else {
self.root = parse(&self.src);
}
}
+ None => {
+ self.root = parse(&self.src);
+ }
}
}
@@ -405,6 +396,7 @@ impl<'a> Files<'a> for SourceStore {
#[cfg(test)]
mod tests {
use super::*;
+ use crate::syntax::Green;
const TEST: &str = "ä\tcde\nf💛g\r\nhi\rjkl";