From f55bb61fdcccc1011b3be577941936f9dbb44df3 Mon Sep 17 00:00:00 2001 From: Haitao Li Date: Tue, 22 Nov 2011 13:01:28 +0800 Subject: [PATCH 1/2] rustc: Accepts `path` attributes for crate directives Temporarily allow path specified in either as attribute or in AST, like: #[path = "mymod.rs"] mod mymod = "mymod.rs"; This is a transitional commit to avoid creating a stage1 snapshot. --- src/comp/syntax/parse/parser.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/comp/syntax/parse/parser.rs b/src/comp/syntax/parse/parser.rs index 02d907aba8c84..32e66870bbc64 100644 --- a/src/comp/syntax/parse/parser.rs +++ b/src/comp/syntax/parse/parser.rs @@ -2505,7 +2505,9 @@ fn parse_crate_directive(p: parser, first_outer_attr: [ast::attribute]) -> let file_opt = alt p.peek() { token::EQ. { p.bump(); some(parse_str(p)) } - _ { none } + _ { + attr::get_meta_item_value_str_by_name(outer_attrs, "path") + } }; alt p.peek() { // mod x = "foo.rs"; From e8b290c0508df14536580258c75ced07d8db651e Mon Sep 17 00:00:00 2001 From: Haitao Li Date: Tue, 22 Nov 2011 12:31:09 +0800 Subject: [PATCH 2/2] 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 df9f85a9f813d..be97a80380104 100644 --- a/doc/rust.texi +++ b/doc/rust.texi @@ -1095,9 +1095,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 8f8a141451398..dfd9efb07bbdd 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 24bb3e8d68b3f..7bcf124e07463 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); cdir_auth(path, _auth); diff --git a/src/comp/syntax/fold.rs b/src/comp/syntax/fold.rs index 0eab97481bc35..79d8bf3f81198 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 7e1e93d5b70aa..874fa6f7b980a 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 32e66870bbc64..d07f00bf02dcf 100644 --- a/src/comp/syntax/parse/parser.rs +++ b/src/comp/syntax/parse/parser.rs @@ -2502,19 +2502,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. { @@ -2527,7 +2520,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 48f5bd1329ffe..565f7dc7abc52 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 87184d5e9055b..b3974ae0f5023 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; @@ -99,19 +100,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; // FIXME: This doesn't do anything. 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 cf2efcea47c29..0000000000000 --- 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 405e5efc846ed..f097954db1ab9 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 5c95af1667242..36304011a8c21 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 90f03ee99db6b..7a89ac915ce10 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; }