about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorRafael Ávila de Espíndola <respindola@mozilla.com>2010-12-30 11:21:37 -0500
committerRafael Ávila de Espíndola <respindola@mozilla.com>2010-12-30 11:21:37 -0500
commit09ef31caa0c2eafb113198ad60445e8aebddbf2e (patch)
treead2e03b11bc6d0ada27821bba7257ca28466b7a5 /src
parentad19961c471ebf78f54879e0dace21252aba72d7 (diff)
downloadrust-09ef31caa0c2eafb113198ad60445e8aebddbf2e.tar.gz
rust-09ef31caa0c2eafb113198ad60445e8aebddbf2e.zip
Record the ast of uses and imports.
Diffstat (limited to 'src')
-rw-r--r--src/comp/front/ast.rs14
-rw-r--r--src/comp/front/parser.rs66
2 files changed, 59 insertions, 21 deletions
diff --git a/src/comp/front/ast.rs b/src/comp/front/ast.rs
index 8159962de1c..aa28e7c45bd 100644
--- a/src/comp/front/ast.rs
+++ b/src/comp/front/ast.rs
@@ -39,6 +39,20 @@ tag def {
 type crate = spanned[crate_];
 type crate_ = rec(_mod module);
 
+type use_node = spanned[use_node_];
+type use_node_ = rec(ident name, vec[@meta_item] metadata);
+
+type import_node = spanned[import_node_];
+type import_node_ = rec(vec[ident] identifiers);
+
+tag use_or_import {
+    use_or_import_use(@use_node);
+    use_or_import_import(@import_node);
+}
+
+type meta_item = spanned[meta_item_];
+type meta_item_ = rec(ident name, str value);
+
 type block = spanned[block_];
 type block_ = rec(vec[@stmt] stmts,
                   option.t[@expr] expr,
diff --git a/src/comp/front/parser.rs b/src/comp/front/parser.rs
index f302fb1b694..0e08a8bf352 100644
--- a/src/comp/front/parser.rs
+++ b/src/comp/front/parser.rs
@@ -1533,65 +1533,92 @@ impure fn parse_item(parser p) -> @ast.item {
     fail;
 }
 
-impure fn parse_meta_item(parser p) {
+impure fn parse_meta_item(parser p) -> @ast.meta_item {
+    auto lo = p.get_span();
+    auto hi = lo;
     auto ident = parse_ident(p);
     expect(p, token.EQ);
     alt (p.peek()) {
         case (token.LIT_STR(?s)) {
             p.bump();
+            ret @spanned(lo, hi, rec(name = ident, value = s));
         }
         case (_) {
             p.err("Metadata items must be string literals");
         }
     }
+    fail;
 }
 
-impure fn parse_meta(parser p) {
+impure fn parse_meta(parser p) -> vec[@ast.meta_item] {
     auto pf = parse_meta_item;
-    parse_seq[()](token.LPAREN, token.RPAREN, some(token.COMMA), pf, p);
+    ret parse_seq[@ast.meta_item](token.LPAREN, token.RPAREN,
+                                   some(token.COMMA), pf, p).node;
 }
 
-impure fn parse_optional_meta(parser p) {
+impure fn parse_optional_meta(parser p) -> vec[@ast.meta_item] {
+    auto lo = p.get_span();
+    auto hi = lo;
     alt (p.peek()) {
         case (token.LPAREN) {
             ret parse_meta(p);
         }
         case (_) {
-            ret;
+            let vec[@ast.meta_item] v = vec();
+            ret v;
         }
     }
 }
 
-impure fn parse_rest_import_name(parser p, ast.ident id) {
+impure fn parse_use(parser p) -> @ast.use_node {
+    auto lo = p.get_span();
+    auto hi = lo;
+    expect(p, token.USE);
+    auto ident = parse_ident(p);
+    auto metadata = parse_optional_meta(p);
+    expect(p, token.SEMI);
+    ret @spanned(lo, hi, rec(name = ident, metadata = metadata));
+}
+
+impure fn parse_rest_import_name(parser p, ast.ident id) -> @ast.import_node {
+    auto lo = p.get_span();
+    auto hi = lo;
+    let vec[ast.ident] identifiers = vec();
+    identifiers += id;
     while (p.peek() != token.SEMI) {
         expect(p, token.DOT);
-        parse_ident(p);
+        auto i = parse_ident(p);
+        identifiers += i;
     }
+    p.bump();
+    ret @spanned(lo, hi, rec(identifiers = identifiers));
 }
 
-impure fn parse_full_import_name(parser p) {
+impure fn parse_full_import_name(parser p) -> @ast.import_node {
     alt (p.peek()) {
         case (token.IDENT(?ident)) {
             p.bump();
-            parse_rest_import_name(p, ident);
+            ret parse_rest_import_name(p, ident);
         }
         case (_) {
             p.err("expecting an identifier");
         }
     }
+    fail;
 }
 
-impure fn parse_import(parser p) {
+impure fn parse_import(parser p) -> @ast.import_node {
+    expect(p, token.IMPORT);
     alt (p.peek()) {
         case (token.IDENT(?ident)) {
             p.bump();
             alt (p.peek()) {
                 case (token.EQ) {
                     p.bump();
-                    parse_full_import_name(p);
+                    ret parse_full_import_name(p);
                 }
                 case (_) {
-                    parse_rest_import_name(p, ident);
+                    ret parse_rest_import_name(p, ident);
                 }
             }
         }
@@ -1599,24 +1626,21 @@ impure fn parse_import(parser p) {
             p.err("expecting an identifier");
         }
     }
+    fail;
 }
 
-impure fn parse_use_and_imports(parser p) {
+impure fn parse_use_and_imports(parser p) -> vec[ast.use_or_import] {
+    let vec[ast.use_or_import] items = vec();
     while (true) {
         alt (p.peek()) {
             case (token.USE) {
-                p.bump();
-                auto ident = parse_ident(p);
-                parse_optional_meta(p);
-                expect(p, token.SEMI);
+                items += vec(ast.use_or_import_use(parse_use(p)));
             }
             case (token.IMPORT) {
-                p.bump();
-                parse_import(p);
-                expect(p, token.SEMI);
+                items += vec(ast.use_or_import_import(parse_import(p)));
             }
             case (_) {
-                ret;
+                ret items;
             }
         }
     }