Skip to content

Commit 636357b

Browse files
committed
Cleanup import parsing
Fix spans of root segments
1 parent f881626 commit 636357b

File tree

2 files changed

+23
-54
lines changed

2 files changed

+23
-54
lines changed

src/libsyntax/parse/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -713,7 +713,7 @@ mod tests {
713713
id: ast::DUMMY_NODE_ID,
714714
node: ast::ExprKind::Path(None, ast::Path {
715715
span: sp(0, 6),
716-
segments: vec![ast::PathSegment::crate_root(sp(0, 2)),
716+
segments: vec![ast::PathSegment::crate_root(sp(0, 0)),
717717
str2seg("a", 2, 3),
718718
str2seg("b", 5, 6)]
719719
}),

src/libsyntax/parse/parser.rs

+22-53
Original file line numberDiff line numberDiff line change
@@ -1990,7 +1990,7 @@ impl<'a> Parser<'a> {
19901990
let lo = self.meta_var_span.unwrap_or(self.span);
19911991
let mut segments = Vec::new();
19921992
if self.eat(&token::ModSep) {
1993-
segments.push(PathSegment::crate_root(lo));
1993+
segments.push(PathSegment::crate_root(lo.shrink_to_lo()));
19941994
}
19951995
self.parse_path_segments(&mut segments, style, enable_warning)?;
19961996

@@ -2025,7 +2025,7 @@ impl<'a> Parser<'a> {
20252025
loop {
20262026
segments.push(self.parse_path_segment(style, enable_warning)?);
20272027

2028-
if self.is_import_coupler(false) || !self.eat(&token::ModSep) {
2028+
if self.is_import_coupler() || !self.eat(&token::ModSep) {
20292029
return Ok(());
20302030
}
20312031
}
@@ -6483,9 +6483,8 @@ impl<'a> Parser<'a> {
64836483
let item_ = ItemKind::Use(P(self.parse_use_tree()?));
64846484
self.expect(&token::Semi)?;
64856485

6486-
let prev_span = self.prev_span;
6487-
let invalid = keywords::Invalid.ident();
6488-
let item = self.mk_item(lo.to(prev_span), invalid, item_, visibility, attrs);
6486+
let span = lo.to(self.prev_span);
6487+
let item = self.mk_item(span, keywords::Invalid.ident(), item_, visibility, attrs);
64896488
return Ok(Some(item));
64906489
}
64916490

@@ -6960,83 +6959,53 @@ impl<'a> Parser<'a> {
69606959
}))
69616960
}
69626961

6963-
/// `{` or `::{` or `*` or `::*`
6964-
/// `::{` or `::*` (also `{` or `*` if unprefixed is true)
6965-
fn is_import_coupler(&mut self, unprefixed: bool) -> bool {
6966-
self.is_import_coupler_inner(&token::OpenDelim(token::Brace), unprefixed) ||
6967-
self.is_import_coupler_inner(&token::BinOp(token::Star), unprefixed)
6968-
}
6969-
6970-
fn is_import_coupler_inner(&mut self, token: &token::Token, unprefixed: bool) -> bool {
6971-
if self.check(&token::ModSep) {
6972-
self.look_ahead(1, |t| t == token)
6973-
} else if unprefixed {
6974-
self.check(token)
6975-
} else {
6976-
false
6977-
}
6962+
/// `::{` or `::*`
6963+
fn is_import_coupler(&mut self) -> bool {
6964+
self.check(&token::ModSep) &&
6965+
self.look_ahead(1, |t| *t == token::OpenDelim(token::Brace) ||
6966+
*t == token::BinOp(token::Star))
69786967
}
69796968

69806969
/// Parse UseTree
69816970
///
6982-
/// USE_TREE = `*` |
6983-
/// `{` USE_TREE_LIST `}` |
6971+
/// USE_TREE = [`::`] `*` |
6972+
/// [`::`] `{` USE_TREE_LIST `}` |
69846973
/// PATH `::` `*` |
69856974
/// PATH `::` `{` USE_TREE_LIST `}` |
69866975
/// PATH [`as` IDENT]
69876976
fn parse_use_tree(&mut self) -> PResult<'a, UseTree> {
69886977
let lo = self.span;
69896978

6990-
let mut prefix = ast::Path {
6991-
segments: vec![],
6992-
span: lo.to(self.span),
6993-
};
6994-
6995-
let kind = if self.is_import_coupler(true) {
6996-
// `use *;` or `use ::*;` or `use {...};` `use ::{...};`
6997-
6998-
// Remove the first `::`
6979+
let mut prefix = ast::Path { segments: Vec::new(), span: lo.shrink_to_lo() };
6980+
let kind = if self.check(&token::OpenDelim(token::Brace)) ||
6981+
self.check(&token::BinOp(token::Star)) ||
6982+
self.is_import_coupler() {
6983+
// `use *;` or `use ::*;` or `use {...};` or `use ::{...};`
69996984
if self.eat(&token::ModSep) {
7000-
prefix.segments.push(PathSegment::crate_root(self.prev_span));
6985+
prefix.segments.push(PathSegment::crate_root(lo.shrink_to_lo()));
70016986
}
70026987

70036988
if self.eat(&token::BinOp(token::Star)) {
7004-
// `use *;`
70056989
UseTreeKind::Glob
7006-
} else if self.check(&token::OpenDelim(token::Brace)) {
7007-
// `use {...};`
7008-
UseTreeKind::Nested(self.parse_use_tree_list()?)
70096990
} else {
7010-
return self.unexpected();
6991+
UseTreeKind::Nested(self.parse_use_tree_list()?)
70116992
}
70126993
} else {
7013-
// `use path::...;`
7014-
let mut parsed = self.parse_path(PathStyle::Mod)?;
7015-
7016-
prefix.segments.append(&mut parsed.segments);
7017-
prefix.span = prefix.span.to(parsed.span);
6994+
// `use path::*;` or `use path::{...};` or `use path;` or `use path as bar;`
6995+
prefix = self.parse_path(PathStyle::Mod)?;
70186996

70196997
if self.eat(&token::ModSep) {
70206998
if self.eat(&token::BinOp(token::Star)) {
7021-
// `use path::*;`
70226999
UseTreeKind::Glob
7023-
} else if self.check(&token::OpenDelim(token::Brace)) {
7024-
// `use path::{...};`
7025-
UseTreeKind::Nested(self.parse_use_tree_list()?)
70267000
} else {
7027-
return self.unexpected();
7001+
UseTreeKind::Nested(self.parse_use_tree_list()?)
70287002
}
70297003
} else {
7030-
// `use path::foo;` or `use path::foo as bar;`
70317004
UseTreeKind::Simple(self.parse_rename()?)
70327005
}
70337006
};
70347007

7035-
Ok(UseTree {
7036-
span: lo.to(self.prev_span),
7037-
kind,
7038-
prefix,
7039-
})
7008+
Ok(UseTree { prefix, kind, span: lo.to(self.prev_span) })
70407009
}
70417010

70427011
/// Parse UseTreeKind::Nested(list)

0 commit comments

Comments
 (0)