diff options
Diffstat (limited to 'crates/ra_syntax/src/lib.rs')
-rw-r--r-- | crates/ra_syntax/src/lib.rs | 37 |
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 | ||
23 | extern crate arrayvec; | ||
23 | extern crate drop_bomb; | 24 | extern crate drop_bomb; |
24 | extern crate itertools; | 25 | extern crate itertools; |
25 | extern crate parking_lot; | 26 | extern crate parking_lot; |
@@ -60,49 +61,47 @@ pub use crate::{ | |||
60 | 61 | ||
61 | use crate::yellow::GreenNode; | 62 | use 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)] | 65 | pub use crate::ast::SourceFileNode; |
65 | pub struct File { | ||
66 | root: SyntaxNode, | ||
67 | } | ||
68 | 66 | ||
69 | impl File { | 67 | impl 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 | } |