diff options
| author | Graydon Hoare <[email protected]> | 2011-03-11 15:49:48 -0800 |
|---|---|---|
| committer | Graydon Hoare <[email protected]> | 2011-03-11 15:49:56 -0800 |
| commit | ec7e84ae0d9d04c52a8456c16dd846efe6390340 (patch) | |
| tree | cac83fdde3f379554aae7fcf133b66fe4149742e /src | |
| parent | Remove redundant entry from Makefile (diff) | |
| download | rust-ec7e84ae0d9d04c52a8456c16dd846efe6390340.tar.xz rust-ec7e84ae0d9d04c52a8456c16dd846efe6390340.zip | |
Preserve crate directives in the parsed crate.
Diffstat (limited to 'src')
| -rw-r--r-- | src/comp/front/ast.rs | 3 | ||||
| -rw-r--r-- | src/comp/front/parser.rs | 11 | ||||
| -rw-r--r-- | src/comp/middle/fold.rs | 14 |
3 files changed, 17 insertions, 11 deletions
diff --git a/src/comp/front/ast.rs b/src/comp/front/ast.rs index b39f3d4c..5999388e 100644 --- a/src/comp/front/ast.rs +++ b/src/comp/front/ast.rs @@ -44,7 +44,8 @@ tag def { } type crate = spanned[crate_]; -type crate_ = rec(_mod module); +type crate_ = rec(vec[@crate_directive] directives, + _mod module); tag crate_directive_ { cdir_expr(@expr); diff --git a/src/comp/front/parser.rs b/src/comp/front/parser.rs index cdd65539..45cec0c0 100644 --- a/src/comp/front/parser.rs +++ b/src/comp/front/parser.rs @@ -2244,7 +2244,9 @@ impure fn parse_crate_from_source_file(parser p) -> @ast.crate { auto lo = p.get_span(); auto hi = lo; auto m = parse_mod_items(p, token.EOF); - ret @spanned(lo, hi, rec(module=m)); + let vec[@ast.crate_directive] cdirs = vec(); + ret @spanned(lo, hi, rec(directives=cdirs, + module=m)); } // Logic for parsing crate files (.rc) @@ -2259,8 +2261,6 @@ impure fn parse_crate_directive(parser p) -> ast.crate_directive auto hi = lo; alt (p.peek()) { case (token.AUTH) { - // FIXME: currently dropping auth clauses on the floor, - // as there is no effect-checking pass. p.bump(); auto n = parse_path(p, GREEDY); expect(p, token.EQ); @@ -2271,8 +2271,6 @@ impure fn parse_crate_directive(parser p) -> ast.crate_directive } case (token.META) { - // FIXME: currently dropping meta clauses on the floor, - // as there is no crate metadata system p.bump(); auto mis = parse_meta(p); hi = p.get_span(); @@ -2381,7 +2379,8 @@ impure fn parse_crate_from_crate_file(parser p) -> @ast.crate { cdirs, prefix); hi = p.get_span(); expect(p, token.EOF); - ret @spanned(lo, hi, rec(module=m)); + ret @spanned(lo, hi, rec(directives=cdirs, + module=m)); } diff --git a/src/comp/middle/fold.rs b/src/comp/middle/fold.rs index 37ae2c23..17a2a2ca 100644 --- a/src/comp/middle/fold.rs +++ b/src/comp/middle/fold.rs @@ -273,6 +273,7 @@ type ast_fold[ENV] = (fn(&ENV e, &ast.native_mod m) -> ast.native_mod) fold_native_mod, (fn(&ENV e, &span sp, + vec[@ast.crate_directive] cdirs, &ast._mod m) -> @ast.crate) fold_crate, (fn(&ENV e, @@ -991,9 +992,12 @@ fn fold_native_mod[ENV](&ENV e, ast_fold[ENV] fld, } fn fold_crate[ENV](&ENV env, ast_fold[ENV] fld, @ast.crate c) -> @ast.crate { + // FIXME: possibly fold the directives so you process any expressions + // within them? Not clear. After front/eval.rs, nothing else should look + // at crate directives. let ENV env_ = fld.update_env_for_crate(env, c); let ast._mod m = fold_mod[ENV](env_, fld, c.node.module); - ret fld.fold_crate(env_, c.span, m); + ret fld.fold_crate(env_, c.span, c.node.directives, m); } //// Identity folds. @@ -1381,8 +1385,10 @@ fn identity_fold_native_mod[ENV](&ENV e, ret m; } -fn identity_fold_crate[ENV](&ENV e, &span sp, &ast._mod m) -> @ast.crate { - ret @respan(sp, rec(module=m)); +fn identity_fold_crate[ENV](&ENV e, &span sp, + vec[@ast.crate_directive] cdirs, + &ast._mod m) -> @ast.crate { + ret @respan(sp, rec(directives=cdirs, module=m)); } fn identity_fold_obj[ENV](&ENV e, @@ -1537,7 +1543,7 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] { fold_fn_decl = bind identity_fold_fn_decl[ENV](_,_,_,_), fold_mod = bind identity_fold_mod[ENV](_,_), fold_native_mod = bind identity_fold_native_mod[ENV](_,_), - fold_crate = bind identity_fold_crate[ENV](_,_,_), + fold_crate = bind identity_fold_crate[ENV](_,_,_,_), fold_obj = bind identity_fold_obj[ENV](_,_,_,_), update_env_for_crate = bind identity_update_env_for_crate[ENV](_,_), |