1 #![doc(html_logo_url = "https://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png",
2 html_favicon_url = "https://doc.rust-lang.org/favicon.ico",
3 html_root_url = "https://doc.rust-lang.org/nightly/")]
5 #![feature(box_patterns)]
8 #![feature(proc_macro_internals)]
9 #![feature(proc_macro_quote)]
10 #![feature(rustc_diagnostic_macros)]
11 #![feature(slice_sort_by_cached_key)]
12 #![feature(crate_visibility_modifier)]
13 #![feature(specialization)]
14 #![feature(rustc_private)]
16 #![recursion_limit="256"]
22 extern crate stable_deref_trait;
25 extern crate syntax_pos;
27 extern crate serialize as rustc_serialize; // used by deriving
28 extern crate rustc_errors as errors;
29 extern crate syntax_ext;
30 extern crate proc_macro;
34 extern crate rustc_target;
36 extern crate rustc_data_structures;
56 pub fn validate_crate_name(
57 sess: Option<&rustc::session::Session>,
59 sp: Option<syntax_pos::Span>
61 let mut err_count = 0;
63 let mut say = |s: &str| {
65 (_, None) => bug!("{}", s),
66 (Some(sp), Some(sess)) => sess.span_err(sp, s),
67 (None, Some(sess)) => sess.err(s),
72 say("crate name must not be empty");
75 if c.is_alphanumeric() { continue }
76 if c == '_' { continue }
77 say(&format!("invalid character `{}` in crate name: `{}`", c, s));
82 sess.unwrap().abort_if_errors();
86 __build_diagnostic_array! { librustc_metadata, DIAGNOSTICS }