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