summaryrefslogtreecommitdiffstats
path: root/src/tools/clippy/clippy_lints/src/utils/internal_lints/metadata_collector.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/clippy/clippy_lints/src/utils/internal_lints/metadata_collector.rs')
-rw-r--r--src/tools/clippy/clippy_lints/src/utils/internal_lints/metadata_collector.rs132
1 files changed, 60 insertions, 72 deletions
diff --git a/src/tools/clippy/clippy_lints/src/utils/internal_lints/metadata_collector.rs b/src/tools/clippy/clippy_lints/src/utils/internal_lints/metadata_collector.rs
index 51abe0c1d..fae1b90ac 100644
--- a/src/tools/clippy/clippy_lints/src/utils/internal_lints/metadata_collector.rs
+++ b/src/tools/clippy/clippy_lints/src/utils/internal_lints/metadata_collector.rs
@@ -14,27 +14,26 @@ use clippy_config::{get_configuration_metadata, ClippyConfiguration};
use clippy_utils::diagnostics::span_lint;
use clippy_utils::ty::{match_type, walk_ptrs_ty_depth};
use clippy_utils::{last_path_segment, match_def_path, match_function_call, match_path, paths};
-use if_chain::if_chain;
use itertools::Itertools;
use rustc_ast as ast;
use rustc_data_structures::fx::FxHashMap;
use rustc_hir::def::DefKind;
use rustc_hir::intravisit::Visitor;
use rustc_hir::{self as hir, intravisit, Closure, ExprKind, Item, ItemKind, Mutability, QPath};
-use rustc_lint::{CheckLintNameResult, LateContext, LateLintPass, LintContext, LintId};
+use rustc_lint::{unerased_lint_store, CheckLintNameResult, LateContext, LateLintPass, LintContext, LintId};
use rustc_middle::hir::nested_filter;
-use rustc_session::{declare_tool_lint, impl_lint_pass};
+use rustc_session::impl_lint_pass;
use rustc_span::symbol::Ident;
use rustc_span::{sym, Loc, Span, Symbol};
use serde::ser::SerializeStruct;
use serde::{Serialize, Serializer};
use std::collections::{BTreeSet, BinaryHeap};
-use std::fmt;
use std::fmt::Write as _;
use std::fs::{self, File};
use std::io::prelude::*;
use std::path::{Path, PathBuf};
use std::process::Command;
+use std::{env, fmt};
/// This is the json output file of the lint collector.
const JSON_OUTPUT_FILE: &str = "../util/gh-pages/lints.json";
@@ -416,7 +415,7 @@ fn get_lint_output(lint_name: &str, example: &[&mut String], clippy_project_root
let prefixed_name = format!("{CLIPPY_LINT_GROUP_PREFIX}{lint_name}");
- let mut cmd = Command::new("cargo");
+ let mut cmd = Command::new(env::var("CARGO").unwrap_or("cargo".into()));
cmd.current_dir(clippy_project_root)
.env("CARGO_INCREMENTAL", "0")
@@ -543,49 +542,45 @@ impl<'hir> LateLintPass<'hir> for MetadataCollector {
fn check_item(&mut self, cx: &LateContext<'hir>, item: &'hir Item<'_>) {
if let ItemKind::Static(ty, Mutability::Not, _) = item.kind {
// Normal lint
- if_chain! {
+ if is_lint_ref_type(cx, ty)
// item validation
- if is_lint_ref_type(cx, ty);
// disallow check
- let lint_name = sym_to_string(item.ident.name).to_ascii_lowercase();
+ && let lint_name = sym_to_string(item.ident.name).to_ascii_lowercase()
// metadata extraction
- if let Some((group, level)) = get_lint_group_and_level_or_lint(cx, &lint_name, item);
- if let Some(mut raw_docs) = extract_attr_docs_or_lint(cx, item);
- then {
- if let Some(configuration_section) = self.get_lint_configs(&lint_name) {
- raw_docs.push_str(&configuration_section);
- }
- let version = get_lint_version(cx, item);
-
- self.lints.push(LintMetadata::new(
- lint_name,
- SerializableSpan::from_item(cx, item),
- group,
- level,
- version,
- raw_docs,
- ));
+ && let Some((group, level)) = get_lint_group_and_level_or_lint(cx, &lint_name, item)
+ && let Some(mut raw_docs) = extract_attr_docs_or_lint(cx, item)
+ {
+ if let Some(configuration_section) = self.get_lint_configs(&lint_name) {
+ raw_docs.push_str(&configuration_section);
}
+ let version = get_lint_version(cx, item);
+
+ self.lints.push(LintMetadata::new(
+ lint_name,
+ SerializableSpan::from_item(cx, item),
+ group,
+ level,
+ version,
+ raw_docs,
+ ));
}
- if_chain! {
- if is_deprecated_lint(cx, ty);
+ if is_deprecated_lint(cx, ty)
// disallow check
- let lint_name = sym_to_string(item.ident.name).to_ascii_lowercase();
+ && let lint_name = sym_to_string(item.ident.name).to_ascii_lowercase()
// Metadata the little we can get from a deprecated lint
- if let Some(raw_docs) = extract_attr_docs_or_lint(cx, item);
- then {
- let version = get_lint_version(cx, item);
-
- self.lints.push(LintMetadata::new(
- lint_name,
- SerializableSpan::from_item(cx, item),
- DEPRECATED_LINT_GROUP_STR.to_string(),
- DEPRECATED_LINT_LEVEL,
- version,
- raw_docs,
- ));
- }
+ && let Some(raw_docs) = extract_attr_docs_or_lint(cx, item)
+ {
+ let version = get_lint_version(cx, item);
+
+ self.lints.push(LintMetadata::new(
+ lint_name,
+ SerializableSpan::from_item(cx, item),
+ DEPRECATED_LINT_GROUP_STR.to_string(),
+ DEPRECATED_LINT_LEVEL,
+ version,
+ raw_docs,
+ ));
}
}
}
@@ -719,7 +714,7 @@ fn get_lint_group_and_level_or_lint(
lint_name: &str,
item: &Item<'_>,
) -> Option<(String, &'static str)> {
- let result = cx.lint_store.check_lint_name(
+ let result = unerased_lint_store(cx.tcx.sess).check_lint_name(
lint_name,
Some(sym::clippy),
&std::iter::once(Ident::with_dummy_span(sym::clippy)).collect(),
@@ -751,7 +746,7 @@ fn get_lint_group_and_level_or_lint(
}
fn get_lint_group(cx: &LateContext<'_>, lint_id: LintId) -> Option<String> {
- for (group_name, lints, _) in cx.lint_store.get_lint_groups() {
+ for (group_name, lints, _) in unerased_lint_store(cx.tcx.sess).get_lint_groups() {
if IGNORED_LINT_GROUPS.contains(&group_name) {
continue;
}
@@ -789,15 +784,13 @@ fn collect_renames(lints: &mut Vec<LintMetadata>) {
loop {
if let Some(lint_name) = names.pop() {
for (k, v) in RENAMED_LINTS {
- if_chain! {
- if let Some(name) = v.strip_prefix(CLIPPY_LINT_GROUP_PREFIX);
- if name == lint_name;
- if let Some(past_name) = k.strip_prefix(CLIPPY_LINT_GROUP_PREFIX);
- then {
- lint.former_ids.insert(past_name.to_owned());
- writeln!(collected, "* `{past_name}`").unwrap();
- names.push(past_name.to_string());
- }
+ if let Some(name) = v.strip_prefix(CLIPPY_LINT_GROUP_PREFIX)
+ && name == lint_name
+ && let Some(past_name) = k.strip_prefix(CLIPPY_LINT_GROUP_PREFIX)
+ {
+ lint.former_ids.insert(past_name.to_owned());
+ writeln!(collected, "* `{past_name}`").unwrap();
+ names.push(past_name.to_string());
}
}
@@ -927,20 +920,17 @@ impl<'a, 'hir> intravisit::Visitor<'hir> for LintResolver<'a, 'hir> {
}
fn visit_expr(&mut self, expr: &'hir hir::Expr<'hir>) {
- if_chain! {
- if let ExprKind::Path(qpath) = &expr.kind;
- if let QPath::Resolved(_, path) = qpath;
-
- let (expr_ty, _) = walk_ptrs_ty_depth(self.cx.typeck_results().expr_ty(expr));
- if match_type(self.cx, expr_ty, &paths::LINT);
- then {
- if let hir::def::Res::Def(DefKind::Static(..), _) = path.res {
- let lint_name = last_path_segment(qpath).ident.name;
- self.lints.push(sym_to_string(lint_name).to_ascii_lowercase());
- } else if let Some(local) = get_parent_local(self.cx, expr) {
- if let Some(local_init) = local.init {
- intravisit::walk_expr(self, local_init);
- }
+ if let ExprKind::Path(qpath) = &expr.kind
+ && let QPath::Resolved(_, path) = qpath
+ && let (expr_ty, _) = walk_ptrs_ty_depth(self.cx.typeck_results().expr_ty(expr))
+ && match_type(self.cx, expr_ty, &paths::LINT)
+ {
+ if let hir::def::Res::Def(DefKind::Static(..), _) = path.res {
+ let lint_name = last_path_segment(qpath).ident.name;
+ self.lints.push(sym_to_string(lint_name).to_ascii_lowercase());
+ } else if let Some(local) = get_parent_local(self.cx, expr) {
+ if let Some(local_init) = local.init {
+ intravisit::walk_expr(self, local_init);
}
}
}
@@ -992,13 +982,11 @@ impl<'a, 'hir> intravisit::Visitor<'hir> for ApplicabilityResolver<'a, 'hir> {
fn visit_expr(&mut self, expr: &'hir hir::Expr<'hir>) {
let (expr_ty, _) = walk_ptrs_ty_depth(self.cx.typeck_results().expr_ty(expr));
- if_chain! {
- if match_type(self.cx, expr_ty, &paths::APPLICABILITY);
- if let Some(local) = get_parent_local(self.cx, expr);
- if let Some(local_init) = local.init;
- then {
- intravisit::walk_expr(self, local_init);
- }
+ if match_type(self.cx, expr_ty, &paths::APPLICABILITY)
+ && let Some(local) = get_parent_local(self.cx, expr)
+ && let Some(local_init) = local.init
+ {
+ intravisit::walk_expr(self, local_init);
};
intravisit::walk_expr(self, expr);