|
1 | 1 | use parser::{Parser, SOURCE_FILE}; |
2 | 2 | use attr::parser_attr; |
| 3 | +use ast_util::mk_sp; |
3 | 4 |
|
4 | 5 | export eval_crate_directives_to_mod; |
| 6 | +export eval_src_mod; |
5 | 7 |
|
6 | 8 | type ctx = |
7 | 9 | @{sess: parse::parse_sess, |
@@ -79,29 +81,46 @@ fn cdir_path_opt(default: ~str, attrs: ~[ast::attribute]) -> ~str { |
79 | 81 | } |
80 | 82 | } |
81 | 83 |
|
| 84 | +fn eval_src_mod(cx: ctx, prefix: &Path, id: ast::ident, |
| 85 | + outer_attrs: ~[ast::attribute]) -> (ast::item_, ~[ast::attribute]) { |
| 86 | + let file_path = Path(cdir_path_opt( |
| 87 | + cx.sess.interner.get(id) + ~".rs", outer_attrs)); |
| 88 | + let full_path = if file_path.is_absolute { |
| 89 | + copy file_path |
| 90 | + } else { |
| 91 | + prefix.push_many(file_path.components) |
| 92 | + }; |
| 93 | + let p0 = |
| 94 | + new_parser_from_file(cx.sess, cx.cfg, |
| 95 | + &full_path, SOURCE_FILE); |
| 96 | + let inner_attrs = p0.parse_inner_attrs_and_next(); |
| 97 | + let mod_attrs = vec::append(outer_attrs, inner_attrs.inner); |
| 98 | + let first_item_outer_attrs = inner_attrs.next; |
| 99 | + let m0 = p0.parse_mod_items(token::EOF, first_item_outer_attrs); |
| 100 | + return (ast::item_mod(m0), mod_attrs); |
| 101 | +} |
| 102 | + |
| 103 | +// XXX: Duplicated from parser.rs |
| 104 | +fn mk_item(ctx: ctx, lo: BytePos, hi: BytePos, +ident: ast::ident, |
| 105 | + +node: ast::item_, vis: ast::visibility, |
| 106 | + +attrs: ~[ast::attribute]) -> @ast::item { |
| 107 | + return @{ident: ident, |
| 108 | + attrs: attrs, |
| 109 | + id: next_node_id(ctx.sess), |
| 110 | + node: node, |
| 111 | + vis: vis, |
| 112 | + span: mk_sp(lo, hi)}; |
| 113 | +} |
| 114 | + |
82 | 115 | fn eval_crate_directive(cx: ctx, cdir: @ast::crate_directive, prefix: &Path, |
83 | 116 | view_items: &mut ~[@ast::view_item], |
84 | 117 | items: &mut ~[@ast::item]) { |
85 | 118 | match cdir.node { |
86 | 119 | ast::cdir_src_mod(vis, id, attrs) => { |
87 | | - let file_path = Path(cdir_path_opt( |
88 | | - cx.sess.interner.get(id) + ~".rs", attrs)); |
89 | | - let full_path = if file_path.is_absolute { |
90 | | - copy file_path |
91 | | - } else { |
92 | | - prefix.push_many(file_path.components) |
93 | | - }; |
94 | | - let p0 = |
95 | | - new_parser_from_file(cx.sess, cx.cfg, |
96 | | - &full_path, SOURCE_FILE); |
97 | | - let inner_attrs = p0.parse_inner_attrs_and_next(); |
98 | | - let mod_attrs = vec::append(attrs, inner_attrs.inner); |
99 | | - let first_item_outer_attrs = inner_attrs.next; |
100 | | - let m0 = p0.parse_mod_items(token::EOF, first_item_outer_attrs); |
101 | | - |
102 | | - let i = p0.mk_item(cdir.span.lo, cdir.span.hi, |
| 120 | + let (m, mod_attrs) = eval_src_mod(cx, prefix, id, attrs); |
| 121 | + let i = mk_item(cx, cdir.span.lo, cdir.span.hi, |
103 | 122 | /* FIXME (#2543) */ copy id, |
104 | | - ast::item_mod(m0), vis, mod_attrs); |
| 123 | + m, vis, mod_attrs); |
105 | 124 | items.push(i); |
106 | 125 | } |
107 | 126 | ast::cdir_dir_mod(vis, id, cdirs, attrs) => { |
|
0 commit comments