1use hir_expand::name::Name;
6use intern::{Symbol, sym};
7use rustc_hash::FxHashMap;
8use triomphe::Arc;
9
10use crate::{
11 AdtId, AssocItemId, AttrDefId, Crate, EnumId, EnumVariantId, FunctionId, ImplId, ModuleDefId,
12 StaticId, StructId, TraitId, TypeAliasId, UnionId,
13 db::DefDatabase,
14 expr_store::path::Path,
15 nameres::{assoc::TraitItems, crate_def_map, crate_local_def_map},
16};
17
18#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
19pub enum LangItemTarget {
20 EnumId(EnumId),
21 Function(FunctionId),
22 ImplDef(ImplId),
23 Static(StaticId),
24 Struct(StructId),
25 Union(UnionId),
26 TypeAlias(TypeAliasId),
27 Trait(TraitId),
28 EnumVariant(EnumVariantId),
29}
30
31impl LangItemTarget {
32 pub fn as_enum(self) -> Option<EnumId> {
33 match self {
34 LangItemTarget::EnumId(id) => Some(id),
35 _ => None,
36 }
37 }
38
39 pub fn as_function(self) -> Option<FunctionId> {
40 match self {
41 LangItemTarget::Function(id) => Some(id),
42 _ => None,
43 }
44 }
45
46 pub fn as_impl_def(self) -> Option<ImplId> {
47 match self {
48 LangItemTarget::ImplDef(id) => Some(id),
49 _ => None,
50 }
51 }
52
53 pub fn as_static(self) -> Option<StaticId> {
54 match self {
55 LangItemTarget::Static(id) => Some(id),
56 _ => None,
57 }
58 }
59
60 pub fn as_struct(self) -> Option<StructId> {
61 match self {
62 LangItemTarget::Struct(id) => Some(id),
63 _ => None,
64 }
65 }
66
67 pub fn as_trait(self) -> Option<TraitId> {
68 match self {
69 LangItemTarget::Trait(id) => Some(id),
70 _ => None,
71 }
72 }
73
74 pub fn as_enum_variant(self) -> Option<EnumVariantId> {
75 match self {
76 LangItemTarget::EnumVariant(id) => Some(id),
77 _ => None,
78 }
79 }
80
81 pub fn as_type_alias(self) -> Option<TypeAliasId> {
82 match self {
83 LangItemTarget::TypeAlias(id) => Some(id),
84 _ => None,
85 }
86 }
87}
88
89#[salsa_macros::tracked(returns(ref))]
91pub fn crate_lang_items(db: &dyn DefDatabase, krate: Crate) -> Option<Box<LangItems>> {
92 let _p = tracing::info_span!("crate_lang_items_query").entered();
93
94 let mut lang_items = LangItems::default();
95
96 let crate_def_map = crate_def_map(db, krate);
97
98 for (_, module_data) in crate_def_map.modules() {
99 for impl_def in module_data.scope.impls() {
100 lang_items.collect_lang_item(db, impl_def, LangItemTarget::ImplDef);
101 for &(_, assoc) in impl_def.impl_items(db).items.iter() {
102 match assoc {
103 AssocItemId::FunctionId(f) => {
104 lang_items.collect_lang_item(db, f, LangItemTarget::Function)
105 }
106 AssocItemId::TypeAliasId(t) => {
107 lang_items.collect_lang_item(db, t, LangItemTarget::TypeAlias)
108 }
109 AssocItemId::ConstId(_) => (),
110 }
111 }
112 }
113
114 for def in module_data.scope.declarations() {
115 match def {
116 ModuleDefId::TraitId(trait_) => {
117 lang_items.collect_lang_item(db, trait_, LangItemTarget::Trait);
118 TraitItems::query(db, trait_).items.iter().for_each(|&(_, assoc_id)| {
119 match assoc_id {
120 AssocItemId::FunctionId(f) => {
121 lang_items.collect_lang_item(db, f, LangItemTarget::Function);
122 }
123 AssocItemId::TypeAliasId(alias) => {
124 lang_items.collect_lang_item(db, alias, LangItemTarget::TypeAlias)
125 }
126 AssocItemId::ConstId(_) => {}
127 }
128 });
129 }
130 ModuleDefId::AdtId(AdtId::EnumId(e)) => {
131 lang_items.collect_lang_item(db, e, LangItemTarget::EnumId);
132 e.enum_variants(db).variants.iter().for_each(|&(id, _, _)| {
133 lang_items.collect_lang_item(db, id, LangItemTarget::EnumVariant);
134 });
135 }
136 ModuleDefId::AdtId(AdtId::StructId(s)) => {
137 lang_items.collect_lang_item(db, s, LangItemTarget::Struct);
138 }
139 ModuleDefId::AdtId(AdtId::UnionId(u)) => {
140 lang_items.collect_lang_item(db, u, LangItemTarget::Union);
141 }
142 ModuleDefId::FunctionId(f) => {
143 lang_items.collect_lang_item(db, f, LangItemTarget::Function);
144 }
145 ModuleDefId::StaticId(s) => {
146 lang_items.collect_lang_item(db, s, LangItemTarget::Static);
147 }
148 ModuleDefId::TypeAliasId(t) => {
149 lang_items.collect_lang_item(db, t, LangItemTarget::TypeAlias);
150 }
151 _ => {}
152 }
153 }
154 }
155
156 if lang_items.items.is_empty() { None } else { Some(Box::new(lang_items)) }
157}
158
159#[salsa_macros::tracked]
162pub fn lang_item(
163 db: &dyn DefDatabase,
164 start_crate: Crate,
165 item: LangItem,
166) -> Option<LangItemTarget> {
167 let _p = tracing::info_span!("lang_item_query").entered();
168 if let Some(target) =
169 crate_lang_items(db, start_crate).as_ref().and_then(|it| it.items.get(&item).copied())
170 {
171 return Some(target);
172 }
173
174 crate_local_def_map(db, start_crate).local(db).extern_prelude().find_map(|(_, (krate, _))| {
182 if krate.krate == start_crate { None } else { lang_item(db, krate.krate, item) }
185 })
186}
187
188#[derive(Default, Debug, Clone, PartialEq, Eq)]
189pub struct LangItems {
190 items: FxHashMap<LangItem, LangItemTarget>,
191}
192
193impl LangItems {
194 pub fn target(&self, item: LangItem) -> Option<LangItemTarget> {
195 self.items.get(&item).copied()
196 }
197
198 fn collect_lang_item<T>(
199 &mut self,
200 db: &dyn DefDatabase,
201 item: T,
202 constructor: fn(T) -> LangItemTarget,
203 ) where
204 T: Into<AttrDefId> + Copy,
205 {
206 let _p = tracing::info_span!("collect_lang_item").entered();
207 if let Some(lang_item) = lang_attr(db, item.into()) {
208 self.items.entry(lang_item).or_insert_with(|| constructor(item));
209 }
210 }
211}
212
213pub(crate) fn lang_attr(db: &dyn DefDatabase, item: AttrDefId) -> Option<LangItem> {
214 db.attrs(item).lang_item()
215}
216
217pub(crate) fn notable_traits_in_deps(db: &dyn DefDatabase, krate: Crate) -> Arc<[Arc<[TraitId]>]> {
218 let _p = tracing::info_span!("notable_traits_in_deps", ?krate).entered();
219 Arc::from_iter(
220 db.transitive_deps(krate).into_iter().filter_map(|krate| db.crate_notable_traits(krate)),
221 )
222}
223
224pub(crate) fn crate_notable_traits(db: &dyn DefDatabase, krate: Crate) -> Option<Arc<[TraitId]>> {
225 let _p = tracing::info_span!("crate_notable_traits", ?krate).entered();
226
227 let mut traits = Vec::new();
228
229 let crate_def_map = crate_def_map(db, krate);
230
231 for (_, module_data) in crate_def_map.modules() {
232 for def in module_data.scope.declarations() {
233 if let ModuleDefId::TraitId(trait_) = def
234 && db.attrs(trait_.into()).has_doc_notable_trait()
235 {
236 traits.push(trait_);
237 }
238 }
239 }
240
241 if traits.is_empty() { None } else { Some(traits.into_iter().collect()) }
242}
243
244pub enum GenericRequirement {
245 None,
246 Minimum(usize),
247 Exact(usize),
248}
249
250macro_rules! language_item_table {
251 (
252 $( $(#[$attr:meta])* $variant:ident, $module:ident :: $name:ident, $method:ident, $target:expr, $generics:expr; )*
253 ) => {
254
255 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
257 pub enum LangItem {
258 $(
259 #[doc = concat!("The `", stringify!($name), "` lang item.")]
260 $(#[$attr])*
261 $variant,
262 )*
263 }
264
265 impl LangItem {
266 pub fn name(self) -> &'static str {
267 match self {
268 $( LangItem::$variant => stringify!($name), )*
269 }
270 }
271
272 pub fn from_symbol(sym: &Symbol) -> Option<Self> {
274 match sym {
275 $(sym if *sym == $module::$name => Some(LangItem::$variant), )*
276 _ => None,
277 }
278 }
279 }
280 }
281}
282
283impl LangItem {
284 pub fn resolve_function(self, db: &dyn DefDatabase, start_crate: Crate) -> Option<FunctionId> {
285 lang_item(db, start_crate, self).and_then(|t| t.as_function())
286 }
287
288 pub fn resolve_trait(self, db: &dyn DefDatabase, start_crate: Crate) -> Option<TraitId> {
289 lang_item(db, start_crate, self).and_then(|t| t.as_trait())
290 }
291
292 pub fn resolve_enum(self, db: &dyn DefDatabase, start_crate: Crate) -> Option<EnumId> {
293 lang_item(db, start_crate, self).and_then(|t| t.as_enum())
294 }
295
296 pub fn resolve_type_alias(
297 self,
298 db: &dyn DefDatabase,
299 start_crate: Crate,
300 ) -> Option<TypeAliasId> {
301 lang_item(db, start_crate, self).and_then(|t| t.as_type_alias())
302 }
303
304 pub fn from_name(name: &hir_expand::name::Name) -> Option<Self> {
306 Self::from_symbol(name.symbol())
307 }
308
309 pub fn path(&self, db: &dyn DefDatabase, start_crate: Crate) -> Option<Path> {
310 let t = lang_item(db, start_crate, *self)?;
311 Some(Path::LangItem(t, None))
312 }
313
314 pub fn ty_rel_path(&self, db: &dyn DefDatabase, start_crate: Crate, seg: Name) -> Option<Path> {
315 let t = lang_item(db, start_crate, *self)?;
316 Some(Path::LangItem(t, Some(seg)))
317 }
318}
319
320language_item_table! {
321Sized, sym::sized, sized_trait, Target::Trait, GenericRequirement::Exact(0);
323 MetaSized, sym::meta_sized, sized_trait, Target::Trait, GenericRequirement::Exact(0);
324 PointeeSized, sym::pointee_sized, sized_trait, Target::Trait, GenericRequirement::Exact(0);
325 Unsize, sym::unsize, unsize_trait, Target::Trait, GenericRequirement::Minimum(1);
326 StructuralPeq, sym::structural_peq, structural_peq_trait, Target::Trait, GenericRequirement::None;
328 StructuralTeq, sym::structural_teq, structural_teq_trait, Target::Trait, GenericRequirement::None;
330 Copy, sym::copy, copy_trait, Target::Trait, GenericRequirement::Exact(0);
331 Clone, sym::clone, clone_trait, Target::Trait, GenericRequirement::None;
332 Sync, sym::sync, sync_trait, Target::Trait, GenericRequirement::Exact(0);
333 DiscriminantKind, sym::discriminant_kind, discriminant_kind_trait, Target::Trait, GenericRequirement::None;
334 Discriminant, sym::discriminant_type, discriminant_type, Target::AssocTy, GenericRequirement::None;
336
337 PointeeTrait, sym::pointee_trait, pointee_trait, Target::Trait, GenericRequirement::None;
338 Metadata, sym::metadata_type, metadata_type, Target::AssocTy, GenericRequirement::None;
339 DynMetadata, sym::dyn_metadata, dyn_metadata, Target::Struct, GenericRequirement::None;
340
341 Freeze, sym::freeze, freeze_trait, Target::Trait, GenericRequirement::Exact(0);
342
343 FnPtrTrait, sym::fn_ptr_trait, fn_ptr_trait, Target::Trait, GenericRequirement::Exact(0);
344 FnPtrAddr, sym::fn_ptr_addr, fn_ptr_addr, Target::Method(MethodKind::Trait { body: false }), GenericRequirement::None;
345
346 Drop, sym::drop, drop_trait, Target::Trait, GenericRequirement::None;
347 Destruct, sym::destruct, destruct_trait, Target::Trait, GenericRequirement::None;
348
349 CoerceUnsized, sym::coerce_unsized, coerce_unsized_trait, Target::Trait, GenericRequirement::Minimum(1);
350 DispatchFromDyn, sym::dispatch_from_dyn, dispatch_from_dyn_trait, Target::Trait, GenericRequirement::Minimum(1);
351
352 TransmuteOpts, sym::transmute_opts, transmute_opts, Target::Struct, GenericRequirement::Exact(0);
354 TransmuteTrait, sym::transmute_trait, transmute_trait, Target::Trait, GenericRequirement::Exact(3);
355
356 Add, sym::add, add_trait, Target::Trait, GenericRequirement::Exact(1);
357 Sub, sym::sub, sub_trait, Target::Trait, GenericRequirement::Exact(1);
358 Mul, sym::mul, mul_trait, Target::Trait, GenericRequirement::Exact(1);
359 Div, sym::div, div_trait, Target::Trait, GenericRequirement::Exact(1);
360 Rem, sym::rem, rem_trait, Target::Trait, GenericRequirement::Exact(1);
361 Neg, sym::neg, neg_trait, Target::Trait, GenericRequirement::Exact(0);
362 Not, sym::not, not_trait, Target::Trait, GenericRequirement::Exact(0);
363 BitXor, sym::bitxor, bitxor_trait, Target::Trait, GenericRequirement::Exact(1);
364 BitAnd, sym::bitand, bitand_trait, Target::Trait, GenericRequirement::Exact(1);
365 BitOr, sym::bitor, bitor_trait, Target::Trait, GenericRequirement::Exact(1);
366 Shl, sym::shl, shl_trait, Target::Trait, GenericRequirement::Exact(1);
367 Shr, sym::shr, shr_trait, Target::Trait, GenericRequirement::Exact(1);
368 AddAssign, sym::add_assign, add_assign_trait, Target::Trait, GenericRequirement::Exact(1);
369 SubAssign, sym::sub_assign, sub_assign_trait, Target::Trait, GenericRequirement::Exact(1);
370 MulAssign, sym::mul_assign, mul_assign_trait, Target::Trait, GenericRequirement::Exact(1);
371 DivAssign, sym::div_assign, div_assign_trait, Target::Trait, GenericRequirement::Exact(1);
372 RemAssign, sym::rem_assign, rem_assign_trait, Target::Trait, GenericRequirement::Exact(1);
373 BitXorAssign, sym::bitxor_assign, bitxor_assign_trait, Target::Trait, GenericRequirement::Exact(1);
374 BitAndAssign, sym::bitand_assign, bitand_assign_trait, Target::Trait, GenericRequirement::Exact(1);
375 BitOrAssign, sym::bitor_assign, bitor_assign_trait, Target::Trait, GenericRequirement::Exact(1);
376 ShlAssign, sym::shl_assign, shl_assign_trait, Target::Trait, GenericRequirement::Exact(1);
377 ShrAssign, sym::shr_assign, shr_assign_trait, Target::Trait, GenericRequirement::Exact(1);
378 Index, sym::index, index_trait, Target::Trait, GenericRequirement::Exact(1);
379 IndexMut, sym::index_mut, index_mut_trait, Target::Trait, GenericRequirement::Exact(1);
380
381 UnsafeCell, sym::unsafe_cell, unsafe_cell_type, Target::Struct, GenericRequirement::None;
382 UnsafePinned, sym::unsafe_pinned, unsafe_pinned_type, Target::Struct, GenericRequirement::None;
383 VaList, sym::va_list, va_list, Target::Struct, GenericRequirement::None;
384
385 Deref, sym::deref, deref_trait, Target::Trait, GenericRequirement::Exact(0);
386 DerefMut, sym::deref_mut, deref_mut_trait, Target::Trait, GenericRequirement::Exact(0);
387 DerefTarget, sym::deref_target, deref_target, Target::AssocTy, GenericRequirement::None;
388 Receiver, sym::receiver, receiver_trait, Target::Trait, GenericRequirement::None;
389 ReceiverTarget, sym::receiver_target, receiver_target, Target::AssocTy, GenericRequirement::None;
390
391 Fn, sym::fn_, fn_trait, Target::Trait, GenericRequirement::Exact(1);
392 FnMut, sym::fn_mut, fn_mut_trait, Target::Trait, GenericRequirement::Exact(1);
393 FnOnce, sym::fn_once, fn_once_trait, Target::Trait, GenericRequirement::Exact(1);
394 AsyncFn, sym::async_fn, async_fn_trait, Target::Trait, GenericRequirement::Exact(1);
395 AsyncFnMut, sym::async_fn_mut, async_fn_mut_trait, Target::Trait, GenericRequirement::Exact(1);
396 AsyncFnOnce, sym::async_fn_once, async_fn_once_trait, Target::Trait, GenericRequirement::Exact(1);
397
398 CallRefFuture, sym::call_ref_future, call_ref_future_ty, Target::AssocTy, GenericRequirement::None;
399 CallOnceFuture, sym::call_once_future, call_once_future_ty, Target::AssocTy, GenericRequirement::None;
400 AsyncFnOnceOutput, sym::async_fn_once_output, async_fn_once_output_ty, Target::AssocTy, GenericRequirement::None;
401
402 FnOnceOutput, sym::fn_once_output, fn_once_output, Target::AssocTy, GenericRequirement::None;
403
404 Future, sym::future_trait, future_trait, Target::Trait, GenericRequirement::Exact(0);
405 CoroutineState, sym::coroutine_state, coroutine_state, Target::Enum, GenericRequirement::None;
406 Coroutine, sym::coroutine, coroutine_trait, Target::Trait, GenericRequirement::Minimum(1);
407 CoroutineReturn, sym::coroutine_return, coroutine_return_ty, Target::AssocTy, GenericRequirement::None;
408 CoroutineYield, sym::coroutine_yield, coroutine_yield_ty, Target::AssocTy, GenericRequirement::None;
409 Unpin, sym::unpin, unpin_trait, Target::Trait, GenericRequirement::None;
410 Pin, sym::pin, pin_type, Target::Struct, GenericRequirement::None;
411
412 PartialEq, sym::eq, eq_trait, Target::Trait, GenericRequirement::Exact(1);
413 PartialOrd, sym::partial_ord, partial_ord_trait, Target::Trait, GenericRequirement::Exact(1);
414 CVoid, sym::c_void, c_void, Target::Enum, GenericRequirement::None;
415
416 Panic, sym::panic, panic_fn, Target::Fn, GenericRequirement::Exact(0);
424 PanicNounwind, sym::panic_nounwind, panic_nounwind, Target::Fn, GenericRequirement::Exact(0);
425 PanicFmt, sym::panic_fmt, panic_fmt, Target::Fn, GenericRequirement::None;
426 PanicDisplay, sym::panic_display, panic_display, Target::Fn, GenericRequirement::None;
427 ConstPanicFmt, sym::const_panic_fmt, const_panic_fmt, Target::Fn, GenericRequirement::None;
428 PanicBoundsCheck, sym::panic_bounds_check, panic_bounds_check_fn, Target::Fn, GenericRequirement::Exact(0);
429 PanicMisalignedPointerDereference, sym::panic_misaligned_pointer_dereference, panic_misaligned_pointer_dereference_fn, Target::Fn, GenericRequirement::Exact(0);
430 PanicInfo, sym::panic_info, panic_info, Target::Struct, GenericRequirement::None;
431 PanicLocation, sym::panic_location, panic_location, Target::Struct, GenericRequirement::None;
432 PanicImpl, sym::panic_impl, panic_impl, Target::Fn, GenericRequirement::None;
433 PanicCannotUnwind, sym::panic_cannot_unwind, panic_cannot_unwind, Target::Fn, GenericRequirement::Exact(0);
434 PanicNullPointerDereference, sym::panic_null_pointer_dereference, panic_null_pointer_dereference, Target::Fn, GenericRequirement::None;
435 BeginPanic, sym::begin_panic, begin_panic_fn, Target::Fn, GenericRequirement::None;
437
438 FormatAlignment, sym::format_alignment, format_alignment, Target::Enum, GenericRequirement::None;
440 FormatArgument, sym::format_argument, format_argument, Target::Struct, GenericRequirement::None;
441 FormatArguments, sym::format_arguments, format_arguments, Target::Struct, GenericRequirement::None;
442 FormatCount, sym::format_count, format_count, Target::Enum, GenericRequirement::None;
443 FormatPlaceholder, sym::format_placeholder, format_placeholder, Target::Struct, GenericRequirement::None;
444 FormatUnsafeArg, sym::format_unsafe_arg, format_unsafe_arg, Target::Struct, GenericRequirement::None;
445
446 ExchangeMalloc, sym::exchange_malloc, exchange_malloc_fn, Target::Fn, GenericRequirement::None;
447 BoxFree, sym::box_free, box_free_fn, Target::Fn, GenericRequirement::Minimum(1);
448 DropInPlace, sym::drop_in_place, drop_in_place_fn, Target::Fn, GenericRequirement::Minimum(1);
449 AllocLayout, sym::alloc_layout, alloc_layout, Target::Struct, GenericRequirement::None;
450
451 Start, sym::start, start_fn, Target::Fn, GenericRequirement::Exact(1);
452
453 EhPersonality, sym::eh_personality, eh_personality, Target::Fn, GenericRequirement::None;
454 EhCatchTypeinfo, sym::eh_catch_typeinfo, eh_catch_typeinfo, Target::Static, GenericRequirement::None;
455
456 OwnedBox, sym::owned_box, owned_box, Target::Struct, GenericRequirement::Minimum(1);
457
458 PhantomData, sym::phantom_data, phantom_data, Target::Struct, GenericRequirement::Exact(1);
459
460 ManuallyDrop, sym::manually_drop, manually_drop, Target::Struct, GenericRequirement::None;
461
462 MaybeUninit, sym::maybe_uninit, maybe_uninit, Target::Union, GenericRequirement::None;
463
464 AlignOffset, sym::align_offset, align_offset_fn, Target::Fn, GenericRequirement::None;
466
467 Termination, sym::termination, termination, Target::Trait, GenericRequirement::None;
468
469 Try, sym::Try, try_trait, Target::Trait, GenericRequirement::None;
470
471 Tuple, sym::tuple_trait, tuple_trait, Target::Trait, GenericRequirement::Exact(0);
472
473 SliceLen, sym::slice_len_fn, slice_len_fn, Target::Method(MethodKind::Inherent), GenericRequirement::None;
474
475 TryTraitFromResidual, sym::from_residual, from_residual_fn, Target::Method(MethodKind::Trait { body: false }), GenericRequirement::None;
477 TryTraitFromOutput, sym::from_output, from_output_fn, Target::Method(MethodKind::Trait { body: false }), GenericRequirement::None;
478 TryTraitBranch, sym::branch, branch_fn, Target::Method(MethodKind::Trait { body: false }), GenericRequirement::None;
479 TryTraitFromYeet, sym::from_yeet, from_yeet_fn, Target::Fn, GenericRequirement::None;
480
481 PointerLike, sym::pointer_like, pointer_like, Target::Trait, GenericRequirement::Exact(0);
482
483 ConstParamTy, sym::const_param_ty, const_param_ty_trait, Target::Trait, GenericRequirement::Exact(0);
484
485 Poll, sym::Poll, poll, Target::Enum, GenericRequirement::None;
486 PollReady, sym::Ready, poll_ready_variant, Target::Variant, GenericRequirement::None;
487 PollPending, sym::Pending, poll_pending_variant, Target::Variant, GenericRequirement::None;
488
489 ResumeTy, sym::ResumeTy, resume_ty, Target::Struct, GenericRequirement::None;
492 GetContext, sym::get_context, get_context_fn, Target::Fn, GenericRequirement::None;
493
494 Context, sym::Context, context, Target::Struct, GenericRequirement::None;
495 FuturePoll, sym::poll, future_poll_fn, Target::Method(MethodKind::Trait { body: false }), GenericRequirement::None;
496 FutureOutput, sym::future_output, future_output, Target::TypeAlias, GenericRequirement::None;
497
498 Option, sym::Option, option_type, Target::Enum, GenericRequirement::None;
499 OptionSome, sym::Some, option_some_variant, Target::Variant, GenericRequirement::None;
500 OptionNone, sym::None, option_none_variant, Target::Variant, GenericRequirement::None;
501
502 ResultOk, sym::Ok, result_ok_variant, Target::Variant, GenericRequirement::None;
503 ResultErr, sym::Err, result_err_variant, Target::Variant, GenericRequirement::None;
504
505 ControlFlowContinue, sym::Continue, cf_continue_variant, Target::Variant, GenericRequirement::None;
506 ControlFlowBreak, sym::Break, cf_break_variant, Target::Variant, GenericRequirement::None;
507
508 IntoFutureIntoFuture, sym::into_future, into_future_fn, Target::Method(MethodKind::Trait { body: false }), GenericRequirement::None;
509 IntoIterIntoIter, sym::into_iter, into_iter_fn, Target::Method(MethodKind::Trait { body: false }), GenericRequirement::None;
510 IteratorNext, sym::next, next_fn, Target::Method(MethodKind::Trait { body: false}), GenericRequirement::None;
511 Iterator, sym::iterator, iterator, Target::Trait, GenericRequirement::None;
512
513 PinNewUnchecked, sym::new_unchecked, new_unchecked_fn, Target::Method(MethodKind::Inherent), GenericRequirement::None;
514
515 RangeFrom, sym::RangeFrom, range_from_struct, Target::Struct, GenericRequirement::None;
516 RangeFull, sym::RangeFull, range_full_struct, Target::Struct, GenericRequirement::None;
517 RangeInclusiveStruct, sym::RangeInclusive, range_inclusive_struct, Target::Struct, GenericRequirement::None;
518 RangeInclusiveNew, sym::range_inclusive_new, range_inclusive_new_method, Target::Method(MethodKind::Inherent), GenericRequirement::None;
519 Range, sym::Range, range_struct, Target::Struct, GenericRequirement::None;
520 RangeToInclusive, sym::RangeToInclusive, range_to_inclusive_struct, Target::Struct, GenericRequirement::None;
521 RangeTo, sym::RangeTo, range_to_struct, Target::Struct, GenericRequirement::None;
522
523 String, sym::String, string, Target::Struct, GenericRequirement::None;
524 CStr, sym::CStr, c_str, Target::Struct, GenericRequirement::None;
525 Ordering, sym::Ordering, ordering, Target::Enum, GenericRequirement::None;
526}