Skip to content

Commit d0fc062

Browse files
authored
Abstract Spanning::start and Spanning::end into Span (#1207, #1208)
1 parent 7617102 commit d0fc062

39 files changed

+262
-246
lines changed

juniper/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ All user visible changes to `juniper` crate will be documented in this file. Thi
5353
- Removed lifetime parameter from `ParseError`, `GraphlQLError`, `GraphQLBatchRequest` and `GraphQLRequest`. ([#1081], [#528])
5454
- Upgraded [GraphiQL] to 3.0.9 version (requires new [`graphql-transport-ws` GraphQL over WebSocket Protocol] integration on server, see `juniper_warp/examples/subscription.rs`). ([#1188], [#1193], [#1204])
5555
- Made `LookAheadMethods::children()` method to return slice instead of `Vec`. ([#1200])
56+
- Abstracted `Spanning::start` and `Spanning::end` fields into separate struct `Span`. ([#1207], [#1208])
5657

5758
### Added
5859

@@ -131,6 +132,8 @@ All user visible changes to `juniper` crate will be documented in this file. Thi
131132
[#1199]: /../../pull/1199
132133
[#1200]: /../../pull/1200
133134
[#1204]: /../../pull/1204
135+
[#1207]: /../../pull/1207
136+
[#1208]: /../../pull/1208
134137
[ba1ed85b]: /../../commit/ba1ed85b3c3dd77fbae7baf6bc4e693321a94083
135138
[CVE-2022-31173]: /../../security/advisories/GHSA-4rx6-g5vg-5f3j
136139

juniper/src/executor/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -885,7 +885,7 @@ where
885885
schema: &root_node.schema,
886886
context,
887887
errors: &errors,
888-
field_path: Arc::new(FieldPath::Root(operation.start)),
888+
field_path: Arc::new(FieldPath::Root(operation.span.start)),
889889
};
890890

891891
value = match operation.item.operation_type {
@@ -983,7 +983,7 @@ where
983983
schema: &root_node.schema,
984984
context,
985985
errors: &errors,
986-
field_path: Arc::new(FieldPath::Root(operation.start)),
986+
field_path: Arc::new(FieldPath::Root(operation.span.start)),
987987
};
988988

989989
value = match operation.item.operation_type {
@@ -1129,7 +1129,7 @@ where
11291129
schema: &root_node.schema,
11301130
context,
11311131
errors: &errors,
1132-
field_path: Arc::new(FieldPath::Root(operation.start)),
1132+
field_path: Arc::new(FieldPath::Root(operation.span.start)),
11331133
};
11341134

11351135
value = match operation.item.operation_type {

juniper/src/integrations/serde.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -252,8 +252,8 @@ impl Serialize for Spanning<ParseError> {
252252
map.serialize_value(&msg)?;
253253

254254
let mut loc = IndexMap::new();
255-
loc.insert("line".to_owned(), self.start.line() + 1);
256-
loc.insert("column".to_owned(), self.start.column() + 1);
255+
loc.insert("line".to_owned(), self.start().line() + 1);
256+
loc.insert("column".to_owned(), self.start().column() + 1);
257257

258258
let locations = vec![loc];
259259
map.serialize_key("locations")?;

juniper/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ pub use crate::{
7373
},
7474
introspection::IntrospectionFormat,
7575
macros::helper::subscription::{ExtractTypeFromStream, IntoFieldResult},
76-
parser::{ParseError, ScalarToken, Spanning},
76+
parser::{ParseError, ScalarToken, Span, Spanning},
7777
schema::{
7878
meta,
7979
model::{RootNode, SchemaType},

juniper/src/parser/document.rs

Lines changed: 35 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,8 @@ where
8282
let fields = fields.as_ref().map(|c| c as &[_]);
8383
let selection_set = parse_selection_set(parser, schema, fields)?;
8484

85-
Ok(Spanning::start_end(
86-
&selection_set.start,
87-
&selection_set.end,
85+
Ok(Spanning::new(
86+
selection_set.span,
8887
Operation {
8988
operation_type: OperationType::Query,
9089
name: None,
@@ -94,7 +93,7 @@ where
9493
},
9594
))
9695
} else {
97-
let start_pos = parser.peek().start;
96+
let start_pos = parser.peek().span.start;
9897
let operation_type = parse_operation_type(parser)?;
9998
let op = match operation_type.item {
10099
OperationType::Query => Some(schema.concrete_query_type()),
@@ -114,7 +113,7 @@ where
114113

115114
Ok(Spanning::start_end(
116115
&start_pos,
117-
&selection_set.end,
116+
&selection_set.span.end,
118117
Operation {
119118
operation_type: operation_type.item,
120119
name,
@@ -133,9 +132,7 @@ fn parse_fragment_definition<'a, 'b, S>(
133132
where
134133
S: ScalarValue,
135134
{
136-
let Spanning {
137-
start: start_pos, ..
138-
} = parser.expect(&Token::Name("fragment"))?;
135+
let start_pos = parser.expect(&Token::Name("fragment"))?.span.start;
139136
let name = match parser.expect_name() {
140137
Ok(n) => {
141138
if n.item == "on" {
@@ -160,7 +157,7 @@ where
160157

161158
Ok(Spanning::start_end(
162159
&start_pos,
163-
&selection_set.end,
160+
&selection_set.span.end,
164161
Fragment {
165162
name,
166163
type_condition: type_cond,
@@ -222,10 +219,7 @@ fn parse_fragment<'a, 'b, S>(
222219
where
223220
S: ScalarValue,
224221
{
225-
let Spanning {
226-
start: ref start_pos,
227-
..
228-
} = parser.expect(&Token::Ellipsis)?;
222+
let start_pos = parser.expect(&Token::Ellipsis)?.span.start;
229223

230224
match parser.peek().item {
231225
Token::Name("on") => {
@@ -240,8 +234,8 @@ where
240234
let selection_set = parse_selection_set(parser, schema, fields)?;
241235

242236
Ok(Selection::InlineFragment(Spanning::start_end(
243-
&start_pos.clone(),
244-
&selection_set.end,
237+
&start_pos,
238+
&selection_set.span.end,
245239
InlineFragment {
246240
type_condition: Some(name),
247241
directives: directives.map(|s| s.item),
@@ -253,8 +247,8 @@ where
253247
let selection_set = parse_selection_set(parser, schema, fields)?;
254248

255249
Ok(Selection::InlineFragment(Spanning::start_end(
256-
&start_pos.clone(),
257-
&selection_set.end,
250+
&start_pos,
251+
&selection_set.span.end,
258252
InlineFragment {
259253
type_condition: None,
260254
directives: None,
@@ -270,7 +264,7 @@ where
270264
&start_pos.clone(),
271265
&directives
272266
.as_ref()
273-
.map_or(&frag_name.end, |s| &s.end)
267+
.map_or(&frag_name.span.end, |s| &s.span.end)
274268
.clone(),
275269
FragmentSpread {
276270
name: frag_name,
@@ -283,8 +277,8 @@ where
283277
let selection_set = parse_selection_set(parser, schema, fields)?;
284278

285279
Ok(Selection::InlineFragment(Spanning::start_end(
286-
&start_pos.clone(),
287-
&selection_set.end,
280+
&start_pos,
281+
&selection_set.span.end,
288282
InlineFragment {
289283
type_condition: None,
290284
directives: directives.map(|s| s.item),
@@ -329,13 +323,13 @@ where
329323
let selection_set = parse_optional_selection_set(parser, schema, fields)?;
330324

331325
Ok(Spanning::start_end(
332-
&alias.as_ref().unwrap_or(&name).start.clone(),
326+
&alias.as_ref().unwrap_or(&name).span.start,
333327
&selection_set
334328
.as_ref()
335-
.map(|s| &s.end)
336-
.or_else(|| directives.as_ref().map(|s| &s.end))
337-
.or_else(|| arguments.as_ref().map(|s| &s.end))
338-
.unwrap_or(&name.end)
329+
.map(|s| &s.span.end)
330+
.or_else(|| directives.as_ref().map(|s| &s.span.end))
331+
.or_else(|| arguments.as_ref().map(|s| &s.span.end))
332+
.unwrap_or(&name.span.end)
339333
.clone(),
340334
Field {
341335
alias,
@@ -389,8 +383,8 @@ where
389383
let value = parse_value_literal(parser, false, schema, tpe)?;
390384

391385
Ok(Spanning::start_end(
392-
&name.start.clone(),
393-
&value.end.clone(),
386+
&name.span.start,
387+
&value.span.end.clone(),
394388
(name, value),
395389
))
396390
}
@@ -437,9 +431,7 @@ fn parse_variable_definition<'a, 'b, S>(
437431
where
438432
S: ScalarValue,
439433
{
440-
let Spanning {
441-
start: start_pos, ..
442-
} = parser.expect(&Token::Dollar)?;
434+
let start_pos = parser.expect(&Token::Dollar)?.span.start;
443435
let var_name = parser.expect_name()?;
444436
parser.expect(&Token::Colon)?;
445437
let var_type = parse_type(parser)?;
@@ -457,10 +449,10 @@ where
457449
&start_pos,
458450
&default_value
459451
.as_ref()
460-
.map_or(&var_type.end, |s| &s.end)
452+
.map_or(&var_type.span.end, |s| &s.span.end)
461453
.clone(),
462454
(
463-
Spanning::start_end(&start_pos, &var_name.end, var_name.item),
455+
Spanning::start_end(&start_pos, &var_name.span.end, var_name.item),
464456
VariableDefinition {
465457
var_type,
466458
default_value,
@@ -496,9 +488,7 @@ fn parse_directive<'a, 'b, S>(
496488
where
497489
S: ScalarValue,
498490
{
499-
let Spanning {
500-
start: start_pos, ..
501-
} = parser.expect(&Token::At)?;
491+
let start_pos = parser.expect(&Token::At)?.span.start;
502492
let name = parser.expect_name()?;
503493

504494
let directive = schema.directive_by_name(name.item);
@@ -511,20 +501,24 @@ where
511501

512502
Ok(Spanning::start_end(
513503
&start_pos,
514-
&arguments.as_ref().map_or(&name.end, |s| &s.end).clone(),
504+
&arguments
505+
.as_ref()
506+
.map_or(&name.span.end, |s| &s.span.end)
507+
.clone(),
515508
Directive { name, arguments },
516509
))
517510
}
518511

519512
pub fn parse_type<'a>(parser: &mut Parser<'a>) -> ParseResult<Type<'a>> {
520513
let parsed_type = if let Some(Spanning {
521-
start: start_pos, ..
514+
span: ref start_span,
515+
..
522516
}) = parser.skip(&Token::BracketOpen)?
523517
{
524518
let inner_type = parse_type(parser)?;
525-
let Spanning { end: end_pos, .. } = parser.expect(&Token::BracketClose)?;
519+
let end_pos = parser.expect(&Token::BracketClose)?.span.end;
526520
Spanning::start_end(
527-
&start_pos,
521+
&start_span.start,
528522
&end_pos,
529523
Type::List(Box::new(inner_type.item), None),
530524
)
@@ -542,13 +536,13 @@ pub fn parse_type<'a>(parser: &mut Parser<'a>) -> ParseResult<Type<'a>> {
542536
}
543537

544538
fn wrap_non_null<'a>(parser: &mut Parser<'a>, inner: Spanning<Type<'a>>) -> ParseResult<Type<'a>> {
545-
let Spanning { end: end_pos, .. } = parser.expect(&Token::ExclamationMark)?;
539+
let end_pos = &parser.expect(&Token::ExclamationMark)?.span.end;
546540

547541
let wrapped = match inner.item {
548542
Type::Named(name) => Type::NonNullNamed(name),
549543
Type::List(l, expected_size) => Type::NonNullList(l, expected_size),
550544
t => t,
551545
};
552546

553-
Ok(Spanning::start_end(&inner.start, &end_pos, wrapped))
547+
Ok(Spanning::start_end(&inner.span.start, end_pos, wrapped))
554548
}

juniper/src/parser/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,5 @@ pub use self::document::parse_document_source;
1515
pub use self::{
1616
lexer::{Lexer, LexerError, ScalarToken, Token},
1717
parser::{OptionParseResult, ParseError, ParseResult, Parser, UnlocatedParseResult},
18-
utils::{SourcePosition, Spanning},
18+
utils::{SourcePosition, Span, Spanning},
1919
};

juniper/src/parser/parser.rs

Lines changed: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,8 @@ impl<'a> Parser<'a> {
9797
#[doc(hidden)]
9898
pub fn next_token(&mut self) -> ParseResult<Token<'a>> {
9999
if self.tokens.len() == 1 {
100-
Err(Spanning::start_end(
101-
&self.peek().start,
102-
&self.peek().end,
100+
Err(Spanning::new(
101+
self.peek().span,
103102
ParseError::UnexpectedEndOfFile,
104103
))
105104
} else {
@@ -125,7 +124,7 @@ impl<'a> Parser<'a> {
125124
Ok(Some(self.next_token()?))
126125
} else if self.peek().item == Token::EndOfFile {
127126
Err(Spanning::zero_width(
128-
&self.peek().start,
127+
&self.peek().span.start,
129128
ParseError::UnexpectedEndOfFile,
130129
))
131130
} else {
@@ -144,14 +143,12 @@ impl<'a> Parser<'a> {
144143
T: fmt::Debug,
145144
F: Fn(&mut Parser<'a>) -> ParseResult<T>,
146145
{
147-
let Spanning {
148-
start: start_pos, ..
149-
} = self.expect(opening)?;
146+
let start_pos = &self.expect(opening)?.span.start;
150147
let mut items = Vec::new();
151148

152149
loop {
153-
if let Some(Spanning { end: end_pos, .. }) = self.skip(closing)? {
154-
return Ok(Spanning::start_end(&start_pos, &end_pos, items));
150+
if let Some(Spanning { span, .. }) = self.skip(closing)? {
151+
return Ok(Spanning::start_end(start_pos, &span.end, items));
155152
}
156153

157154
items.push(parser(self)?);
@@ -169,16 +166,14 @@ impl<'a> Parser<'a> {
169166
T: fmt::Debug,
170167
F: Fn(&mut Parser<'a>) -> ParseResult<T>,
171168
{
172-
let Spanning {
173-
start: start_pos, ..
174-
} = self.expect(opening)?;
169+
let start_pos = &self.expect(opening)?.span.start;
175170
let mut items = Vec::new();
176171

177172
loop {
178173
items.push(parser(self)?);
179174

180-
if let Some(Spanning { end: end_pos, .. }) = self.skip(closing)? {
181-
return Ok(Spanning::start_end(&start_pos, &end_pos, items));
175+
if let Some(end_spanning) = self.skip(closing)? {
176+
return Ok(Spanning::start_end(start_pos, &end_spanning.end(), items));
182177
}
183178
}
184179
}
@@ -194,16 +189,14 @@ impl<'a> Parser<'a> {
194189
T: fmt::Debug,
195190
F: Fn(&mut Parser<'a>) -> UnlocatedParseResult<T>,
196191
{
197-
let Spanning {
198-
start: start_pos, ..
199-
} = self.expect(opening)?;
192+
let start_pos = &self.expect(opening)?.span.start;
200193
let mut items = Vec::new();
201194

202195
loop {
203196
items.push(parser(self)?);
204197

205-
if let Some(Spanning { end: end_pos, .. }) = self.skip(closing)? {
206-
return Ok(Spanning::start_end(&start_pos, &end_pos, items));
198+
if let Some(end_spanning) = self.skip(closing)? {
199+
return Ok(Spanning::start_end(start_pos, &end_spanning.end(), items));
207200
}
208201
}
209202
}
@@ -224,9 +217,8 @@ impl<'a> Parser<'a> {
224217
Spanning {
225218
item: Token::EndOfFile,
226219
..
227-
} => Err(Spanning::start_end(
228-
&self.peek().start,
229-
&self.peek().end,
220+
} => Err(Spanning::new(
221+
self.peek().span,
230222
ParseError::UnexpectedEndOfFile,
231223
)),
232224
_ => Err(self.next_token()?.map(ParseError::unexpected_token)),

juniper/src/parser/tests/lexer.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -342,8 +342,8 @@ fn numbers() {
342342
expected: &str,
343343
) {
344344
let parsed = tokenize_single(source);
345-
assert_eq!(parsed.start, start);
346-
assert_eq!(parsed.end, end);
345+
assert_eq!(parsed.span.start, start);
346+
assert_eq!(parsed.span.end, end);
347347

348348
match parsed.item {
349349
Token::Scalar(ScalarToken::Float(actual)) => {

0 commit comments

Comments
 (0)