Rollup merge of #133545 - clubby789:symbol-intern-lit, r=jieyouxu
Lint against Symbol::intern on a string literal Disabled in tests where this doesn't make much sense
This commit is contained in:
@@ -17,8 +17,9 @@ use tracing::debug;
|
||||
|
||||
use crate::lints::{
|
||||
BadOptAccessDiag, DefaultHashTypesDiag, DiagOutOfImpl, LintPassByHand, NonExistentDocKeyword,
|
||||
NonGlobImportTypeIrInherent, QueryInstability, QueryUntracked, SpanUseEqCtxtDiag, TyQualified,
|
||||
TykindDiag, TykindKind, TypeIrInherentUsage, UntranslatableDiag,
|
||||
NonGlobImportTypeIrInherent, QueryInstability, QueryUntracked, SpanUseEqCtxtDiag,
|
||||
SymbolInternStringLiteralDiag, TyQualified, TykindDiag, TykindKind, TypeIrInherentUsage,
|
||||
UntranslatableDiag,
|
||||
};
|
||||
use crate::{EarlyContext, EarlyLintPass, LateContext, LateLintPass, LintContext};
|
||||
|
||||
@@ -650,3 +651,33 @@ fn is_span_ctxt_call(cx: &LateContext<'_>, expr: &Expr<'_>) -> bool {
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
|
||||
declare_tool_lint! {
|
||||
/// The `symbol_intern_string_literal` detects `Symbol::intern` being called on a string literal
|
||||
pub rustc::SYMBOL_INTERN_STRING_LITERAL,
|
||||
// rustc_driver crates out of the compiler can't/shouldn't add preinterned symbols;
|
||||
// bootstrap will deny this manually
|
||||
Allow,
|
||||
"Forbid uses of string literals in `Symbol::intern`, suggesting preinterning instead",
|
||||
report_in_external_macro: true
|
||||
}
|
||||
|
||||
declare_lint_pass!(SymbolInternStringLiteral => [SYMBOL_INTERN_STRING_LITERAL]);
|
||||
|
||||
impl<'tcx> LateLintPass<'tcx> for SymbolInternStringLiteral {
|
||||
fn check_expr(&mut self, cx: &LateContext<'tcx>, expr: &'tcx rustc_hir::Expr<'tcx>) {
|
||||
if let ExprKind::Call(path, [arg]) = expr.kind
|
||||
&& let ExprKind::Path(ref qpath) = path.kind
|
||||
&& let Some(def_id) = cx.qpath_res(qpath, path.hir_id).opt_def_id()
|
||||
&& cx.tcx.is_diagnostic_item(sym::SymbolIntern, def_id)
|
||||
&& let ExprKind::Lit(kind) = arg.kind
|
||||
&& let rustc_ast::LitKind::Str(_, _) = kind.node
|
||||
{
|
||||
cx.emit_span_lint(
|
||||
SYMBOL_INTERN_STRING_LITERAL,
|
||||
kind.span,
|
||||
SymbolInternStringLiteralDiag,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user