diff options
| author | Haitao Li <lihaitao@gmail.com> | 2011-11-22 12:31:09 +0800 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2011-11-24 15:31:18 -0800 |
| commit | 3e303af86b5380c7d53a8879d883cd36ad2a69a6 (patch) | |
| tree | 342981fb73a0039355f343a2210dbedb95e7c970 /src/comp/syntax | |
| parent | 547ec241bd50e86752e4c39047b417550f655349 (diff) | |
| download | rust-3e303af86b5380c7d53a8879d883cd36ad2a69a6.tar.gz rust-3e303af86b5380c7d53a8879d883cd36ad2a69a6.zip | |
rustc: Add a path attribute for crate directives
The path information was an optional "filename" component of crate directive AST. It is now replaced by an attribute with metadata named "path". With this commit, a directive mod foo = "foo.rs"; should be written as: #[path = "foo.rs"] mod foo; Closes issue #906.
Diffstat (limited to 'src/comp/syntax')
| -rw-r--r-- | src/comp/syntax/ast.rs | 4 | ||||
| -rw-r--r-- | src/comp/syntax/fold.rs | 8 | ||||
| -rw-r--r-- | src/comp/syntax/parse/eval.rs | 20 | ||||
| -rw-r--r-- | src/comp/syntax/parse/parser.rs | 11 | ||||
| -rw-r--r-- | src/comp/syntax/visit.rs | 4 |
5 files changed, 24 insertions, 23 deletions
diff --git a/src/comp/syntax/ast.rs b/src/comp/syntax/ast.rs index ecba4efceca..47e254aa011 100644 --- a/src/comp/syntax/ast.rs +++ b/src/comp/syntax/ast.rs @@ -58,8 +58,8 @@ type crate_ = config: crate_cfg}; tag crate_directive_ { - cdir_src_mod(ident, option::t<filename>, [attribute]); - cdir_dir_mod(ident, option::t<filename>, [@crate_directive], [attribute]); + cdir_src_mod(ident, [attribute]); + cdir_dir_mod(ident, [@crate_directive], [attribute]); cdir_view_item(@view_item); cdir_syntax(path); } diff --git a/src/comp/syntax/fold.rs b/src/comp/syntax/fold.rs index f9c23b4de25..78340593f68 100644 --- a/src/comp/syntax/fold.rs +++ b/src/comp/syntax/fold.rs @@ -159,11 +159,11 @@ fn noop_fold_crate(c: crate_, fld: ast_fold) -> crate_ { fn noop_fold_crate_directive(cd: crate_directive_, fld: ast_fold) -> crate_directive_ { ret alt cd { - cdir_src_mod(id, fname, attrs) { - cdir_src_mod(fld.fold_ident(id), fname, attrs) + cdir_src_mod(id, attrs) { + cdir_src_mod(fld.fold_ident(id), attrs) } - cdir_dir_mod(id, fname, cds, attrs) { - cdir_dir_mod(fld.fold_ident(id), fname, + cdir_dir_mod(id, cds, attrs) { + cdir_dir_mod(fld.fold_ident(id), vec::map(fld.fold_crate_directive, cds), attrs) } cdir_view_item(vi) { cdir_view_item(fld.fold_view_item(vi)) } diff --git a/src/comp/syntax/parse/eval.rs b/src/comp/syntax/parse/eval.rs index 2c1c0155cf0..bc8a51e1f34 100644 --- a/src/comp/syntax/parse/eval.rs +++ b/src/comp/syntax/parse/eval.rs @@ -1,4 +1,5 @@ +import front::attr; import std::{option, result, io, fs}; import std::option::{some, none}; import syntax::ast; @@ -86,13 +87,21 @@ fn parse_companion_mod(cx: ctx, prefix: str, suffix: option::t<str>) } } +fn cdir_path_opt(id: str, attrs: [ast::attribute]) -> str { + alt attr::get_meta_item_value_str_by_name(attrs, "path") { + some(d) { + ret d; + } + none. { ret id; } + } +} + fn eval_crate_directive(cx: ctx, cdir: @ast::crate_directive, prefix: str, &view_items: [@ast::view_item], &items: [@ast::item]) { alt cdir.node { - ast::cdir_src_mod(id, file_opt, attrs) { - let file_path = id + ".rs"; - alt file_opt { some(f) { file_path = f; } none. { } } + ast::cdir_src_mod(id, attrs) { + let file_path = cdir_path_opt(id + ".rs", attrs); let full_path = if std::fs::path_is_absolute(file_path) { file_path @@ -113,9 +122,8 @@ fn eval_crate_directive(cx: ctx, cdir: @ast::crate_directive, prefix: str, cx.byte_pos = p0.get_byte_pos(); items += [i]; } - ast::cdir_dir_mod(id, dir_opt, cdirs, attrs) { - let path = id; - alt dir_opt { some(d) { path = d; } none. { } } + ast::cdir_dir_mod(id, cdirs, attrs) { + let path = cdir_path_opt(id, attrs); let full_path = if std::fs::path_is_absolute(path) { path diff --git a/src/comp/syntax/parse/parser.rs b/src/comp/syntax/parse/parser.rs index 4f81a1dfe73..82c477a7d96 100644 --- a/src/comp/syntax/parse/parser.rs +++ b/src/comp/syntax/parse/parser.rs @@ -2475,19 +2475,12 @@ fn parse_crate_directive(p: parser, first_outer_attr: [ast::attribute]) -> if expect_mod || is_word(p, "mod") { expect_word(p, "mod"); let id = parse_ident(p); - let file_opt = - alt p.peek() { - token::EQ. { p.bump(); some(parse_str(p)) } - _ { - attr::get_meta_item_value_str_by_name(outer_attrs, "path") - } - }; alt p.peek() { // mod x = "foo.rs"; token::SEMI. { let hi = p.get_hi_pos(); p.bump(); - ret spanned(lo, hi, ast::cdir_src_mod(id, file_opt, outer_attrs)); + ret spanned(lo, hi, ast::cdir_src_mod(id, outer_attrs)); } // mod x = "foo_dir" { ...directives... } token::LBRACE. { @@ -2500,7 +2493,7 @@ fn parse_crate_directive(p: parser, first_outer_attr: [ast::attribute]) -> let hi = p.get_hi_pos(); expect(p, token::RBRACE); ret spanned(lo, hi, - ast::cdir_dir_mod(id, file_opt, cdirs, mod_attrs)); + ast::cdir_dir_mod(id, cdirs, mod_attrs)); } t { unexpected(p, t); } } diff --git a/src/comp/syntax/visit.rs b/src/comp/syntax/visit.rs index 5273d16e544..45249be23a6 100644 --- a/src/comp/syntax/visit.rs +++ b/src/comp/syntax/visit.rs @@ -56,8 +56,8 @@ fn visit_crate<E>(c: crate, e: E, v: vt<E>) { fn visit_crate_directive<E>(cd: @crate_directive, e: E, v: vt<E>) { alt cd.node { - cdir_src_mod(_, _, _) { } - cdir_dir_mod(_, _, cdirs, _) { + cdir_src_mod(_, _) { } + cdir_dir_mod(_, cdirs, _) { for cdir: @crate_directive in cdirs { visit_crate_directive(cdir, e, v); } |
