// option. This file may not be copied, modified, or distributed
// except according to those terms.
-use ast::{Block, Crate, DeclLocal, ExprMac, PatMac};
+use ast::{Block, Crate, DeclLocal, PatMac};
use ast::{Local, Ident, Mac_, Name};
use ast::{ItemMac, MacStmtWithSemicolon, Mrk, Stmt, StmtDecl, StmtMac};
use ast::{StmtExpr, StmtSemi};
use codemap;
use codemap::{Span, Spanned, ExpnInfo, NameAndSpan, MacroBang, MacroAttribute};
use ext::base::*;
-use feature_gate::{self, Features, GatedCfgAttr};
+use feature_gate::{self, Features};
use fold;
use fold::*;
use util::move_map::MoveMap;
let extname = pth.segments[0].identifier.name;
match fld.cx.syntax_env.find(extname) {
None => {
- fld.cx.span_err(
+ let mut err = fld.cx.struct_span_err(
pth.span,
&format!("macro undefined: '{}!'",
&extname));
- fld.cx.suggest_macro_name(&extname.as_str(), pth.span);
+ fld.cx.suggest_macro_name(&extname.as_str(), pth.span, &mut err);
+ err.emit();
// let compilation continue
None
for attr in attrs {
let mut is_use = attr.check_name("macro_use");
if attr.check_name("macro_escape") {
- fld.cx.span_warn(attr.span, "macro_escape is a deprecated synonym for macro_use");
+ let mut err =
+ fld.cx.struct_span_warn(attr.span,
+ "macro_escape is a deprecated synonym for macro_use");
is_use = true;
if let ast::AttrStyle::Inner = attr.node.style {
- fld.cx.fileline_help(attr.span, "consider an outer attribute, \
- #[macro_use] mod ...");
+ err.fileline_help(attr.span, "consider an outer attribute, \
+ #[macro_use] mod ...").emit();
+ } else {
+ err.emit();
}
};
}
}
-pub fn expand_crate<'feat>(parse_sess: &parse::ParseSess,
- cfg: ExpansionConfig<'feat>,
- // these are the macros being imported to this crate:
- imported_macros: Vec<ast::MacroDef>,
- user_exts: Vec<NamedSyntaxExtension>,
- feature_gated_cfgs: &mut Vec<GatedCfgAttr>,
- c: Crate) -> (Crate, HashSet<Name>) {
- let mut cx = ExtCtxt::new(parse_sess, c.config.clone(), cfg,
- feature_gated_cfgs);
+pub fn expand_crate(mut cx: ExtCtxt,
+ // these are the macros being imported to this crate:
+ imported_macros: Vec<ast::MacroDef>,
+ user_exts: Vec<NamedSyntaxExtension>,
+ c: Crate) -> (Crate, HashSet<Name>) {
if std_inject::no_core(&c) {
cx.crate_root = None;
} else if std_inject::no_std(&c) {
let mut ret = expander.fold_crate(c);
ret.exported_macros = expander.cx.exported_macros.clone();
- parse_sess.span_diagnostic.handler().abort_if_errors();
+ cx.parse_sess.span_diagnostic.abort_if_errors();
ret
};
return (ret, cx.syntax_env.names);
use ast;
use ast::Name;
use codemap;
+ use ext::base::ExtCtxt;
use ext::mtwt;
use fold::Folder;
use parse;
src,
Vec::new(), &sess);
// should fail:
- expand_crate(&sess,test_ecfg(),vec!(),vec!(), &mut vec![], crate_ast);
+ let mut gated_cfgs = vec![];
+ let ecx = ExtCtxt::new(&sess, vec![], test_ecfg(), &mut gated_cfgs);
+ expand_crate(ecx, vec![], vec![], crate_ast);
}
// make sure that macros can't escape modules
"<test>".to_string(),
src,
Vec::new(), &sess);
- expand_crate(&sess,test_ecfg(),vec!(),vec!(), &mut vec![], crate_ast);
+ let mut gated_cfgs = vec![];
+ let ecx = ExtCtxt::new(&sess, vec![], test_ecfg(), &mut gated_cfgs);
+ expand_crate(ecx, vec![], vec![], crate_ast);
}
// macro_use modules should allow macros to escape
"<test>".to_string(),
src,
Vec::new(), &sess);
- expand_crate(&sess, test_ecfg(), vec!(), vec!(), &mut vec![], crate_ast);
+ let mut gated_cfgs = vec![];
+ let ecx = ExtCtxt::new(&sess, vec![], test_ecfg(), &mut gated_cfgs);
+ expand_crate(ecx, vec![], vec![], crate_ast);
}
fn expand_crate_str(crate_str: String) -> ast::Crate {
let ps = parse::ParseSess::new();
let crate_ast = panictry!(string_to_parser(&ps, crate_str).parse_crate_mod());
// the cfg argument actually does matter, here...
- expand_crate(&ps,test_ecfg(),vec!(),vec!(), &mut vec![], crate_ast).0
+ let mut gated_cfgs = vec![];
+ let ecx = ExtCtxt::new(&ps, vec![], test_ecfg(), &mut gated_cfgs);
+ expand_crate(ecx, vec![], vec![], crate_ast).0
}
// find the pat_ident paths in a crate