aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_syntax/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_syntax/src/lib.rs')
-rw-r--r--crates/ra_syntax/src/lib.rs37
1 files changed, 18 insertions, 19 deletions
diff --git a/crates/ra_syntax/src/lib.rs b/crates/ra_syntax/src/lib.rs
index 123002825..330f68053 100644
--- a/crates/ra_syntax/src/lib.rs
+++ b/crates/ra_syntax/src/lib.rs
@@ -20,6 +20,7 @@
20#![allow(missing_docs)] 20#![allow(missing_docs)]
21//#![warn(unreachable_pub)] // rust-lang/rust#47816 21//#![warn(unreachable_pub)] // rust-lang/rust#47816
22 22
23extern crate arrayvec;
23extern crate drop_bomb; 24extern crate drop_bomb;
24extern crate itertools; 25extern crate itertools;
25extern crate parking_lot; 26extern crate parking_lot;
@@ -60,49 +61,47 @@ pub use crate::{
60 61
61use crate::yellow::GreenNode; 62use crate::yellow::GreenNode;
62 63
63/// File represents a parse tree for a single Rust file. 64/// `SourceFileNode` represents a parse tree for a single Rust file.
64#[derive(Clone, Debug, Hash, PartialEq, Eq)] 65pub use crate::ast::SourceFileNode;
65pub struct File {
66 root: SyntaxNode,
67}
68 66
69impl File { 67impl SourceFileNode {
70 fn new(green: GreenNode, errors: Vec<SyntaxError>) -> File { 68 fn new(green: GreenNode, errors: Vec<SyntaxError>) -> SourceFileNode {
71 let root = SyntaxNode::new(green, errors); 69 let root = SyntaxNode::new(green, errors);
72 if cfg!(debug_assertions) { 70 if cfg!(debug_assertions) {
73 utils::validate_block_structure(root.borrowed()); 71 utils::validate_block_structure(root.borrowed());
74 } 72 }
75 File { root } 73 assert_eq!(root.kind(), SyntaxKind::SOURCE_FILE);
74 ast::SourceFileNode { syntax: root }
76 } 75 }
77 pub fn parse(text: &str) -> File { 76 pub fn parse(text: &str) -> SourceFileNode {
78 let tokens = tokenize(&text); 77 let tokens = tokenize(&text);
79 let (green, errors) = 78 let (green, errors) =
80 parser_impl::parse_with(yellow::GreenBuilder::new(), text, &tokens, grammar::root); 79 parser_impl::parse_with(yellow::GreenBuilder::new(), text, &tokens, grammar::root);
81 File::new(green, errors) 80 SourceFileNode::new(green, errors)
82 } 81 }
83 pub fn reparse(&self, edit: &AtomEdit) -> File { 82 pub fn reparse(&self, edit: &AtomEdit) -> SourceFileNode {
84 self.incremental_reparse(edit) 83 self.incremental_reparse(edit)
85 .unwrap_or_else(|| self.full_reparse(edit)) 84 .unwrap_or_else(|| self.full_reparse(edit))
86 } 85 }
87 pub fn incremental_reparse(&self, edit: &AtomEdit) -> Option<File> { 86 pub fn incremental_reparse(&self, edit: &AtomEdit) -> Option<SourceFileNode> {
88 reparsing::incremental_reparse(self.syntax(), edit, self.errors()) 87 reparsing::incremental_reparse(self.syntax(), edit, self.errors())
89 .map(|(green_node, errors)| File::new(green_node, errors)) 88 .map(|(green_node, errors)| SourceFileNode::new(green_node, errors))
90 } 89 }
91 fn full_reparse(&self, edit: &AtomEdit) -> File { 90 fn full_reparse(&self, edit: &AtomEdit) -> SourceFileNode {
92 let text = 91 let text =
93 text_utils::replace_range(self.syntax().text().to_string(), edit.delete, &edit.insert); 92 text_utils::replace_range(self.syntax().text().to_string(), edit.delete, &edit.insert);
94 File::parse(&text) 93 SourceFileNode::parse(&text)
95 } 94 }
96 /// Typed AST representation of the parse tree. 95 /// Typed AST representation of the parse tree.
97 pub fn ast(&self) -> ast::Root { 96 pub fn ast(&self) -> ast::SourceFile {
98 ast::Root::cast(self.syntax()).unwrap() 97 self.borrowed()
99 } 98 }
100 /// Untyped homogeneous representation of the parse tree. 99 /// Untyped homogeneous representation of the parse tree.
101 pub fn syntax(&self) -> SyntaxNodeRef { 100 pub fn syntax(&self) -> SyntaxNodeRef {
102 self.root.borrowed() 101 self.syntax.borrowed()
103 } 102 }
104 pub fn errors(&self) -> Vec<SyntaxError> { 103 pub fn errors(&self) -> Vec<SyntaxError> {
105 let mut errors = self.root.root_data().clone(); 104 let mut errors = self.syntax.root_data().clone();
106 errors.extend(validation::validate(self)); 105 errors.extend(validation::validate(self));
107 errors 106 errors
108 } 107 }