1 #![doc(html_root_url = "https://doc.rust-lang.org/nightly/")]
2 #![feature(bool_to_option)]
3 #![feature(core_intrinsics)]
4 #![feature(crate_visibility_modifier)]
5 #![feature(drain_filter)]
6 #![feature(in_band_lifetimes)]
8 #![feature(proc_macro_internals)]
9 #![feature(specialization)]
10 #![feature(stmt_expr_attributes)]
11 #![recursion_limit = "256"]
14 extern crate proc_macro;
19 extern crate rustc_data_structures;
21 pub use rmeta::{provide, provide_extern};
23 mod dependency_format;
33 pub fn validate_crate_name(
34 sess: Option<&rustc::session::Session>,
36 sp: Option<rustc_span::Span>,
38 let mut err_count = 0;
40 let mut say = |s: &str| {
42 (_, None) => bug!("{}", s),
43 (Some(sp), Some(sess)) => sess.span_err(sp, s),
44 (None, Some(sess)) => sess.err(s),
49 say("crate name must not be empty");
52 if c.is_alphanumeric() {
58 say(&format!("invalid character `{}` in crate name: `{}`", c, s));
63 sess.unwrap().abort_if_errors();