aboutsummaryrefslogtreecommitdiff
path: root/crates/libsyntax2/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/libsyntax2/src/lib.rs')
-rw-r--r--crates/libsyntax2/src/lib.rs38
1 files changed, 37 insertions, 1 deletions
diff --git a/crates/libsyntax2/src/lib.rs b/crates/libsyntax2/src/lib.rs
index 86fdbd23f..3a36a57b1 100644
--- a/crates/libsyntax2/src/lib.rs
+++ b/crates/libsyntax2/src/lib.rs
@@ -50,7 +50,11 @@ pub use {
50 yellow::{SyntaxNode, SyntaxNodeRef, OwnedRoot, RefRoot, TreeRoot, SyntaxError}, 50 yellow::{SyntaxNode, SyntaxNodeRef, OwnedRoot, RefRoot, TreeRoot, SyntaxError},
51}; 51};
52 52
53use yellow::{GreenNode, SyntaxRoot}; 53use {
54 SyntaxKind::*,
55 yellow::{GreenNode, SyntaxRoot},
56 parser_api::Parser,
57};
54 58
55#[derive(Clone, Debug)] 59#[derive(Clone, Debug)]
56pub struct File { 60pub struct File {
@@ -69,6 +73,22 @@ impl File {
69 let (root, errors) = parser_impl::parse::<yellow::GreenBuilder>(text, &tokens); 73 let (root, errors) = parser_impl::parse::<yellow::GreenBuilder>(text, &tokens);
70 File::new(root, errors) 74 File::new(root, errors)
71 } 75 }
76 pub fn reparse(&self, edit: &AtomEdit) -> File {
77 self.incremental_reparse(edit).unwrap_or_else(|| {
78 self.full_reparse(edit)
79 })
80 }
81 fn incremental_reparse(&self, edit: &AtomEdit) -> Option<File> {
82 let (node, reparser) = find_reparsable_node(self.syntax(), edit.delete)?;
83 None
84 }
85 fn full_reparse(&self, edit: &AtomEdit) -> File {
86 let start = u32::from(edit.delete.start()) as usize;
87 let end = u32::from(edit.delete.end()) as usize;
88 let mut text = self.syntax().text();
89 text.replace_range(start..end, &edit.insert);
90 File::parse(&text)
91 }
72 pub fn ast(&self) -> ast::Root { 92 pub fn ast(&self) -> ast::Root {
73 ast::Root::cast(self.syntax()).unwrap() 93 ast::Root::cast(self.syntax()).unwrap()
74 } 94 }
@@ -132,3 +152,19 @@ impl AtomEdit {
132 AtomEdit::replace(TextRange::offset_len(offset, 0.into()), text) 152 AtomEdit::replace(TextRange::offset_len(offset, 0.into()), text)
133 } 153 }
134} 154}
155
156fn find_reparsable_node(node: SyntaxNodeRef, range: TextRange) -> Option<(SyntaxNodeRef, fn(&mut Parser))> {
157 let node = algo::find_covering_node(node, range);
158 return algo::ancestors(node)
159 .filter_map(|node| reparser(node).map(|r| (node, r)))
160 .next();
161
162 fn reparser(node: SyntaxNodeRef) -> Option<fn(&mut Parser)> {
163 let res = match node.kind() {
164 BLOCK => grammar::block,
165 NAMED_FIELD_DEF_LIST => grammar::named_field_def_list,
166 _ => return None,
167 };
168 Some(res)
169 }
170}