about summary refs log tree commit diff
path: root/src/libsyntax/parse
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2012-08-31 11:45:14 -0700
committerPatrick Walton <pcwalton@mimiga.net>2012-08-31 11:46:04 -0700
commit340a21929024efedec5dfa8d4c6a14df41640f78 (patch)
treed32e34c4b8af73298025c164e7a744ff2727f61d /src/libsyntax/parse
parentc3fdc8c7b56fe8e786801b87f809ddc2f51eea42 (diff)
downloadrust-340a21929024efedec5dfa8d4c6a14df41640f78.tar.gz
rust-340a21929024efedec5dfa8d4c6a14df41640f78.zip
libsyntax: Get "extern mod foo;" working in .rc files
Diffstat (limited to 'src/libsyntax/parse')
-rw-r--r--src/libsyntax/parse/parser.rs25
1 files changed, 20 insertions, 5 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index 03bb41698cc..0b18d7d9e6e 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -3423,12 +3423,19 @@ struct parser {
     }
 
     fn is_view_item() -> bool {
-        let tok = if !self.is_keyword(~"pub") && !self.is_keyword(~"priv") {
-            self.token
-        } else { self.look_ahead(1u) };
+        let tok, next_tok;
+        if !self.is_keyword(~"pub") && !self.is_keyword(~"priv") {
+            tok = self.token;
+            next_tok = self.look_ahead(1);
+        } else {
+            tok = self.look_ahead(1);
+            next_tok = self.look_ahead(2);
+        };
         self.token_is_keyword(~"use", tok)
             || self.token_is_keyword(~"import", tok)
             || self.token_is_keyword(~"export", tok)
+            || (self.token_is_keyword(~"extern", tok) &&
+                self.token_is_keyword(~"mod", next_tok))
     }
 
     fn parse_view_item(+attrs: ~[attribute]) -> @view_item {
@@ -3439,7 +3446,14 @@ struct parser {
             view_item_import(self.parse_view_paths())
         } else if self.eat_keyword(~"export") {
             view_item_export(self.parse_view_paths())
-        } else { fail; };
+        } else if self.eat_keyword(~"extern") {
+            self.expect_keyword(~"mod");
+            let ident = self.parse_ident();
+            let metadata = self.parse_optional_meta();
+            view_item_use(ident, metadata, self.get_id())
+        } else {
+            fail;
+        };
         self.expect(token::SEMI);
         @{node: node, attrs: attrs,
           vis: vis, span: mk_sp(lo, self.last_span.hi)}
@@ -3564,7 +3578,8 @@ struct parser {
         } else if self.is_view_item() {
             let vi = self.parse_view_item(outer_attrs);
             return spanned(lo, vi.span.hi, cdir_view_item(vi));
-        } else { return self.fatal(~"expected crate directive"); }
+        }
+        return self.fatal(~"expected crate directive");
     }
 
     fn parse_crate_directives(term: token::token,