]> git.lizzy.rs Git - rust.git/commitdiff
rustc: Add a path attribute for crate directives
authorHaitao Li <lihaitao@gmail.com>
Tue, 22 Nov 2011 04:31:09 +0000 (12:31 +0800)
committerBrian Anderson <banderson@mozilla.com>
Thu, 24 Nov 2011 23:31:18 +0000 (15:31 -0800)
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.

12 files changed:
doc/rust.texi
src/comp/rustc.rc
src/comp/syntax/ast.rs
src/comp/syntax/fold.rs
src/comp/syntax/parse/eval.rs
src/comp/syntax/parse/parser.rs
src/comp/syntax/visit.rs
src/lib/std.rc
src/test/compile-fail/mod-name-non-str.rc [deleted file]
src/test/run-pass/companionmod.rc
src/test/run-pass/crate-attributes.rc
src/test/run-pass/multi.rc

index 86cdee2b4dbf82501dba070391433ecf2f23e9cd..09524a8055de1b2afc5ddd61bd79b6d4e1411c7e 100644 (file)
@@ -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
 
index 238030621fe5ff027f4c67b1806af31836838401..782faab69a2854933254b0fa057241012def33a5 100644 (file)
@@ -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;
index ecba4efceca96ccf4f795efbeede0f393cc229ca..47e254aa01108cbb3188746f91c49be6f144dec6 100644 (file)
@@ -58,8 +58,8 @@
      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);
 }
index f9c23b4de2505eb96d58aa77ca4eb9f86b5b544b..78340593f687c104140cc63e86276acb7b51c8d3 100644 (file)
@@ -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)) }
index 2c1c0155cf056b17c317aa1b65e3ba7d80621b62..bc8a51e1f3436ffe2510361b5ecdda40d9e70335 100644 (file)
@@ -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 file_exists(path: str) -> bool {
     }
 }
 
+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
index 4f81a1dfe731607b379d60f072aa2f4a2cdf2b89..82c477a7d968c0485db57a9cb481f99a9d62784c 100644 (file)
@@ -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); }
         }
index 5273d16e544caa7f4516c69ef5fca44ed852c096..45249be23a6ea53518635890606cd1e502ad9f76 100644 (file)
@@ -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);
         }
index 1d1c69e7be4e54e5c447121f1fee6f451da1381f..fdee46a8ffd16fc8e5150831a331cb9e42ac087b 100644 (file)
@@ -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 (file)
index cf2efce..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-// error-pattern: expected string literal
-// Issue #1028
-mod ncurses = x;
\ No newline at end of file
index 405e5efc846ed1dc8ae7a2ee91f6f9755cd8fdcf..f097954db1ab91c7a5fad81b1c4f6c3ce978ee53 100644 (file)
@@ -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
+}
index 5c95af16672428845ce0b2c7e127d948ba302963..36304011a8c21b53809501aacc3a19451a3c882d 100644 (file)
@@ -2,7 +2,8 @@
 #[vers = "1.0"];
 
 #[attr1]
-mod m = "crate-attributes-src" {
+#[path = "crate-attributes-src"]
+mod m {
   #[attr_inner];
 
   #[attr2]
index 90f03ee99db6bc41ef22c51a3e489ed12cf13f9a..7a89ac915ce10ed2b356b24b7a4bf82eb56be9ce 100644 (file)
@@ -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;
 }