Skip to content

Commit e09d986

Browse files
committed
auto merge of #19044 : murarth/rust/libsyntax-view-item, r=alexcrichton
Allows parsing view items (`use` and `extern crate`) individually. Does not change behavior of any existing functions. Closes #19024
2 parents 1628b98 + 2293a04 commit e09d986

File tree

3 files changed

+41
-1
lines changed

3 files changed

+41
-1
lines changed

Diff for: src/libsyntax/parse/mod.rs

+26-1
Original file line numberDiff line numberDiff line change
@@ -730,10 +730,11 @@ mod test {
730730
use attr::AttrMetaMethods;
731731
use parse::parser::Parser;
732732
use parse::token::{str_to_ident};
733+
use print::pprust::view_item_to_string;
733734
use ptr::P;
734735
use util::parser_testing::{string_to_tts, string_to_parser};
735736
use util::parser_testing::{string_to_expr, string_to_item};
736-
use util::parser_testing::string_to_stmt;
737+
use util::parser_testing::{string_to_stmt, string_to_view_item};
737738

738739
// produce a codemap::span
739740
fn sp(a: u32, b: u32) -> Span {
@@ -1083,6 +1084,30 @@ mod test {
10831084
span: sp(0,21)})));
10841085
}
10851086

1087+
#[test] fn parse_use() {
1088+
let use_s = "use foo::bar::baz;";
1089+
let vitem = string_to_view_item(use_s.to_string());
1090+
let vitem_s = view_item_to_string(&vitem);
1091+
assert_eq!(vitem_s.as_slice(), use_s);
1092+
1093+
let use_s = "use foo::bar as baz;";
1094+
let vitem = string_to_view_item(use_s.to_string());
1095+
let vitem_s = view_item_to_string(&vitem);
1096+
assert_eq!(vitem_s.as_slice(), use_s);
1097+
}
1098+
1099+
#[test] fn parse_extern_crate() {
1100+
let ex_s = "extern crate foo;";
1101+
let vitem = string_to_view_item(ex_s.to_string());
1102+
let vitem_s = view_item_to_string(&vitem);
1103+
assert_eq!(vitem_s.as_slice(), ex_s);
1104+
1105+
let ex_s = "extern crate \"foo\" as bar;";
1106+
let vitem = string_to_view_item(ex_s.to_string());
1107+
let vitem_s = view_item_to_string(&vitem);
1108+
assert_eq!(vitem_s.as_slice(), ex_s);
1109+
}
1110+
10861111
fn get_spans_of_pat_idents(src: &str) -> Vec<Span> {
10871112
let item = string_to_item(src.to_string()).unwrap();
10881113

Diff for: src/libsyntax/parse/parser.rs

+8
Original file line numberDiff line numberDiff line change
@@ -5620,6 +5620,14 @@ impl<'a> Parser<'a> {
56205620
}
56215621
}
56225622

5623+
/// Parse a ViewItem, e.g. `use foo::bar` or `extern crate foo`
5624+
pub fn parse_view_item(&mut self, attrs: Vec<Attribute>) -> ViewItem {
5625+
match self.parse_item_or_view_item(attrs, false) {
5626+
IoviViewItem(vi) => vi,
5627+
_ => self.fatal("expected `use` or `extern crate`"),
5628+
}
5629+
}
5630+
56235631
/// Parse, e.g., "use a::b::{z,y}"
56245632
fn parse_use(&mut self) -> ViewItem_ {
56255633
return ViewItemUse(self.parse_view_path());

Diff for: src/libsyntax/util/parser_testing.rs

+7
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,13 @@ pub fn string_to_stmt(source_str : String) -> P<ast::Stmt> {
6767
})
6868
}
6969

70+
/// Parse a string, return a view item
71+
pub fn string_to_view_item (source_str : String) -> ast::ViewItem {
72+
with_error_checking_parse(source_str, |p| {
73+
p.parse_view_item(Vec::new())
74+
})
75+
}
76+
7077
/// Parse a string, return a pat. Uses "irrefutable"... which doesn't
7178
/// (currently) affect parsing.
7279
pub fn string_to_pat(source_str: String) -> P<ast::Pat> {

0 commit comments

Comments
 (0)