]> git.lizzy.rs Git - rust.git/commitdiff
Implement unused features check
authorBrian Anderson <banderson@mozilla.com>
Fri, 16 Jan 2015 18:25:16 +0000 (10:25 -0800)
committerBrian Anderson <banderson@mozilla.com>
Thu, 22 Jan 2015 00:16:22 +0000 (16:16 -0800)
src/librustc/lint/builtin.rs
src/librustc/lint/context.rs
src/librustc/middle/stability.rs
src/librustc_driver/driver.rs

index 2d3e5a4604e08206cf2342634bb087481daeb071..8acf8b1032fa876862b4aa1cfbaaba8f67cd8558 100644 (file)
@@ -1734,9 +1734,9 @@ fn check_expr(&mut self, cx: &Context, e: &ast::Expr) {
 }
 
 declare_lint! {
-    pub UNKNOWN_FEATURES,
+    pub UNUSED_FEATURES,
     Deny,
-    "unknown features found in crate-level #[feature] directives"
+    "unused or unknown features found in crate-level #[feature] directives"
 }
 
 declare_lint! {
@@ -1780,7 +1780,7 @@ fn get_lints(&self) -> LintArray {
             DEAD_CODE,
             UNREACHABLE_CODE,
             WARNINGS,
-            UNKNOWN_FEATURES,
+            UNUSED_FEATURES,
             UNKNOWN_CRATE_TYPES,
             VARIANT_SIZE_DIFFERENCES,
             FAT_PTR_TRANSMUTES
index 1d27352a6e3bfd56f386d57a3521b6527d65e68b..2682df8b2ab53da22299af66e5a0db2968d5600d 100644 (file)
@@ -257,6 +257,7 @@ macro_rules! add_lint_group {
         self.register_renamed("transmute_fat_ptr", "fat_ptr_transmutes");
         self.register_renamed("raw_pointer_deriving", "raw_pointer_derive");
 
+        self.register_renamed("unknown_features", "unused_features");
     }
 
     #[allow(unused_variables)]
@@ -829,6 +830,5 @@ pub fn check_crate(tcx: &ty::ctxt,
         }
     }
 
-    tcx.sess.abort_if_errors();
     *tcx.node_lint_levels.borrow_mut() = cx.node_levels.into_inner();
 }
index 0554533a4aaa45f11517683b43c7f454cff6d897..b1f6a19ea3ede633822f8bf553091f378b4a4cdd 100644 (file)
@@ -12,6 +12,7 @@
 //! propagating default levels lexically from parent to children ast nodes.
 
 use session::Session;
+use lint;
 use middle::ty;
 use metadata::csearch;
 use syntax::parse::token::InternedString;
@@ -25,7 +26,7 @@
 use syntax::attr::{Stability, AttrMetaMethods};
 use syntax::visit::{FnKind, FkMethod, Visitor};
 use syntax::feature_gate::emit_feature_warn;
-use util::nodemap::{NodeMap, DefIdMap, FnvHashSet};
+use util::nodemap::{NodeMap, DefIdMap, FnvHashSet, FnvHashMap};
 use util::ppaux::Repr;
 
 use std::mem::replace;
@@ -418,13 +419,20 @@ pub fn lookup(tcx: &ty::ctxt, id: DefId) -> Option<Stability> {
 /// Given the list of enabled features that were not language features (i.e. that
 /// were expected to be library features), and the list of features used from
 /// libraries, identify activated features that don't exist and error about them.
-pub fn check_unknown_features(sess: &Session,
-                              _used_lib_features: &FnvHashSet<InternedString>) {
-    let ref _lib_features = sess.features.borrow().lib_features;
-    // TODO
-
-    //sess.add_lint(lint::builtin::UNKNOWN_FEATURES,
-    //              ast::CRATE_NODE_ID,
-    //              *uf,
-    //              "unknown feature".to_string());
+pub fn check_unused_features(sess: &Session,
+                             used_lib_features: &FnvHashSet<InternedString>) {
+    let ref lib_features = sess.features.borrow().lib_features;
+    let mut active_lib_features: FnvHashMap<InternedString, Span>
+        = lib_features.clone().into_iter().collect();
+
+    for used_feature in used_lib_features.iter() {
+        active_lib_features.remove(used_feature);
+    }
+
+    for (_, &span) in active_lib_features.iter() {
+        sess.add_lint(lint::builtin::UNUSED_FEATURES,
+                      ast::CRATE_NODE_ID,
+                      span,
+                      "unused or unknown feature".to_string());
+    }
 }
index 384f5af6819bd565d0bdbbaafbbc5b7a66ad3136..4626c5216bcae199989bf3251b46f834aa99874b 100644 (file)
@@ -668,14 +668,14 @@ pub fn phase_3_run_analysis_passes<'tcx>(sess: Session,
         time(time_passes, "stability checking", (), |_|
              stability::check_unstable_api_usage(&ty_cx));
 
-    time(time_passes, "unknown feature checking", (), |_|
-         stability::check_unknown_features(
+    time(time_passes, "unused feature checking", (), |_|
+         stability::check_unused_features(
              &ty_cx.sess, lib_features_used));
 
     time(time_passes, "lint checking", (), |_|
          lint::check_crate(&ty_cx, &exported_items));
 
-    // Some of the above passes generate errors
+    // The above three passes generate errors w/o aborting
     ty_cx.sess.abort_if_errors();
 
     ty::CrateAnalysis {