]> git.lizzy.rs Git - rust.git/blobdiff - src/lib.rs
fallout
[rust.git] / src / lib.rs
index 0a51385f6f25fb7958e792477738a61e53444adb..9e83a96fee689e085ef0f66519d4cea6197d22c5 100644 (file)
-#![feature(type_macros)]
-#![feature(plugin_registrar, box_syntax)]
-#![feature(rustc_private, collections)]
-#![feature(iter_arith)]
-#![feature(custom_attribute)]
-#![feature(slice_patterns)]
-#![allow(indexing_slicing, shadow_reuse, unknown_lints)]
-
-// this only exists to allow the "dogfood" integration test to work
-#[allow(dead_code)]
-#[allow(print_stdout)]
-fn main() {
-    println!("What are you doing? Don't run clippy as an executable");
-}
-
-#[macro_use]
-extern crate syntax;
-#[macro_use]
-extern crate rustc;
-#[macro_use]
-extern crate rustc_front;
-
-extern crate toml;
-
-// Only for the compile time checking of paths
-extern crate core;
-extern crate collections;
-
-// for unicode nfc normalization
-extern crate unicode_normalization;
-
-// for semver check in attrs.rs
-extern crate semver;
-
-// for regex checking
-extern crate regex_syntax;
+// error-pattern:cargo-clippy
+#![feature(plugin_registrar)]
+#![feature(rustc_private)]
+#![allow(unknown_lints)]
+#![feature(borrow_state)]
 
 extern crate rustc_plugin;
-extern crate rustc_const_eval;
 use rustc_plugin::Registry;
 
-pub mod consts;
-#[macro_use]
-pub mod utils;
-
-// begin lints modules, do not remove this comment, it’s used in `update_lints`
-pub mod approx_const;
-pub mod array_indexing;
-pub mod attrs;
-pub mod bit_mask;
-pub mod blacklisted_name;
-pub mod block_in_if_condition;
-pub mod collapsible_if;
-pub mod copies;
-pub mod cyclomatic_complexity;
-pub mod derive;
-pub mod doc;
-pub mod drop_ref;
-pub mod entry;
-pub mod enum_clike;
-pub mod enum_glob_use;
-pub mod enum_variants;
-pub mod eq_op;
-pub mod escape;
-pub mod eta_reduction;
-pub mod format;
-pub mod formatting;
-pub mod functions;
-pub mod identity_op;
-pub mod if_not_else;
-pub mod items_after_statements;
-pub mod len_zero;
-pub mod lifetimes;
-pub mod loops;
-pub mod map_clone;
-pub mod matches;
-pub mod methods;
-pub mod minmax;
-pub mod misc;
-pub mod misc_early;
-pub mod mut_mut;
-pub mod mut_reference;
-pub mod mutex_atomic;
-pub mod needless_bool;
-pub mod needless_update;
-pub mod new_without_default;
-pub mod no_effect;
-pub mod non_expressive_names;
-pub mod open_options;
-pub mod overflow_check_conditional;
-pub mod panic;
-pub mod precedence;
-pub mod print;
-pub mod ptr_arg;
-pub mod ranges;
-pub mod regex;
-pub mod returns;
-pub mod shadow;
-pub mod strings;
-pub mod swap;
-pub mod temporary_assignment;
-pub mod transmute;
-pub mod types;
-pub mod unicode;
-pub mod unused_label;
-pub mod vec;
-pub mod zero_div_zero;
-// end lints modules, do not remove this comment, it’s used in `update_lints`
-
-mod reexport {
-    pub use syntax::ast::{Name, NodeId};
-}
+extern crate clippy_lints;
 
 #[plugin_registrar]
-#[cfg_attr(rustfmt, rustfmt_skip)]
 pub fn plugin_registrar(reg: &mut Registry) {
-    let conf = match utils::conf::conf_file(reg.args()) {
-        Ok(file_name) => {
-            // if the user specified a file, it must exist, otherwise default to `clippy.toml` but
-            // do not require the file to exist
-            let (ref file_name, must_exist) = if let Some(ref file_name) = file_name {
-                (&**file_name, true)
-            } else {
-                ("clippy.toml", false)
-            };
-
-            let (conf, errors) = utils::conf::read_conf(&file_name, must_exist);
-
-            // all conf errors are non-fatal, we just use the default conf in case of error
-            for error in errors {
-                reg.sess.struct_err(&format!("error reading Clippy's configuration file: {}", error)).emit();
-            }
-
-            conf
-        }
-        Err((err, span)) => {
-            reg.sess.struct_span_err(span, err)
-                    .span_note(span, "Clippy will use default configuration")
-                    .emit();
-            utils::conf::Conf::default()
-        }
-    };
-
-    let mut store = reg.sess.lint_store.borrow_mut();
-    store.register_removed("unstable_as_slice", "`Vec::as_slice` has been stabilized in 1.7");
-    store.register_removed("unstable_as_mut_slice", "`Vec::as_mut_slice` has been stabilized in 1.7");
-    store.register_removed("str_to_string", "using `str::to_string` is common even today and specialization will likely happen soon");
-    store.register_removed("string_to_string", "using `string::to_string` is common even today and specialization will likely happen soon");
-    // end deprecated lints, do not remove this comment, it’s used in `update_lints`
-
-    reg.register_late_lint_pass(box types::TypePass);
-    reg.register_late_lint_pass(box misc::TopLevelRefPass);
-    reg.register_late_lint_pass(box misc::CmpNan);
-    reg.register_late_lint_pass(box eq_op::EqOp);
-    reg.register_early_lint_pass(box enum_variants::EnumVariantNames);
-    reg.register_late_lint_pass(box enum_glob_use::EnumGlobUse);
-    reg.register_late_lint_pass(box enum_clike::EnumClikeUnportableVariant);
-    reg.register_late_lint_pass(box bit_mask::BitMask);
-    reg.register_late_lint_pass(box ptr_arg::PtrArg);
-    reg.register_late_lint_pass(box needless_bool::NeedlessBool);
-    reg.register_late_lint_pass(box needless_bool::BoolComparison);
-    reg.register_late_lint_pass(box approx_const::ApproxConstant);
-    reg.register_late_lint_pass(box misc::FloatCmp);
-    reg.register_early_lint_pass(box precedence::Precedence);
-    reg.register_late_lint_pass(box eta_reduction::EtaPass);
-    reg.register_late_lint_pass(box identity_op::IdentityOp);
-    reg.register_early_lint_pass(box items_after_statements::ItemsAfterStatements);
-    reg.register_late_lint_pass(box mut_mut::MutMut);
-    reg.register_late_lint_pass(box mut_reference::UnnecessaryMutPassed);
-    reg.register_late_lint_pass(box len_zero::LenZero);
-    reg.register_late_lint_pass(box misc::CmpOwned);
-    reg.register_late_lint_pass(box attrs::AttrPass);
-    reg.register_late_lint_pass(box collapsible_if::CollapsibleIf);
-    reg.register_late_lint_pass(box block_in_if_condition::BlockInIfCondition);
-    reg.register_late_lint_pass(box misc::ModuloOne);
-    reg.register_late_lint_pass(box unicode::Unicode);
-    reg.register_late_lint_pass(box strings::StringAdd);
-    reg.register_early_lint_pass(box returns::ReturnPass);
-    reg.register_late_lint_pass(box methods::MethodsPass);
-    reg.register_late_lint_pass(box shadow::ShadowPass);
-    reg.register_late_lint_pass(box types::LetPass);
-    reg.register_late_lint_pass(box types::UnitCmp);
-    reg.register_late_lint_pass(box loops::LoopsPass);
-    reg.register_late_lint_pass(box lifetimes::LifetimePass);
-    reg.register_late_lint_pass(box entry::HashMapLint);
-    reg.register_late_lint_pass(box ranges::StepByZero);
-    reg.register_late_lint_pass(box types::CastPass);
-    reg.register_late_lint_pass(box types::TypeComplexityPass::new(conf.type_complexity_threshold));
-    reg.register_late_lint_pass(box matches::MatchPass);
-    reg.register_late_lint_pass(box misc::PatternPass);
-    reg.register_late_lint_pass(box minmax::MinMaxPass);
-    reg.register_late_lint_pass(box open_options::NonSensicalOpenOptions);
-    reg.register_late_lint_pass(box zero_div_zero::ZeroDivZeroPass);
-    reg.register_late_lint_pass(box mutex_atomic::MutexAtomic);
-    reg.register_late_lint_pass(box needless_update::NeedlessUpdatePass);
-    reg.register_late_lint_pass(box no_effect::NoEffectPass);
-    reg.register_late_lint_pass(box map_clone::MapClonePass);
-    reg.register_late_lint_pass(box temporary_assignment::TemporaryAssignmentPass);
-    reg.register_late_lint_pass(box transmute::Transmute);
-    reg.register_late_lint_pass(box cyclomatic_complexity::CyclomaticComplexity::new(conf.cyclomatic_complexity_threshold));
-    reg.register_late_lint_pass(box escape::EscapePass);
-    reg.register_early_lint_pass(box misc_early::MiscEarly);
-    reg.register_late_lint_pass(box misc::UsedUnderscoreBinding);
-    reg.register_late_lint_pass(box array_indexing::ArrayIndexing);
-    reg.register_late_lint_pass(box panic::PanicPass);
-    reg.register_late_lint_pass(box strings::StringLitAsBytes);
-    reg.register_late_lint_pass(box derive::Derive);
-    reg.register_late_lint_pass(box types::CharLitAsU8);
-    reg.register_late_lint_pass(box print::PrintLint);
-    reg.register_late_lint_pass(box vec::UselessVec);
-    reg.register_early_lint_pass(box non_expressive_names::NonExpressiveNames {
-        max_single_char_names: conf.max_single_char_names,
-    });
-    reg.register_late_lint_pass(box drop_ref::DropRefPass);
-    reg.register_late_lint_pass(box types::AbsurdExtremeComparisons);
-    reg.register_late_lint_pass(box regex::RegexPass::default());
-    reg.register_late_lint_pass(box copies::CopyAndPaste);
-    reg.register_late_lint_pass(box format::FormatMacLint);
-    reg.register_early_lint_pass(box formatting::Formatting);
-    reg.register_late_lint_pass(box swap::Swap);
-    reg.register_early_lint_pass(box if_not_else::IfNotElse);
-    reg.register_late_lint_pass(box overflow_check_conditional::OverflowCheckConditional);
-    reg.register_late_lint_pass(box unused_label::UnusedLabel);
-    reg.register_late_lint_pass(box new_without_default::NewWithoutDefault);
-    reg.register_late_lint_pass(box blacklisted_name::BlackListedName::new(conf.blacklisted_names));
-    reg.register_late_lint_pass(box functions::Functions::new(conf.too_many_arguments_threshold));
-    reg.register_early_lint_pass(box doc::Doc);
-
-    reg.register_lint_group("clippy_pedantic", vec![
-        array_indexing::INDEXING_SLICING,
-        enum_glob_use::ENUM_GLOB_USE,
-        matches::SINGLE_MATCH_ELSE,
-        methods::OPTION_UNWRAP_USED,
-        methods::RESULT_UNWRAP_USED,
-        methods::WRONG_PUB_SELF_CONVENTION,
-        mut_mut::MUT_MUT,
-        mutex_atomic::MUTEX_INTEGER,
-        print::PRINT_STDOUT,
-        print::USE_DEBUG,
-        shadow::SHADOW_REUSE,
-        shadow::SHADOW_SAME,
-        shadow::SHADOW_UNRELATED,
-        strings::STRING_ADD,
-        strings::STRING_ADD_ASSIGN,
-        types::CAST_POSSIBLE_TRUNCATION,
-        types::CAST_POSSIBLE_WRAP,
-        types::CAST_PRECISION_LOSS,
-        types::CAST_SIGN_LOSS,
-        unicode::NON_ASCII_LITERAL,
-        unicode::UNICODE_NOT_NFC,
-    ]);
+    if reg.sess.lint_store.borrow_state() == std::cell::BorrowState::Unused && reg.sess.lint_store.borrow().get_lint_groups().iter().any(|&(s, _, _)| s == "clippy") {
+        reg.sess.struct_warn("running cargo clippy on a crate that also imports the clippy plugin").emit();
+    } else {
+        clippy_lints::register_plugins(reg);
+    }
+}
 
-    reg.register_lint_group("clippy", vec![
-        approx_const::APPROX_CONSTANT,
-        array_indexing::OUT_OF_BOUNDS_INDEXING,
-        attrs::DEPRECATED_SEMVER,
-        attrs::INLINE_ALWAYS,
-        bit_mask::BAD_BIT_MASK,
-        bit_mask::INEFFECTIVE_BIT_MASK,
-        blacklisted_name::BLACKLISTED_NAME,
-        block_in_if_condition::BLOCK_IN_IF_CONDITION_EXPR,
-        block_in_if_condition::BLOCK_IN_IF_CONDITION_STMT,
-        collapsible_if::COLLAPSIBLE_IF,
-        copies::IF_SAME_THEN_ELSE,
-        copies::IFS_SAME_COND,
-        copies::MATCH_SAME_ARMS,
-        cyclomatic_complexity::CYCLOMATIC_COMPLEXITY,
-        derive::DERIVE_HASH_XOR_EQ,
-        derive::EXPL_IMPL_CLONE_ON_COPY,
-        doc::DOC_MARKDOWN,
-        drop_ref::DROP_REF,
-        entry::MAP_ENTRY,
-        enum_clike::ENUM_CLIKE_UNPORTABLE_VARIANT,
-        enum_variants::ENUM_VARIANT_NAMES,
-        eq_op::EQ_OP,
-        escape::BOXED_LOCAL,
-        eta_reduction::REDUNDANT_CLOSURE,
-        format::USELESS_FORMAT,
-        formatting::SUSPICIOUS_ASSIGNMENT_FORMATTING,
-        formatting::SUSPICIOUS_ELSE_FORMATTING,
-        functions::TOO_MANY_ARGUMENTS,
-        identity_op::IDENTITY_OP,
-        if_not_else::IF_NOT_ELSE,
-        items_after_statements::ITEMS_AFTER_STATEMENTS,
-        len_zero::LEN_WITHOUT_IS_EMPTY,
-        len_zero::LEN_ZERO,
-        lifetimes::NEEDLESS_LIFETIMES,
-        lifetimes::UNUSED_LIFETIMES,
-        loops::EMPTY_LOOP,
-        loops::EXPLICIT_COUNTER_LOOP,
-        loops::EXPLICIT_ITER_LOOP,
-        loops::FOR_KV_MAP,
-        loops::FOR_LOOP_OVER_OPTION,
-        loops::FOR_LOOP_OVER_RESULT,
-        loops::ITER_NEXT_LOOP,
-        loops::NEEDLESS_RANGE_LOOP,
-        loops::REVERSE_RANGE_LOOP,
-        loops::UNUSED_COLLECT,
-        loops::WHILE_LET_LOOP,
-        loops::WHILE_LET_ON_ITERATOR,
-        map_clone::MAP_CLONE,
-        matches::MATCH_BOOL,
-        matches::MATCH_OVERLAPPING_ARM,
-        matches::MATCH_REF_PATS,
-        matches::SINGLE_MATCH,
-        methods::CHARS_NEXT_CMP,
-        methods::CLONE_DOUBLE_REF,
-        methods::CLONE_ON_COPY,
-        methods::EXTEND_FROM_SLICE,
-        methods::FILTER_NEXT,
-        methods::NEW_RET_NO_SELF,
-        methods::OK_EXPECT,
-        methods::OPTION_MAP_UNWRAP_OR,
-        methods::OPTION_MAP_UNWRAP_OR_ELSE,
-        methods::OR_FUN_CALL,
-        methods::SEARCH_IS_SOME,
-        methods::SHOULD_IMPLEMENT_TRAIT,
-        methods::SINGLE_CHAR_PATTERN,
-        methods::WRONG_SELF_CONVENTION,
-        minmax::MIN_MAX,
-        misc::CMP_NAN,
-        misc::CMP_OWNED,
-        misc::FLOAT_CMP,
-        misc::MODULO_ONE,
-        misc::REDUNDANT_PATTERN,
-        misc::TOPLEVEL_REF_ARG,
-        misc::USED_UNDERSCORE_BINDING,
-        misc_early::DUPLICATE_UNDERSCORE_ARGUMENT,
-        misc_early::REDUNDANT_CLOSURE_CALL,
-        misc_early::UNNEEDED_FIELD_PATTERN,
-        mut_reference::UNNECESSARY_MUT_PASSED,
-        mutex_atomic::MUTEX_ATOMIC,
-        needless_bool::BOOL_COMPARISON,
-        needless_bool::NEEDLESS_BOOL,
-        needless_update::NEEDLESS_UPDATE,
-        new_without_default::NEW_WITHOUT_DEFAULT,
-        no_effect::NO_EFFECT,
-        non_expressive_names::MANY_SINGLE_CHAR_NAMES,
-        non_expressive_names::SIMILAR_NAMES,
-        open_options::NONSENSICAL_OPEN_OPTIONS,
-        overflow_check_conditional::OVERFLOW_CHECK_CONDITIONAL,
-        panic::PANIC_PARAMS,
-        precedence::PRECEDENCE,
-        ptr_arg::PTR_ARG,
-        ranges::RANGE_STEP_BY_ZERO,
-        ranges::RANGE_ZIP_WITH_LEN,
-        regex::INVALID_REGEX,
-        regex::REGEX_MACRO,
-        regex::TRIVIAL_REGEX,
-        returns::LET_AND_RETURN,
-        returns::NEEDLESS_RETURN,
-        strings::STRING_LIT_AS_BYTES,
-        swap::ALMOST_SWAPPED,
-        swap::MANUAL_SWAP,
-        temporary_assignment::TEMPORARY_ASSIGNMENT,
-        transmute::CROSSPOINTER_TRANSMUTE,
-        transmute::TRANSMUTE_PTR_TO_REF,
-        transmute::USELESS_TRANSMUTE,
-        types::ABSURD_EXTREME_COMPARISONS,
-        types::BOX_VEC,
-        types::CHAR_LIT_AS_U8,
-        types::LET_UNIT_VALUE,
-        types::LINKEDLIST,
-        types::TYPE_COMPLEXITY,
-        types::UNIT_CMP,
-        unicode::ZERO_WIDTH_SPACE,
-        unused_label::UNUSED_LABEL,
-        vec::USELESS_VEC,
-        zero_div_zero::ZERO_DIVIDED_BY_ZERO,
-    ]);
+// only exists to let the dogfood integration test works.
+// Don't run clippy as an executable directly
+#[allow(dead_code)]
+fn main() {
+    panic!("Please use the cargo-clippy executable");
 }