From 3e303af86b5380c7d53a8879d883cd36ad2a69a6 Mon Sep 17 00:00:00 2001 From: Haitao Li Date: Tue, 22 Nov 2011 12:31:09 +0800 Subject: [PATCH] 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. --- doc/rust.texi | 6 ++++-- src/comp/rustc.rc | 3 ++- src/comp/syntax/ast.rs | 4 ++-- src/comp/syntax/fold.rs | 8 ++++---- src/comp/syntax/parse/eval.rs | 20 ++++++++++++++------ src/comp/syntax/parse/parser.rs | 11 ++--------- src/comp/syntax/visit.rs | 4 ++-- src/lib/std.rc | 21 ++++++++++++++------- src/test/compile-fail/mod-name-non-str.rc | 3 --- src/test/run-pass/companionmod.rc | 8 +++++--- src/test/run-pass/crate-attributes.rc | 3 ++- src/test/run-pass/multi.rc | 10 ++++++---- 12 files changed, 57 insertions(+), 44 deletions(-) delete mode 100644 src/test/compile-fail/mod-name-non-str.rc diff --git a/doc/rust.texi b/doc/rust.texi index 86cdee2b4dbf..09524a8055de 100644 --- a/doc/rust.texi +++ b/doc/rust.texi @@ -1030,9 +1030,11 @@ An example of a crate: use std (ver = "1.0"); // Define some modules. -mod foo = "foo.rs"; +#[path = "foo.rs"] +mod foo; mod bar @{ - mod quux = "quux.rs"; + #[path = "quux.rs"] + mod quux; @} @end example diff --git a/src/comp/rustc.rc b/src/comp/rustc.rc index 238030621fe5..782faab69a28 100644 --- a/src/comp/rustc.rc +++ b/src/comp/rustc.rc @@ -40,7 +40,8 @@ mod middle { mod tstate { mod ck; mod annotate; - mod aux = "auxiliary.rs"; + #[path = "auxiliary.rs"] + mod aux; mod bitvectors; mod collect_locals; mod pre_post_conditions; diff --git a/src/comp/syntax/ast.rs b/src/comp/syntax/ast.rs index ecba4efceca9..47e254aa0110 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, [attribute]); - cdir_dir_mod(ident, option::t, [@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 f9c23b4de250..78340593f687 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 2c1c0155cf05..bc8a51e1f343 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) } } +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 4f81a1dfe731..82c477a7d968 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 5273d16e544c..45249be23a6e 100644 --- a/src/comp/syntax/visit.rs +++ b/src/comp/syntax/visit.rs @@ -56,8 +56,8 @@ fn visit_crate(c: crate, e: E, v: vt) { fn visit_crate_directive(cd: @crate_directive, e: E, v: vt) { 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); } diff --git a/src/lib/std.rc b/src/lib/std.rc index 1d1c69e7be4e..fdee46a8ffd1 100644 --- a/src/lib/std.rc +++ b/src/lib/std.rc @@ -40,7 +40,8 @@ mod comm; mod fs; mod io; mod net; -mod run = "run_program.rs"; +#[path = "run_program.rs"] +mod run; mod sys; mod task; @@ -100,19 +101,25 @@ mod test; mod generic_os; #[cfg(target_os = "win32")] -mod os = "win32_os.rs"; +#[path = "win32_os.rs"] +mod os; #[cfg(target_os = "win32")] -mod os_fs = "win32_fs.rs"; +#[path = "win32_fs.rs"] +mod os_fs; #[cfg(target_os = "macos")] -mod os = "macos_os.rs"; +#[path = "macos_os.rs"] +mod os; #[cfg(target_os = "macos")] -mod os_fs = "posix_fs.rs"; +#[path = "posix_fs.rs"] +mod os_fs; #[cfg(target_os = "linux")] -mod os = "linux_os.rs"; +#[path = "linux_os.rs"] +mod os; #[cfg(target_os = "linux")] -mod os_fs = "posix_fs.rs"; +#[path = "posix_fs.rs"] +mod os_fs; // Local Variables: // mode: rust; diff --git a/src/test/compile-fail/mod-name-non-str.rc b/src/test/compile-fail/mod-name-non-str.rc deleted file mode 100644 index cf2efcea47c2..000000000000 --- a/src/test/compile-fail/mod-name-non-str.rc +++ /dev/null @@ -1,3 +0,0 @@ -// error-pattern: expected string literal -// Issue #1028 -mod ncurses = x; \ No newline at end of file diff --git a/src/test/run-pass/companionmod.rc b/src/test/run-pass/companionmod.rc index 405e5efc846e..f097954db1ab 100644 --- a/src/test/run-pass/companionmod.rc +++ b/src/test/run-pass/companionmod.rc @@ -1,10 +1,12 @@ // Test that crates and directory modules can contain code -mod a = "companionmod-src" { +#[path = "companionmod-src"] +mod a { mod b { mod x; } - mod c = "d" { + #[path = "d"] + mod c { mod x; } -} \ No newline at end of file +} diff --git a/src/test/run-pass/crate-attributes.rc b/src/test/run-pass/crate-attributes.rc index 5c95af166724..36304011a8c2 100644 --- a/src/test/run-pass/crate-attributes.rc +++ b/src/test/run-pass/crate-attributes.rc @@ -2,7 +2,8 @@ #[vers = "1.0"]; #[attr1] -mod m = "crate-attributes-src" { +#[path = "crate-attributes-src"] +mod m { #[attr_inner]; #[attr2] diff --git a/src/test/run-pass/multi.rc b/src/test/run-pass/multi.rc index 90f03ee99db6..7a89ac915ce1 100644 --- a/src/test/run-pass/multi.rc +++ b/src/test/run-pass/multi.rc @@ -1,6 +1,8 @@ -mod multi = "multi-src" { +#[path = "multi-src"] +mod multi { + // implicitly #[path = "foo.rs"] + mod foo; - mod foo; // implicitly = "foo.rs" - - mod bar = "bar.rs"; + #[path = "bar.rs"] + mod bar; }