]> git.lizzy.rs Git - rust.git/commitdiff
Use names in Lint structs in an ASCII-case-insensitive way
authorKeegan McAllister <kmcallister@mozilla.com>
Fri, 13 Jun 2014 20:04:52 +0000 (13:04 -0700)
committerKeegan McAllister <kmcallister@mozilla.com>
Tue, 24 Jun 2014 18:36:27 +0000 (11:36 -0700)
In preparation for the next commit.

src/librustc/driver/mod.rs
src/librustc/lint/context.rs
src/librustc/lint/mod.rs

index 7c8f5a90b5a80a4cad53dec0bafb0f91f89993a0..018477c48c783fccf91c2222e5f9fcb2e599cdaf 100644 (file)
@@ -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);
         }
index bc92d69a747c4b3dbd7d4ecd35252ada5d045d5f..0b843e84561496232a54048d28332cdc116ee3b6 100644 (file)
@@ -61,7 +61,7 @@ pub struct LintStore {
     passes: Option<Vec<LintPassObject>>,
 
     /// Lints indexed by name.
-    by_name: HashMap<&'static str, LintId>,
+    by_name: HashMap<String, LintId>,
 
     /// Current levels of each lint, and where they were set.
     levels: HashMap<LintId, LevelSource>,
@@ -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,
index ea7023b3bc82c944955552c7882bab1946109420..598c5dd3002f7974c62700db925ecc4df1fb25b3 100644 (file)
@@ -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;
 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()
     }
 }