From 21e7b936d3a669b62e9cb8c6b2cf2c2eb0a5986c Mon Sep 17 00:00:00 2001 From: Keegan McAllister Date: Fri, 13 Jun 2014 13:04:52 -0700 Subject: [PATCH] Use names in Lint structs in an ASCII-case-insensitive way In preparation for the next commit. --- src/librustc/driver/mod.rs | 3 ++- src/librustc/lint/context.rs | 13 +++++++------ src/librustc/lint/mod.rs | 24 ++++++++++++++++++------ 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/librustc/driver/mod.rs b/src/librustc/driver/mod.rs index 7c8f5a90b5a..018477c48c7 100644 --- a/src/librustc/driver/mod.rs +++ b/src/librustc/driver/mod.rs @@ -146,6 +146,7 @@ fn sort_lints(lints: Vec<(&'static Lint, bool)>) -> Vec<&'static Lint> { let mut lints: Vec<_> = lints.move_iter().map(|(x, _)| x).collect(); lints.sort_by(|x: &&Lint, y: &&Lint| { match x.default_level.cmp(&y.default_level) { + // The sort doesn't case-fold but it's doubtful we care. Equal => x.name.cmp(&y.name), r => r, } @@ -172,7 +173,7 @@ fn sort_lints(lints: Vec<(&'static Lint, bool)>) -> Vec<&'static Lint> { let print_lints = |lints: Vec<&Lint>| { for lint in lints.move_iter() { - let name = lint.name.replace("_", "-"); + let name = lint.name_lower().replace("_", "-"); println!(" {} {:7.7s} {}", padded(name.as_slice()), lint.default_level.as_str(), lint.desc); } diff --git a/src/librustc/lint/context.rs b/src/librustc/lint/context.rs index bc92d69a747..0b843e84561 100644 --- a/src/librustc/lint/context.rs +++ b/src/librustc/lint/context.rs @@ -61,7 +61,7 @@ pub struct LintStore { passes: Option>, /// Lints indexed by name. - by_name: HashMap<&'static str, LintId>, + by_name: HashMap, /// Current levels of each lint, and where they were set. levels: HashMap, @@ -102,8 +102,8 @@ pub fn register_pass(&mut self, sess: Option<&Session>, self.lints.push((lint, from_plugin)); let id = LintId::of(lint); - if !self.by_name.insert(lint.name, id) { - let msg = format!("duplicate specification of lint {}", lint.name); + if !self.by_name.insert(lint.name_lower(), id) { + let msg = format!("duplicate specification of lint {}", lint.name_lower()); match (sess, from_plugin) { // We load builtin lints first, so a duplicate is a compiler bug. // Use early_error when handling -W help with no crate. @@ -205,18 +205,19 @@ pub fn raw_emit_lint(sess: &Session, lint: &'static Lint, let (mut level, source) = lvlsrc; if level == Allow { return } + let name = lint.name_lower(); let mut note = None; let msg = match source { Default => { format!("{}, #[{}({})] on by default", msg, - level.as_str(), lint.name) + level.as_str(), name) }, CommandLine => { format!("{} [-{} {}]", msg, match level { Warn => 'W', Deny => 'D', Forbid => 'F', Allow => fail!() - }, lint.name.replace("_", "-")) + }, name.replace("_", "-")) }, Node(src) => { note = Some(src); @@ -355,7 +356,7 @@ fn gather_lint_attrs(&mut self, attrs: &[ast::Attribute]) -> Vec<(LintId, Level, for meta in metas.iter() { match meta.node { ast::MetaWord(ref lint_name) => { - match self.lints.by_name.find_equiv(lint_name) { + match self.lints.by_name.find_equiv(&lint_name.get()) { Some(lint_id) => out.push((*lint_id, level, meta.span)), None => self.span_lint(builtin::unrecognized_lint, diff --git a/src/librustc/lint/mod.rs b/src/librustc/lint/mod.rs index ea7023b3bc8..598c5dd3002 100644 --- a/src/librustc/lint/mod.rs +++ b/src/librustc/lint/mod.rs @@ -31,6 +31,7 @@ use middle::privacy::ExportedItems; use std::hash; +use std::ascii::StrAsciiExt; use syntax::codemap::Span; use syntax::visit::FnKind; use syntax::ast; @@ -41,10 +42,14 @@ pub struct Lint { /// A string identifier for the lint. /// - /// Written with underscores, e.g. "unused_imports". - /// This identifies the lint in attributes and in - /// command-line arguments. On the command line, - /// underscores become dashes. + /// This identifies the lint in attributes and in command-line arguments. + /// In those contexts it is always lowercase, but this field is compared + /// in a way which is case-insensitive for ASCII characters. This allows + /// `declare_lint!()` invocations to follow the convention of upper-case + /// statics without repeating the name. + /// + /// The name is written with underscores, e.g. "unused_imports". + /// On the command line, underscores become dashes. pub name: &'static str, /// Default level for the lint. @@ -56,6 +61,13 @@ pub struct Lint { pub desc: &'static str, } +impl Lint { + /// Get the lint's name, with ASCII letters converted to lowercase. + pub fn name_lower(&self) -> String { + self.name.to_ascii_lower() + } +} + /// Build a `Lint` initializer. #[macro_export] macro_rules! lint_initializer ( @@ -186,8 +198,8 @@ pub fn of(lint: &'static Lint) -> LintId { } /// Get the name of the lint. - pub fn as_str(&self) -> &'static str { - self.lint.name + pub fn as_str(&self) -> String { + self.lint.name_lower() } } -- 2.44.0