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.
This commit is contained in:
parent
547ec241bd
commit
3e303af86b
12 changed files with 57 additions and 44 deletions
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)) }
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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); }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue