From 7ef200774fbb8e5f4961f63a83cf5bbe27cd5f8f Mon Sep 17 00:00:00 2001 From: Murarth Date: Mon, 17 Nov 2014 14:36:27 -0700 Subject: [PATCH 1/2] libsyntax: Add `parse_view_item` method to Parser --- src/libsyntax/parse/parser.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 98479d65cbb2f..9d6dece34da84 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -5609,6 +5609,14 @@ impl<'a> Parser<'a> { } } + /// Parse a ViewItem, e.g. `use foo::bar` or `extern crate foo` + pub fn parse_view_item(&mut self, attrs: Vec) -> ViewItem { + match self.parse_item_or_view_item(attrs, false) { + IoviViewItem(vi) => vi, + _ => self.fatal("expected `use` or `extern crate`"), + } + } + /// Parse, e.g., "use a::b::{z,y}" fn parse_use(&mut self) -> ViewItem_ { return ViewItemUse(self.parse_view_path()); From 2293a04b4936a11fc3e09f3df8a8ab591e034f29 Mon Sep 17 00:00:00 2001 From: Murarth Date: Mon, 17 Nov 2014 14:37:59 -0700 Subject: [PATCH 2/2] libsyntax: Add tests for `parse_view_item` --- src/libsyntax/parse/mod.rs | 27 ++++++++++++++++++++++++++- src/libsyntax/util/parser_testing.rs | 7 +++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/libsyntax/parse/mod.rs b/src/libsyntax/parse/mod.rs index 2810db4eaddd8..3ce49b9d7a3ec 100644 --- a/src/libsyntax/parse/mod.rs +++ b/src/libsyntax/parse/mod.rs @@ -730,10 +730,11 @@ mod test { use attr::AttrMetaMethods; use parse::parser::Parser; use parse::token::{str_to_ident}; + use print::pprust::view_item_to_string; use ptr::P; use util::parser_testing::{string_to_tts, string_to_parser}; use util::parser_testing::{string_to_expr, string_to_item}; - use util::parser_testing::string_to_stmt; + use util::parser_testing::{string_to_stmt, string_to_view_item}; // produce a codemap::span fn sp(a: u32, b: u32) -> Span { @@ -1083,6 +1084,30 @@ mod test { span: sp(0,21)}))); } + #[test] fn parse_use() { + let use_s = "use foo::bar::baz;"; + let vitem = string_to_view_item(use_s.to_string()); + let vitem_s = view_item_to_string(&vitem); + assert_eq!(vitem_s.as_slice(), use_s); + + let use_s = "use foo::bar as baz;"; + let vitem = string_to_view_item(use_s.to_string()); + let vitem_s = view_item_to_string(&vitem); + assert_eq!(vitem_s.as_slice(), use_s); + } + + #[test] fn parse_extern_crate() { + let ex_s = "extern crate foo;"; + let vitem = string_to_view_item(ex_s.to_string()); + let vitem_s = view_item_to_string(&vitem); + assert_eq!(vitem_s.as_slice(), ex_s); + + let ex_s = "extern crate \"foo\" as bar;"; + let vitem = string_to_view_item(ex_s.to_string()); + let vitem_s = view_item_to_string(&vitem); + assert_eq!(vitem_s.as_slice(), ex_s); + } + fn get_spans_of_pat_idents(src: &str) -> Vec { let item = string_to_item(src.to_string()).unwrap(); diff --git a/src/libsyntax/util/parser_testing.rs b/src/libsyntax/util/parser_testing.rs index d0faa3c682064..c1ea8f60b8201 100644 --- a/src/libsyntax/util/parser_testing.rs +++ b/src/libsyntax/util/parser_testing.rs @@ -67,6 +67,13 @@ pub fn string_to_stmt(source_str : String) -> P { }) } +/// Parse a string, return a view item +pub fn string_to_view_item (source_str : String) -> ast::ViewItem { + with_error_checking_parse(source_str, |p| { + p.parse_view_item(Vec::new()) + }) +} + /// Parse a string, return a pat. Uses "irrefutable"... which doesn't /// (currently) affect parsing. pub fn string_to_pat(source_str: String) -> P {