Skip to content

Commit 75f7c7b

Browse files
committed
feat: impl Iterator for errors
fixes #139 ast.errors() now return an `Iter<'_, Error>` which allows us to iterate, but also check for the `len()`. It should allow us to use `is_empty()` as well eventually, if / when rust-lang/rust#35428 lands.
1 parent fcbf490 commit 75f7c7b

File tree

13 files changed

+33
-31
lines changed

13 files changed

+33
-31
lines changed

crates/apollo-parser/README.md

+4-4
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@ fn main() {
6262
let parser = Parser::new(input);
6363
let ast = parser.parse();
6464

65-
// ast.errors() returns an errors slice encountered during lexing and parsing
66-
assert!(ast.errors().is_empty());
65+
// ast.errors() returns an iterator with the errors encountered during lexing and parsing
66+
assert_eq!(0, ast.errors().len());
6767

6868
// ast.document() get the Document, or root node, of the tree that you can
6969
// start iterating on.
@@ -97,7 +97,7 @@ fn main() {
9797
";
9898
let parser = Parser::new(input);
9999
let ast = parser.parse();
100-
assert!(ast.errors().is_empty());
100+
assert_eq!(0, ast.errors().len());
101101

102102
let doc = ast.document();
103103

@@ -130,7 +130,7 @@ fn main() {
130130

131131
let parser = Parser::new(input);
132132
let ast = parser.parse();
133-
assert!(&ast.errors().is_empty());
133+
assert_eq!(0, ast.errors().len());
134134

135135
let doc = ast.document();
136136

crates/apollo-parser/examples/unused_vars.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ fn are_variables_unused() {
1111
let parser = Parser::new(&src);
1212
let ast = parser.parse();
1313

14-
assert!(&ast.errors().is_empty());
14+
assert_eq!(0, ast.errors().len());
1515

1616
let doc = ast.document();
1717

crates/apollo-parser/src/ast/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
//! let parser = Parser::new(schema);
4343
//! let ast = parser.parse();
4444
//!
45-
//! assert!(ast.errors().is_empty());
45+
//! assert_eq!(0, ast.errors().len());
4646
//! let document = ast.document();
4747
//! for definition in document.definitions() {
4848
//! match definition {

crates/apollo-parser/src/error.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use std::fmt;
1616
/// let parser = Parser::new(input);
1717
/// let ast = parser.parse();
1818
///
19-
/// assert!(ast.errors().is_empty());
19+
/// assert_eq!(0, ast.errors().len());
2020
///
2121
/// let doc = ast.document();
2222
/// ```

crates/apollo-parser/src/lexer/mod.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ mod cursor;
22
mod token;
33
mod token_kind;
44

5+
use std::slice::Iter;
6+
57
use crate::{lexer::cursor::Cursor, Error};
68

79
pub use token::Token;
@@ -59,8 +61,8 @@ impl Lexer {
5961
}
6062

6163
/// Get a reference to the lexer's tokens.
62-
pub(crate) fn errors(&self) -> &[Error] {
63-
self.errors.as_slice()
64+
pub(crate) fn errors<'e>(&'e self) -> Iter<'_, Error> {
65+
self.errors.iter()
6466
}
6567
}
6668

crates/apollo-parser/src/lib.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@
6262
//! let ast = parser.parse();
6363
//!
6464
//! // ast.errors() returns an errors slice encountered during lexing and parsing
65-
//! assert!(ast.errors().is_empty());
65+
//! assert_eq!(0, ast.errors().len());
6666
//!
6767
//! // ast.document() get the Document, or root node, of the tree that you can
6868
//! // start iterating on.
@@ -94,7 +94,7 @@
9494
//! ";
9595
//! let parser = Parser::new(input);
9696
//! let ast = parser.parse();
97-
//! assert!(ast.errors().is_empty());
97+
//! assert_eq!(0, ast.errors().len());
9898
//!
9999
//! let doc = ast.document();
100100
//!
@@ -125,7 +125,7 @@
125125
//!
126126
//! let parser = Parser::new(input);
127127
//! let ast = parser.parse();
128-
//! assert!(&ast.errors().is_empty());
128+
//! assert_eq!(0, ast.errors().len());
129129
//!
130130
//! let doc = ast.document();
131131
//!

crates/apollo-parser/src/parser/grammar/object.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ type Business implements NamedEntity & ValuedEntity & CatEntity {
131131
}";
132132
let parser = Parser::new(input);
133133
let ast = parser.parse();
134-
assert!(ast.errors().is_empty());
134+
assert_eq!(0, ast.errors().len());
135135

136136
let doc = ast.document();
137137

crates/apollo-parser/src/parser/grammar/selection.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ mod test {
6868
";
6969
let parser = Parser::new(input);
7070
let ast = parser.parse();
71-
assert!(&ast.errors().is_empty());
71+
assert_eq!(0, ast.errors().len());
7272

7373
let doc = ast.document();
7474

@@ -129,7 +129,7 @@ query GraphQuery($graph_id: ID!, $variant: String) {
129129
";
130130
let parser = Parser::new(input);
131131
let ast = parser.parse();
132-
assert!(&ast.errors().is_empty());
132+
assert_eq!(0, ast.errors().len());
133133

134134
let doc = ast.document();
135135

crates/apollo-parser/src/parser/grammar/union_.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ mod test {
112112
let input = "union SearchResult = Photo | Person | Cat | Dog";
113113
let parser = Parser::new(input);
114114
let ast = parser.parse();
115-
assert!(ast.errors().is_empty());
115+
assert_eq!(0, ast.errors().len());
116116

117117
let doc = ast.document();
118118

crates/apollo-parser/src/parser/grammar/value.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ query GraphQuery($graph_id: ID!, $variant: String) {
270270
";
271271
let parser = Parser::new(input);
272272
let ast = parser.parse();
273-
assert!(&ast.errors().is_empty());
273+
assert_eq!(0, ast.errors().len());
274274

275275
let doc = ast.document();
276276

crates/apollo-parser/src/parser/mod.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ pub(crate) use token_text::TokenText;
4242
/// // Parse the query, and return a SyntaxTree.
4343
/// let ast = parser.parse();
4444
/// // Check that are no errors. These are not part of the AST.
45-
/// assert!(&ast.errors().is_empty());
45+
/// assert_eq!(0, ast.errors().len());
4646
///
4747
/// // Get the document root node
4848
/// let doc = ast.document();
@@ -65,7 +65,7 @@ pub(crate) use token_text::TokenText;
6565
/// let parser = Parser::new(core_schema);
6666
/// let ast = parser.parse();
6767
///
68-
/// assert!(ast.errors().is_empty());
68+
/// assert_eq!(0, ast.errors().len());
6969
///
7070
/// let document = ast.document();
7171
/// ```
@@ -91,7 +91,7 @@ impl Parser {
9191
tokens.push(s);
9292
}
9393

94-
for e in lexer.errors().to_owned() {
94+
for e in lexer.errors().cloned() {
9595
errors.push(e);
9696
}
9797

crates/apollo-parser/src/parser/syntax_tree.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::fmt;
1+
use std::{fmt, slice::Iter};
22

33
use rowan::GreenNodeBuilder;
44

@@ -44,8 +44,8 @@ pub struct SyntaxTree {
4444

4545
impl SyntaxTree {
4646
/// Get a reference to the syntax tree's errors.
47-
pub fn errors(&self) -> &[crate::Error] {
48-
self.errors.as_ref()
47+
pub fn errors(&self) -> Iter<'_, crate::Error> {
48+
self.errors.iter()
4949
}
5050

5151
/// Return the root typed `Document` node.
@@ -159,7 +159,7 @@ mod test {
159159
";
160160
let parser = Parser::new(input);
161161
let ast = parser.parse();
162-
assert!(ast.errors().is_empty());
162+
assert_eq!(0, ast.errors().len());
163163

164164
let doc = ast.document();
165165

crates/apollo-parser/src/tests.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use std::{
66
fmt::Write,
77
fs,
88
path::{Path, PathBuf},
9+
slice::Iter,
910
};
1011

1112
use expect_test::expect_file;
@@ -52,25 +53,24 @@ fn parser_tests() {
5253
});
5354
}
5455

55-
fn assert_errors_are_present(errors: &[Error], path: &Path) {
56+
fn assert_errors_are_present(errors: Iter<'_, Error>, path: &Path) {
5657
assert!(
57-
!errors.is_empty(),
58+
errors.len() != 0,
5859
"There should be errors in the file {:?}",
5960
path.display()
6061
);
6162
}
6263

63-
fn assert_errors_are_absent(errors: &[Error], path: &Path) {
64-
assert_eq!(
65-
errors,
66-
&[] as &[Error],
64+
fn assert_errors_are_absent<'e>(errors: Iter<'_, Error>, path: &Path) {
65+
assert!(
66+
errors.len() == 0,
6767
"There should be no errors in the file {:?}",
6868
path.display(),
6969
);
7070
}
7171

7272
/// Concatenate tokens and erorrs.
73-
fn dump_tokens_and_errors(tokens: &[Token], errors: &[Error]) -> String {
73+
fn dump_tokens_and_errors<'e>(tokens: &[Token], errors: impl Iterator<Item = &'e Error>) -> String {
7474
let mut acc = String::new();
7575
for token in tokens {
7676
writeln!(acc, "{:?}", token).unwrap();

0 commit comments

Comments
 (0)