about summary refs log tree commit diff
path: root/src/libsyntax/parse
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2012-08-14 11:07:41 -0700
committerPatrick Walton <pcwalton@mimiga.net>2012-08-14 11:08:15 -0700
commit81e6bb1b4bd5c3ad93da6151b52fa0dbf7c5c98a (patch)
treea4d22c0bcf5e0d358712a5ef9875cbcdb5532819 /src/libsyntax/parse
parentfbbe9ac94b623fc95848f2405f938d0dde1f8473 (diff)
downloadrust-81e6bb1b4bd5c3ad93da6151b52fa0dbf7c5c98a.tar.gz
rust-81e6bb1b4bd5c3ad93da6151b52fa0dbf7c5c98a.zip
libsyntax: First steps toward parsing "extern mod std;"
Diffstat (limited to 'src/libsyntax/parse')
-rw-r--r--src/libsyntax/parse/parser.rs59
1 files changed, 37 insertions, 22 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index bc69edda1a2..2a23ace632c 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -157,6 +157,14 @@ macro_rules! maybe_whole {
 }
 
 
+pure fn maybe_append(+lhs: ~[attribute], rhs: option<~[attribute]>)
+                  -> ~[attribute] {
+    match rhs {
+        none => lhs,
+        some(attrs) => vec::append(lhs, attrs)
+    }
+}
+
 
 /* ident is handled by common.rs */
 
@@ -2803,18 +2811,37 @@ class parser {
              items: items};
     }
 
-    fn parse_item_foreign_mod() -> item_info {
+    fn parse_item_foreign_mod(lo: uint,
+                              visibility: visibility,
+                              attrs: ~[attribute])
+                           -> item_or_view_item {
         if self.is_keyword(~"mod") {
             self.expect_keyword(~"mod");
         } else {
             self.expect_keyword(~"module");
         }
-        let id = self.parse_ident();
-        self.expect(token::LBRACE);
-        let more_attrs = self.parse_inner_attrs_and_next();
-        let m = self.parse_foreign_mod_items(more_attrs.next);
-        self.expect(token::RBRACE);
-        (id, item_foreign_mod(m), some(more_attrs.inner))
+        let ident = self.parse_ident();
+
+        // extern mod { ... }
+        if self.eat(token::LBRACE) {
+            let extra_attrs = self.parse_inner_attrs_and_next();
+            let m = self.parse_foreign_mod_items(extra_attrs.next);
+            self.expect(token::RBRACE);
+            return iovi_item(self.mk_item(lo, self.last_span.hi, ident,
+                                          item_foreign_mod(m), visibility,
+                                          maybe_append(attrs,
+                                                       some(extra_attrs.
+                                                            inner))));
+        }
+
+        // extern mod foo;
+        let metadata = self.parse_optional_meta();
+        return iovi_view_item(@{
+            node: view_item_use(ident, metadata, self.get_id()),
+            attrs: attrs,
+            vis: visibility,
+            span: mk_sp(lo, self.last_span.hi)
+        });
     }
 
     fn parse_type_decl() -> {lo: uint, ident: ident} {
@@ -3019,14 +3046,6 @@ class parser {
             visibility = inherited;
         }
 
-        pure fn maybe_append(+lhs: ~[attribute], rhs: option<~[attribute]>)
-                          -> ~[attribute] {
-            match rhs {
-                none => lhs,
-                some(attrs) => vec::append(lhs, attrs)
-            }
-        }
-
         if self.eat_keyword(~"const") {
             let (ident, item_, extra_attrs) = self.parse_item_const();
             return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_,
@@ -3063,10 +3082,7 @@ class parser {
                                               maybe_append(attrs,
                                                            extra_attrs)));
             }
-            let (ident, item_, extra_attrs) = self.parse_item_foreign_mod();
-            return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_,
-                                          visibility,
-                                          maybe_append(attrs, extra_attrs)));
+            return self.parse_item_foreign_mod(lo, visibility, attrs);
         } else if self.eat_keyword(~"mod") || self.eat_keyword(~"module") {
             let (ident, item_, extra_attrs) = self.parse_item_mod();
             return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_,
@@ -3104,9 +3120,8 @@ class parser {
                                           visibility,
                                           maybe_append(attrs, extra_attrs)));
         } else if !self.is_any_keyword(copy self.token)
-            && self.look_ahead(1) == token::NOT
-            && is_plain_ident(self.look_ahead(2))
-        {
+                && self.look_ahead(1) == token::NOT
+                && is_plain_ident(self.look_ahead(2)) {
             // item macro.
             let pth = self.parse_path_without_tps();
             self.expect(token::NOT);