aboutsummaryrefslogtreecommitdiff
path: root/src/tree
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2018-01-07 10:09:13 +0000
committerAleksey Kladov <[email protected]>2018-01-07 10:09:13 +0000
commit18f9e50b2d1aaf91992be9fd2f2a7e1866a943d3 (patch)
treee984c18fb8fa2e81950a582672077f966ce570e3 /src/tree
parentefcfaae34ac7a54e858aad82e6503a7c69d6c550 (diff)
Error placement
Diffstat (limited to 'src/tree')
-rw-r--r--src/tree/file_builder.rs4
-rw-r--r--src/tree/mod.rs16
2 files changed, 18 insertions, 2 deletions
diff --git a/src/tree/file_builder.rs b/src/tree/file_builder.rs
index ddb29a6b9..b07f4027b 100644
--- a/src/tree/file_builder.rs
+++ b/src/tree/file_builder.rs
@@ -156,7 +156,7 @@ impl<'f> ErrorBuilder<'f> {
156 156
157 pub fn emit(self) { 157 pub fn emit(self) {
158 let message = self.message.expect("Error message not set"); 158 let message = self.message.expect("Error message not set");
159 let node = self.builder.current_id(); 159 let &(node, after_child) = self.builder.in_progress.last().unwrap();
160 self.builder.errors.push(SyntaxErrorData { node, message }) 160 self.builder.errors.push(SyntaxErrorData { node, message, after_child })
161 } 161 }
162} 162}
diff --git a/src/tree/mod.rs b/src/tree/mod.rs
index 3980b23ce..7f4d427ba 100644
--- a/src/tree/mod.rs
+++ b/src/tree/mod.rs
@@ -2,6 +2,7 @@ use text::{TextUnit, TextRange};
2use syntax_kinds::syntax_info; 2use syntax_kinds::syntax_info;
3 3
4use std::fmt; 4use std::fmt;
5use std::cmp;
5 6
6mod file_builder; 7mod file_builder;
7pub use self::file_builder::{FileBuilder, Sink}; 8pub use self::file_builder::{FileBuilder, Sink};
@@ -96,6 +97,15 @@ impl<'f> fmt::Debug for Node<'f> {
96 } 97 }
97} 98}
98 99
100impl<'f> cmp::PartialEq<Node<'f>> for Node<'f> {
101 fn eq(&self, other: &Node<'f>) -> bool {
102 self.idx == other.idx && ::std::ptr::eq(self.file, other.file)
103 }
104}
105
106impl<'f> cmp::Eq for Node<'f> {
107}
108
99#[derive(Clone, Copy)] 109#[derive(Clone, Copy)]
100pub struct SyntaxError<'f> { 110pub struct SyntaxError<'f> {
101 file: &'f File, 111 file: &'f File,
@@ -107,6 +117,11 @@ impl<'f> SyntaxError<'f> {
107 self.data().message.as_str() 117 self.data().message.as_str()
108 } 118 }
109 119
120 pub fn after_child(&self) -> Option<Node<'f>> {
121 let idx = self.data().after_child?;
122 Some(Node { file: self.file, idx })
123 }
124
110 fn data(&self) -> &'f SyntaxErrorData { 125 fn data(&self) -> &'f SyntaxErrorData {
111 &self.file.errors[self.idx] 126 &self.file.errors[self.idx]
112 } 127 }
@@ -187,6 +202,7 @@ struct ErrorIdx(u32);
187struct SyntaxErrorData { 202struct SyntaxErrorData {
188 node: NodeIdx, 203 node: NodeIdx,
189 message: String, 204 message: String,
205 after_child: Option<NodeIdx>,
190} 206}
191 207
192impl ::std::ops::Index<ErrorIdx> for Vec<SyntaxErrorData> { 208impl ::std::ops::Index<ErrorIdx> for Vec<SyntaxErrorData> {