1 #![doc(html_root_url = "https://doc.rust-lang.org/nightly/")]
3 #![feature(box_patterns)]
4 #![feature(core_intrinsics)]
5 #![feature(crate_visibility_modifier)]
6 #![feature(drain_filter)]
7 #![feature(in_band_lifetimes)]
10 #![feature(proc_macro_internals)]
11 #![feature(proc_macro_quote)]
12 #![feature(rustc_private)]
13 #![feature(slice_patterns)]
14 #![feature(specialization)]
15 #![feature(stmt_expr_attributes)]
17 #![recursion_limit="256"]
20 extern crate proc_macro;
25 extern crate rustc_data_structures;
27 pub use rmeta::{provide, provide_extern};
29 mod dependency_format;
39 pub fn validate_crate_name(
40 sess: Option<&rustc::session::Session>,
42 sp: Option<syntax_pos::Span>
44 let mut err_count = 0;
46 let mut say = |s: &str| {
48 (_, None) => bug!("{}", s),
49 (Some(sp), Some(sess)) => sess.span_err(sp, s),
50 (None, Some(sess)) => sess.err(s),
55 say("crate name must not be empty");
58 if c.is_alphanumeric() { continue }
59 if c == '_' { continue }
60 say(&format!("invalid character `{}` in crate name: `{}`", c, s));
65 sess.unwrap().abort_if_errors();