about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2013-07-16 21:12:16 -0700
committerAlex Crichton <alex@alexcrichton.com>2013-07-16 21:28:10 -0700
commit0fd4d5d7783ffa709bcf089f5167a1871ec278fa (patch)
tree2164c0143e85d04a4a7c58818cd91ac48ae0cf2c
parent9db190305f7562f15b5282fed508aef81cfc9689 (diff)
downloadrust-0fd4d5d7783ffa709bcf089f5167a1871ec278fa.tar.gz
rust-0fd4d5d7783ffa709bcf089f5167a1871ec278fa.zip
Sort lint attributes to print them in a more sane way
Closes #7818
-rw-r--r--src/librustc/middle/lint.rs9
-rw-r--r--src/librustc/rustc.rs25
2 files changed, 21 insertions, 13 deletions
diff --git a/src/librustc/middle/lint.rs b/src/librustc/middle/lint.rs
index b679da714a1..d18fbada009 100644
--- a/src/librustc/middle/lint.rs
+++ b/src/librustc/middle/lint.rs
@@ -108,17 +108,22 @@ pub fn level_to_str(lv: level) -> &'static str {
     }
 }
 
-#[deriving(Eq)]
+#[deriving(Eq, Ord)]
 pub enum level {
     allow, warn, deny, forbid
 }
 
-struct LintSpec {
+#[deriving(Eq)]
+pub struct LintSpec {
     lint: lint,
     desc: &'static str,
     default: level
 }
 
+impl Ord for LintSpec {
+    fn lt(&self, other: &LintSpec) -> bool { self.default < other.default }
+}
+
 pub type LintDict = HashMap<&'static str, LintSpec>;
 
 enum AttributedNode<'self> {
diff --git a/src/librustc/rustc.rs b/src/librustc/rustc.rs
index 787d8d5685a..6f638959bc8 100644
--- a/src/librustc/rustc.rs
+++ b/src/librustc/rustc.rs
@@ -144,6 +144,7 @@ Additional help:
 }
 
 pub fn describe_warnings() {
+    use extra::sort::Sort;
     io::println(fmt!("
 Available lint options:
     -W <foo>           Warn about <foo>
@@ -153,8 +154,15 @@ Available lint options:
 "));
 
     let lint_dict = lint::get_lint_dict();
+    let mut lint_dict = lint_dict.consume_iter()
+                                 .transform(|(k, v)| (v, k))
+                                 .collect::<~[(lint::LintSpec, &'static str)]>();
+    lint_dict.qsort();
+
     let mut max_key = 0;
-    for lint_dict.each_key |k| { max_key = num::max(k.len(), max_key); }
+    for lint_dict.iter().advance |&(_, name)| {
+        max_key = num::max(name.len(), max_key);
+    }
     fn padded(max: uint, s: &str) -> ~str {
         str::from_bytes(vec::from_elem(max - s.len(), ' ' as u8)) + s
     }
@@ -163,17 +171,12 @@ Available lint options:
                      padded(max_key, "name"), "default", "meaning"));
     io::println(fmt!("    %s  %7.7s  %s\n",
                      padded(max_key, "----"), "-------", "-------"));
-    for lint_dict.iter().advance |(k, v)| {
-        let k = k.replace("_", "-");
+    for lint_dict.consume_iter().advance |(spec, name)| {
+        let name = name.replace("_", "-");
         io::println(fmt!("    %s  %7.7s  %s",
-                         padded(max_key, k),
-                         match v.default {
-                             lint::allow => ~"allow",
-                             lint::warn => ~"warn",
-                             lint::deny => ~"deny",
-                             lint::forbid => ~"forbid"
-                         },
-                         v.desc));
+                         padded(max_key, name),
+                         lint::level_to_str(spec.default),
+                         spec.desc));
     }
     io::println("");
 }