Skip to content

Commit b52bd96

Browse files
committed
Replace interning of string literals with preinterned symbols
1 parent 781fdab commit b52bd96

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+428
-715
lines changed

book/src/development/common_tools_writing_lints.md

+6-4
Original file line numberDiff line numberDiff line change
@@ -159,19 +159,21 @@ paths for Clippy can be found in [paths.rs][paths]
159159
To check if our type defines a method called `some_method`:
160160

161161
```rust
162-
use clippy_utils::ty::is_type_diagnostic_item;
163-
use clippy_utils::return_ty;
162+
use clippy_utils::ty::is_type_lang_item;
163+
use clippy_utils::{sym, return_ty};
164164

165165
impl<'tcx> LateLintPass<'tcx> for MyTypeImpl {
166166
fn check_impl_item(&mut self, cx: &LateContext<'tcx>, impl_item: &'tcx ImplItem<'_>) {
167167
// Check if item is a method/function
168168
if let ImplItemKind::Fn(ref signature, _) = impl_item.kind
169169
// Check the method is named `some_method`
170-
&& impl_item.ident.name.as_str() == "some_method"
170+
//
171+
// Add `some_method` to `clippy_utils::sym` if it's not already there
172+
&& impl_item.ident.name == sym::some_method
171173
// We can also check it has a parameter `self`
172174
&& signature.decl.implicit_self.has_implicit_self()
173175
// We can go further and even check if its return type is `String`
174-
&& is_type_diagnostic_item(cx, return_ty(cx, impl_item.hir_id), sym!(string_type))
176+
&& is_type_lang_item(cx, return_ty(cx, impl_item.hir_id), LangItem::String)
175177
{
176178
// ...
177179
}

clippy_lints/src/format_impl.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
use clippy_utils::diagnostics::{span_lint, span_lint_and_sugg};
22
use clippy_utils::macros::{FormatArgsStorage, find_format_arg_expr, is_format_macro, root_macro_call_first_node};
3-
use clippy_utils::{get_parent_as_impl, is_diag_trait_item, path_to_local, peel_ref_operators};
3+
use clippy_utils::{get_parent_as_impl, is_diag_trait_item, path_to_local, peel_ref_operators, sym};
44
use rustc_ast::{FormatArgsPiece, FormatTrait};
55
use rustc_errors::Applicability;
66
use rustc_hir::{Expr, ExprKind, Impl, ImplItem, ImplItemKind, QPath};
77
use rustc_lint::{LateContext, LateLintPass};
88
use rustc_session::impl_lint_pass;
9+
use rustc_span::Symbol;
910
use rustc_span::symbol::kw;
10-
use rustc_span::{Symbol, sym};
1111

1212
declare_clippy_lint! {
1313
/// ### What it does
@@ -185,13 +185,13 @@ impl FormatImplExpr<'_, '_> {
185185
&& let trait_name = match placeholder.format_trait {
186186
FormatTrait::Display => sym::Display,
187187
FormatTrait::Debug => sym::Debug,
188-
FormatTrait::LowerExp => sym!(LowerExp),
189-
FormatTrait::UpperExp => sym!(UpperExp),
190-
FormatTrait::Octal => sym!(Octal),
188+
FormatTrait::LowerExp => sym::LowerExp,
189+
FormatTrait::UpperExp => sym::UpperExp,
190+
FormatTrait::Octal => sym::Octal,
191191
FormatTrait::Pointer => sym::Pointer,
192-
FormatTrait::Binary => sym!(Binary),
193-
FormatTrait::LowerHex => sym!(LowerHex),
194-
FormatTrait::UpperHex => sym!(UpperHex),
192+
FormatTrait::Binary => sym::Binary,
193+
FormatTrait::LowerHex => sym::LowerHex,
194+
FormatTrait::UpperHex => sym::UpperHex,
195195
}
196196
&& trait_name == self.format_trait_impl.name
197197
&& let Ok(index) = placeholder.argument.index

clippy_lints/src/indexing_slicing.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,12 @@ use clippy_config::Conf;
22
use clippy_utils::consts::{ConstEvalCtxt, Constant};
33
use clippy_utils::diagnostics::{span_lint, span_lint_and_then};
44
use clippy_utils::ty::{deref_chain, get_adt_inherent_method};
5-
use clippy_utils::{higher, is_from_proc_macro, is_in_test};
5+
use clippy_utils::{higher, is_from_proc_macro, is_in_test, sym};
66
use rustc_ast::ast::RangeLimits;
77
use rustc_hir::{Expr, ExprKind};
88
use rustc_lint::{LateContext, LateLintPass};
99
use rustc_middle::ty::{self, Ty};
1010
use rustc_session::impl_lint_pass;
11-
use rustc_span::sym;
1211

1312
declare_clippy_lint! {
1413
/// ### What it does
@@ -268,7 +267,7 @@ fn ty_has_applicable_get_function<'tcx>(
268267
index_expr: &Expr<'_>,
269268
) -> bool {
270269
if let ty::Adt(_, _) = array_ty.kind()
271-
&& let Some(get_output_ty) = get_adt_inherent_method(cx, ty, sym!(get)).map(|m| {
270+
&& let Some(get_output_ty) = get_adt_inherent_method(cx, ty, sym::get).map(|m| {
272271
cx.tcx
273272
.fn_sig(m.def_id)
274273
.skip_binder()

clippy_lints/src/len_zero.rs

+5-11
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use clippy_utils::diagnostics::{span_lint, span_lint_and_sugg, span_lint_and_the
22
use clippy_utils::source::{SpanRangeExt, snippet_with_context};
33
use clippy_utils::sugg::{Sugg, has_enclosing_paren};
44
use clippy_utils::ty::implements_trait;
5-
use clippy_utils::{fulfill_or_allowed, get_item_name, get_parent_as_impl, is_trait_method, peel_ref_operators};
5+
use clippy_utils::{fulfill_or_allowed, get_item_name, get_parent_as_impl, is_trait_method, peel_ref_operators, sym};
66
use rustc_ast::ast::LitKind;
77
use rustc_errors::Applicability;
88
use rustc_hir::def::Res;
@@ -16,7 +16,6 @@ use rustc_lint::{LateContext, LateLintPass};
1616
use rustc_middle::ty::{self, FnSig, Ty};
1717
use rustc_session::declare_lint_pass;
1818
use rustc_span::source_map::Spanned;
19-
use rustc_span::symbol::sym;
2019
use rustc_span::{Ident, Span, Symbol};
2120
use rustc_trait_selection::traits::supertrait_def_ids;
2221

@@ -295,11 +294,9 @@ fn check_trait_items(cx: &LateContext<'_>, visited_trait: &Item<'_>, ident: Iden
295294
{
296295
let mut current_and_super_traits = DefIdSet::default();
297296
fill_trait_set(visited_trait.owner_id.to_def_id(), &mut current_and_super_traits, cx);
298-
let is_empty = sym!(is_empty);
299-
300297
let is_empty_method_found = current_and_super_traits
301298
.items()
302-
.flat_map(|&i| cx.tcx.associated_items(i).filter_by_name_unhygienic(is_empty))
299+
.flat_map(|&i| cx.tcx.associated_items(i).filter_by_name_unhygienic(sym::is_empty))
303300
.any(|i| i.is_method() && cx.tcx.fn_sig(i.def_id).skip_binder().inputs().skip_binder().len() == 1);
304301

305302
if !is_empty_method_found {
@@ -472,12 +469,11 @@ fn check_for_is_empty(
472469
return;
473470
};
474471

475-
let is_empty = Symbol::intern("is_empty");
476472
let is_empty = cx
477473
.tcx
478474
.inherent_impls(impl_ty)
479475
.iter()
480-
.flat_map(|&id| cx.tcx.associated_items(id).filter_by_name_unhygienic(is_empty))
476+
.flat_map(|&id| cx.tcx.associated_items(id).filter_by_name_unhygienic(sym::is_empty))
481477
.find(|item| item.is_fn());
482478

483479
let (msg, is_empty_span, self_kind) = match is_empty {
@@ -633,22 +629,20 @@ fn has_is_empty(cx: &LateContext<'_>, expr: &Expr<'_>) -> bool {
633629

634630
/// Checks the inherent impl's items for an `is_empty(self)` method.
635631
fn has_is_empty_impl(cx: &LateContext<'_>, id: DefId) -> bool {
636-
let is_empty = sym!(is_empty);
637632
cx.tcx.inherent_impls(id).iter().any(|imp| {
638633
cx.tcx
639634
.associated_items(*imp)
640-
.filter_by_name_unhygienic(is_empty)
635+
.filter_by_name_unhygienic(sym::is_empty)
641636
.any(|item| is_is_empty(cx, item))
642637
})
643638
}
644639

645640
fn ty_has_is_empty<'tcx>(cx: &LateContext<'tcx>, ty: Ty<'tcx>, depth: usize) -> bool {
646641
match ty.kind() {
647642
ty::Dynamic(tt, ..) => tt.principal().is_some_and(|principal| {
648-
let is_empty = sym!(is_empty);
649643
cx.tcx
650644
.associated_items(principal.def_id())
651-
.filter_by_name_unhygienic(is_empty)
645+
.filter_by_name_unhygienic(sym::is_empty)
652646
.any(|item| is_is_empty(cx, item))
653647
}),
654648
ty::Alias(ty::Projection, proj) => has_is_empty_impl(cx, proj.def_id),

clippy_lints/src/loops/explicit_iter_loop.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use super::EXPLICIT_ITER_LOOP;
22
use clippy_utils::diagnostics::span_lint_and_sugg;
33
use clippy_utils::msrvs::{self, Msrv};
44
use clippy_utils::source::snippet_with_applicability;
5+
use clippy_utils::sym;
56
use clippy_utils::ty::{
67
implements_trait, implements_trait_with_env, is_copy, is_type_lang_item, make_normalized_projection,
78
make_normalized_projection_with_regions, normalize_with_regions,
@@ -11,7 +12,6 @@ use rustc_hir::{Expr, Mutability};
1112
use rustc_lint::LateContext;
1213
use rustc_middle::ty::adjustment::{Adjust, Adjustment, AutoBorrow, AutoBorrowMutability};
1314
use rustc_middle::ty::{self, EarlyBinder, Ty};
14-
use rustc_span::sym;
1515

1616
pub(super) fn check(
1717
cx: &LateContext<'_>,
@@ -119,7 +119,7 @@ fn is_ref_iterable<'tcx>(
119119
&& let typing_env = ty::TypingEnv::non_body_analysis(cx.tcx, fn_id)
120120
&& implements_trait_with_env(cx.tcx, typing_env, req_self_ty, trait_id, Some(fn_id), &[])
121121
&& let Some(into_iter_ty) =
122-
make_normalized_projection_with_regions(cx.tcx, typing_env, trait_id, sym!(IntoIter), [req_self_ty])
122+
make_normalized_projection_with_regions(cx.tcx, typing_env, trait_id, sym::IntoIter, [req_self_ty])
123123
&& let req_res_ty = normalize_with_regions(cx.tcx, typing_env, req_res_ty)
124124
&& into_iter_ty == req_res_ty
125125
{
@@ -152,7 +152,7 @@ fn is_ref_iterable<'tcx>(
152152
// Using by value won't consume anything
153153
if implements_trait(cx, self_ty, trait_id, &[])
154154
&& let Some(ty) =
155-
make_normalized_projection(cx.tcx, cx.typing_env(), trait_id, sym!(IntoIter), [self_ty])
155+
make_normalized_projection(cx.tcx, cx.typing_env(), trait_id, sym::IntoIter, [self_ty])
156156
&& ty == res_ty
157157
{
158158
return Some((AdjustKind::None, self_ty));
@@ -169,7 +169,7 @@ fn is_ref_iterable<'tcx>(
169169
};
170170
if implements_trait(cx, self_ty, trait_id, &[])
171171
&& let Some(ty) =
172-
make_normalized_projection(cx.tcx, cx.typing_env(), trait_id, sym!(IntoIter), [self_ty])
172+
make_normalized_projection(cx.tcx, cx.typing_env(), trait_id, sym::IntoIter, [self_ty])
173173
&& ty == res_ty
174174
{
175175
return Some((AdjustKind::reborrow(mutbl), self_ty));
@@ -183,7 +183,7 @@ fn is_ref_iterable<'tcx>(
183183
let self_ty = Ty::new_ref(cx.tcx, cx.tcx.lifetimes.re_erased, self_ty, mutbl);
184184
if implements_trait(cx, self_ty, trait_id, &[])
185185
&& let Some(ty) =
186-
make_normalized_projection(cx.tcx, cx.typing_env(), trait_id, sym!(IntoIter), [self_ty])
186+
make_normalized_projection(cx.tcx, cx.typing_env(), trait_id, sym::IntoIter, [self_ty])
187187
&& ty == res_ty
188188
{
189189
return Some((AdjustKind::borrow(mutbl), self_ty));
@@ -206,7 +206,7 @@ fn is_ref_iterable<'tcx>(
206206
&& target != self_ty
207207
&& implements_trait(cx, target, trait_id, &[])
208208
&& let Some(ty) =
209-
make_normalized_projection(cx.tcx, cx.typing_env(), trait_id, sym!(IntoIter), [target])
209+
make_normalized_projection(cx.tcx, cx.typing_env(), trait_id, sym::IntoIter, [target])
210210
&& ty == res_ty
211211
{
212212
Some((AdjustKind::auto_reborrow(mutbl), target))
@@ -224,7 +224,7 @@ fn is_ref_iterable<'tcx>(
224224
if is_copy(cx, target)
225225
&& implements_trait(cx, target, trait_id, &[])
226226
&& let Some(ty) =
227-
make_normalized_projection(cx.tcx, cx.typing_env(), trait_id, sym!(IntoIter), [target])
227+
make_normalized_projection(cx.tcx, cx.typing_env(), trait_id, sym::IntoIter, [target])
228228
&& ty == res_ty
229229
{
230230
Some((AdjustKind::Deref, target))
@@ -242,7 +242,7 @@ fn is_ref_iterable<'tcx>(
242242
if self_ty.is_ref()
243243
&& implements_trait(cx, target, trait_id, &[])
244244
&& let Some(ty) =
245-
make_normalized_projection(cx.tcx, cx.typing_env(), trait_id, sym!(IntoIter), [target])
245+
make_normalized_projection(cx.tcx, cx.typing_env(), trait_id, sym::IntoIter, [target])
246246
&& ty == res_ty
247247
{
248248
Some((AdjustKind::auto_borrow(mutbl), target))

clippy_lints/src/manual_div_ceil.rs

+3-6
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
use clippy_utils::SpanlessEq;
1+
use clippy_config::Conf;
22
use clippy_utils::diagnostics::span_lint_and_sugg;
33
use clippy_utils::msrvs::{self, Msrv};
44
use clippy_utils::source::snippet_with_applicability;
55
use clippy_utils::sugg::{Sugg, has_enclosing_paren};
6+
use clippy_utils::{SpanlessEq, sym};
67
use rustc_ast::{BinOpKind, LitIntType, LitKind, UnOp};
78
use rustc_data_structures::packed::Pu128;
89
use rustc_errors::Applicability;
@@ -11,9 +12,6 @@ use rustc_lint::{LateContext, LateLintPass};
1112
use rustc_middle::ty::{self};
1213
use rustc_session::impl_lint_pass;
1314
use rustc_span::source_map::Spanned;
14-
use rustc_span::symbol::Symbol;
15-
16-
use clippy_config::Conf;
1715

1816
declare_clippy_lint! {
1917
/// ### What it does
@@ -141,8 +139,7 @@ fn check_int_ty_and_feature(cx: &LateContext<'_>, expr: &Expr<'_>) -> bool {
141139
let expr_ty = cx.typeck_results().expr_ty(expr);
142140
match expr_ty.peel_refs().kind() {
143141
ty::Uint(_) => true,
144-
ty::Int(_) => cx.tcx.features().enabled(Symbol::intern("int_roundings")),
145-
142+
ty::Int(_) => cx.tcx.features().enabled(sym::int_roundings),
146143
_ => false,
147144
}
148145
}

clippy_lints/src/matches/redundant_pattern_match.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@ use clippy_utils::source::walk_span_to_context;
44
use clippy_utils::sugg::{Sugg, make_unop};
55
use clippy_utils::ty::{is_type_diagnostic_item, needs_ordered_drop};
66
use clippy_utils::visitors::{any_temporaries_need_ordered_drop, for_each_expr_without_closures};
7-
use clippy_utils::{higher, is_expn_of, is_trait_method};
7+
use clippy_utils::{higher, is_expn_of, is_trait_method, sym};
88
use rustc_ast::ast::LitKind;
99
use rustc_errors::Applicability;
1010
use rustc_hir::LangItem::{self, OptionNone, OptionSome, PollPending, PollReady, ResultErr, ResultOk};
1111
use rustc_hir::def::{DefKind, Res};
1212
use rustc_hir::{Arm, Expr, ExprKind, Node, Pat, PatExpr, PatExprKind, PatKind, QPath, UnOp};
1313
use rustc_lint::LateContext;
1414
use rustc_middle::ty::{self, GenericArgKind, Ty};
15-
use rustc_span::{Span, Symbol, sym};
15+
use rustc_span::{Span, Symbol};
1616
use std::fmt::Write;
1717
use std::ops::ControlFlow;
1818

@@ -138,9 +138,9 @@ fn find_method_and_type<'tcx>(
138138
Some(("is_some()", op_ty))
139139
} else if Some(id) == lang_items.poll_ready_variant() {
140140
Some(("is_ready()", op_ty))
141-
} else if is_pat_variant(cx, check_pat, qpath, Item::Diag(sym::IpAddr, sym!(V4))) {
141+
} else if is_pat_variant(cx, check_pat, qpath, Item::Diag(sym::IpAddr, sym::V4)) {
142142
Some(("is_ipv4()", op_ty))
143-
} else if is_pat_variant(cx, check_pat, qpath, Item::Diag(sym::IpAddr, sym!(V6))) {
143+
} else if is_pat_variant(cx, check_pat, qpath, Item::Diag(sym::IpAddr, sym::V6)) {
144144
Some(("is_ipv6()", op_ty))
145145
} else {
146146
None
@@ -345,8 +345,8 @@ fn found_good_method<'tcx>(
345345
arms,
346346
path_left,
347347
path_right,
348-
Item::Diag(sym::IpAddr, sym!(V4)),
349-
Item::Diag(sym::IpAddr, sym!(V6)),
348+
Item::Diag(sym::IpAddr, sym::V4),
349+
Item::Diag(sym::IpAddr, sym::V6),
350350
"is_ipv4()",
351351
"is_ipv6()",
352352
)
@@ -437,8 +437,8 @@ fn get_good_method<'tcx>(
437437
"None" => (Item::Lang(OptionNone), "is_none()", "is_some()"),
438438
"Ready" => (Item::Lang(PollReady), "is_ready()", "is_pending()"),
439439
"Pending" => (Item::Lang(PollPending), "is_pending()", "is_ready()"),
440-
"V4" => (Item::Diag(sym::IpAddr, sym!(V4)), "is_ipv4()", "is_ipv6()"),
441-
"V6" => (Item::Diag(sym::IpAddr, sym!(V6)), "is_ipv6()", "is_ipv4()"),
440+
"V4" => (Item::Diag(sym::IpAddr, sym::V4), "is_ipv4()", "is_ipv6()"),
441+
"V6" => (Item::Diag(sym::IpAddr, sym::V6), "is_ipv6()", "is_ipv4()"),
442442
_ => return None,
443443
};
444444
return find_good_method_for_matches_macro(

clippy_lints/src/methods/filter_map.rs

+15-16
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use clippy_utils::diagnostics::{span_lint_and_sugg, span_lint_and_then};
22
use clippy_utils::macros::{is_panic, matching_root_macro_call, root_macro_call};
33
use clippy_utils::source::{indent_of, reindent_multiline, snippet};
44
use clippy_utils::ty::is_type_diagnostic_item;
5-
use clippy_utils::{SpanlessEq, higher, is_trait_method, path_to_local_id, peel_blocks};
5+
use clippy_utils::{SpanlessEq, higher, is_trait_method, path_to_local_id, peel_blocks, sym};
66
use hir::{Body, HirId, MatchSource, Pat};
77
use rustc_errors::Applicability;
88
use rustc_hir as hir;
@@ -11,7 +11,7 @@ use rustc_hir::{Closure, Expr, ExprKind, PatKind, PathSegment, QPath, UnOp};
1111
use rustc_lint::LateContext;
1212
use rustc_middle::ty::adjustment::Adjust;
1313
use rustc_span::Span;
14-
use rustc_span::symbol::{Ident, Symbol, sym};
14+
use rustc_span::symbol::{Ident, Symbol};
1515

1616
use super::{MANUAL_FILTER_MAP, MANUAL_FIND_MAP, OPTION_FILTER_MAP, RESULT_FILTER_MAP};
1717

@@ -43,10 +43,10 @@ fn is_method(cx: &LateContext<'_>, expr: &Expr<'_>, method_name: Symbol) -> bool
4343
}
4444

4545
fn is_option_filter_map(cx: &LateContext<'_>, filter_arg: &Expr<'_>, map_arg: &Expr<'_>) -> bool {
46-
is_method(cx, map_arg, sym::unwrap) && is_method(cx, filter_arg, sym!(is_some))
46+
is_method(cx, map_arg, sym::unwrap) && is_method(cx, filter_arg, sym::is_some)
4747
}
4848
fn is_ok_filter_map(cx: &LateContext<'_>, filter_arg: &Expr<'_>, map_arg: &Expr<'_>) -> bool {
49-
is_method(cx, map_arg, sym::unwrap) && is_method(cx, filter_arg, sym!(is_ok))
49+
is_method(cx, map_arg, sym::unwrap) && is_method(cx, filter_arg, sym::is_ok)
5050
}
5151

5252
#[derive(Debug, Copy, Clone)]
@@ -429,16 +429,15 @@ fn is_find_or_filter<'a>(
429429
}
430430

431431
fn acceptable_methods(method: &PathSegment<'_>) -> bool {
432-
let methods: [Symbol; 8] = [
433-
sym::clone,
434-
sym::as_ref,
435-
sym!(copied),
436-
sym!(cloned),
437-
sym!(as_deref),
438-
sym!(as_mut),
439-
sym!(as_deref_mut),
440-
sym!(to_owned),
441-
];
442-
443-
methods.contains(&method.ident.name)
432+
matches!(
433+
method.ident.name,
434+
sym::clone
435+
| sym::as_ref
436+
| sym::copied
437+
| sym::cloned
438+
| sym::as_deref
439+
| sym::as_mut
440+
| sym::as_deref_mut
441+
| sym::to_owned
442+
)
444443
}

0 commit comments

Comments
 (0)