1#![allow(
5 clippy::deref_addrof,
6 clippy::just_underscores_and_digits,
7 clippy::large_enum_variant,
8 clippy::needless_borrow,
9 clippy::needless_question_mark,
10 unreachable_patterns
11)]
12
13use super::translate_ctx::TranslateCtx;
14use charon_lib::ast::from_rustc::{self, FromRustcError};
15use rustc_ast::attr::version::*;
16use rustc_attr_ir::lang_items::*;
17use rustc_hir::attrs::*;
18use rustc_span::symbol::*;
19
20impl<'tcx> TranslateCtx<'tcx> {
21 pub(crate) fn translate_rustc_attribute_kind(
22 &mut self,
23 value: &AttributeKind,
24 ) -> Result<from_rustc::AttributeKind, FromRustcError> {
25 self.translate_attribute_kind_from_rustc(value)
26 }
27
28 pub(crate) fn translate_rustc_lang_item(
29 &mut self,
30 value: &LangItem,
31 ) -> Result<from_rustc::LangItem, FromRustcError> {
32 self.translate_lang_item_from_rustc(value)
33 }
34
35 fn translate_attribute_kind_from_rustc(
36 &mut self,
37 value: &AttributeKind,
38 ) -> Result<from_rustc::AttributeKind, FromRustcError> {
39 match value {
40 AttributeKind::AutomaticallyDerived => {
41 Ok(from_rustc::AttributeKind::AutomaticallyDerived)
42 }
43 AttributeKind::Cold => Ok(from_rustc::AttributeKind::Cold),
44 AttributeKind::Deprecated { deprecation, span } => {
45 Ok(from_rustc::AttributeKind::Deprecated {
46 deprecation: self.translate_deprecation_from_rustc(deprecation)?,
47 span: self.translate_span(span),
48 })
49 }
50 AttributeKind::Fundamental => Ok(from_rustc::AttributeKind::Fundamental),
51 AttributeKind::Ignore { span, reason } => Ok(from_rustc::AttributeKind::Ignore {
52 span: self.translate_span(span),
53 reason: (reason)
54 .as_ref()
55 .map(|value| Ok((value).to_string().into()))
56 .transpose()?,
57 }),
58 AttributeKind::Inline(_0, _1) => Ok(from_rustc::AttributeKind::Inline(
59 self.translate_inline_attr_from_rustc(_0)?,
60 self.translate_span(_1),
61 )),
62 AttributeKind::MayDangle(_0) => Ok(from_rustc::AttributeKind::MayDangle(
63 self.translate_span(_0),
64 )),
65 AttributeKind::Naked(_0) => {
66 Ok(from_rustc::AttributeKind::Naked(self.translate_span(_0)))
67 }
68 AttributeKind::NoLink => Ok(from_rustc::AttributeKind::NoLink),
69 AttributeKind::NoMangle(_0) => {
70 Ok(from_rustc::AttributeKind::NoMangle(self.translate_span(_0)))
71 }
72 AttributeKind::NonExhaustive(_0) => Ok(from_rustc::AttributeKind::NonExhaustive(
73 self.translate_span(_0),
74 )),
75 AttributeKind::Optimize(_0, _1) => Ok(from_rustc::AttributeKind::Optimize(
76 self.translate_optimize_attr_from_rustc(_0)?,
77 self.translate_span(_1),
78 )),
79 AttributeKind::RustcAlign { align, span } => {
80 Ok(from_rustc::AttributeKind::RustcAlign {
81 align: align.bytes(),
82 span: self.translate_span(span),
83 })
84 }
85 AttributeKind::RustcIntrinsic => Ok(from_rustc::AttributeKind::RustcIntrinsic),
86 AttributeKind::RustcTestEntrypointMarker => {
87 Ok(from_rustc::AttributeKind::RustcTestEntrypointMarker)
88 }
89 AttributeKind::ShouldPanic { reason } => Ok(from_rustc::AttributeKind::ShouldPanic {
90 reason: (reason)
91 .as_ref()
92 .map(|value| Ok((value).to_string().into()))
93 .transpose()?,
94 }),
95 AttributeKind::TargetFeature {
96 features,
97 attr_span,
98 was_forced,
99 } => Ok(from_rustc::AttributeKind::TargetFeature {
100 features: (features)
101 .iter()
102 .map(|value| {
103 Ok((
104 (&((value).0)).to_string().into(),
105 self.translate_span(&((value).1)),
106 ))
107 })
108 .collect::<Result<Vec<_>, FromRustcError>>()?,
109 attr_span: self.translate_span(attr_span),
110 was_forced: *(was_forced),
111 }),
112 AttributeKind::TrackCaller(_0) => Ok(from_rustc::AttributeKind::TrackCaller(
113 self.translate_span(_0),
114 )),
115 _ => Err(FromRustcError),
116 }
117 }
118
119 fn translate_lang_item_from_rustc(
120 &mut self,
121 value: &LangItem,
122 ) -> Result<from_rustc::LangItem, FromRustcError> {
123 match value {
124 LangItem::Sized => Ok(from_rustc::LangItem::Sized),
125 LangItem::MetaSized => Ok(from_rustc::LangItem::MetaSized),
126 LangItem::PointeeSized => Ok(from_rustc::LangItem::PointeeSized),
127 LangItem::Unsize => Ok(from_rustc::LangItem::Unsize),
128 LangItem::AlignOf => Ok(from_rustc::LangItem::AlignOf),
129 LangItem::SizeOf => Ok(from_rustc::LangItem::SizeOf),
130 LangItem::OffsetOf => Ok(from_rustc::LangItem::OffsetOf),
131 LangItem::StructuralPeq => Ok(from_rustc::LangItem::StructuralPeq),
132 LangItem::Copy => Ok(from_rustc::LangItem::Copy),
133 LangItem::Clone => Ok(from_rustc::LangItem::Clone),
134 LangItem::CloneFn => Ok(from_rustc::LangItem::CloneFn),
135 LangItem::UseCloned => Ok(from_rustc::LangItem::UseCloned),
136 LangItem::TrivialClone => Ok(from_rustc::LangItem::TrivialClone),
137 LangItem::Sync => Ok(from_rustc::LangItem::Sync),
138 LangItem::DiscriminantKind => Ok(from_rustc::LangItem::DiscriminantKind),
139 LangItem::Discriminant => Ok(from_rustc::LangItem::Discriminant),
140 LangItem::PointeeTrait => Ok(from_rustc::LangItem::PointeeTrait),
141 LangItem::Metadata => Ok(from_rustc::LangItem::Metadata),
142 LangItem::DynMetadata => Ok(from_rustc::LangItem::DynMetadata),
143 LangItem::Freeze => Ok(from_rustc::LangItem::Freeze),
144 LangItem::UnsafeUnpin => Ok(from_rustc::LangItem::UnsafeUnpin),
145 LangItem::FnPtrTrait => Ok(from_rustc::LangItem::FnPtrTrait),
146 LangItem::FnPtrAddr => Ok(from_rustc::LangItem::FnPtrAddr),
147 LangItem::Drop => Ok(from_rustc::LangItem::Drop),
148 LangItem::Destruct => Ok(from_rustc::LangItem::Destruct),
149 LangItem::AsyncDrop => Ok(from_rustc::LangItem::AsyncDrop),
150 LangItem::AsyncDropInPlace => Ok(from_rustc::LangItem::AsyncDropInPlace),
151 LangItem::CoerceUnsized => Ok(from_rustc::LangItem::CoerceUnsized),
152 LangItem::DispatchFromDyn => Ok(from_rustc::LangItem::DispatchFromDyn),
153 LangItem::TryAsDyn => Ok(from_rustc::LangItem::TryAsDyn),
154 LangItem::TransmuteOpts => Ok(from_rustc::LangItem::TransmuteOpts),
155 LangItem::TransmuteTrait => Ok(from_rustc::LangItem::TransmuteTrait),
156 LangItem::Add => Ok(from_rustc::LangItem::Add),
157 LangItem::Sub => Ok(from_rustc::LangItem::Sub),
158 LangItem::Mul => Ok(from_rustc::LangItem::Mul),
159 LangItem::Div => Ok(from_rustc::LangItem::Div),
160 LangItem::Rem => Ok(from_rustc::LangItem::Rem),
161 LangItem::Neg => Ok(from_rustc::LangItem::Neg),
162 LangItem::Not => Ok(from_rustc::LangItem::Not),
163 LangItem::BitXor => Ok(from_rustc::LangItem::BitXor),
164 LangItem::BitAnd => Ok(from_rustc::LangItem::BitAnd),
165 LangItem::BitOr => Ok(from_rustc::LangItem::BitOr),
166 LangItem::Shl => Ok(from_rustc::LangItem::Shl),
167 LangItem::Shr => Ok(from_rustc::LangItem::Shr),
168 LangItem::AddAssign => Ok(from_rustc::LangItem::AddAssign),
169 LangItem::SubAssign => Ok(from_rustc::LangItem::SubAssign),
170 LangItem::MulAssign => Ok(from_rustc::LangItem::MulAssign),
171 LangItem::DivAssign => Ok(from_rustc::LangItem::DivAssign),
172 LangItem::RemAssign => Ok(from_rustc::LangItem::RemAssign),
173 LangItem::BitXorAssign => Ok(from_rustc::LangItem::BitXorAssign),
174 LangItem::BitAndAssign => Ok(from_rustc::LangItem::BitAndAssign),
175 LangItem::BitOrAssign => Ok(from_rustc::LangItem::BitOrAssign),
176 LangItem::ShlAssign => Ok(from_rustc::LangItem::ShlAssign),
177 LangItem::ShrAssign => Ok(from_rustc::LangItem::ShrAssign),
178 LangItem::Index => Ok(from_rustc::LangItem::Index),
179 LangItem::IndexMut => Ok(from_rustc::LangItem::IndexMut),
180 LangItem::UnsafeCell => Ok(from_rustc::LangItem::UnsafeCell),
181 LangItem::CovariantUnsafeCell => Ok(from_rustc::LangItem::CovariantUnsafeCell),
182 LangItem::UnsafePinned => Ok(from_rustc::LangItem::UnsafePinned),
183 LangItem::VaArgSafe => Ok(from_rustc::LangItem::VaArgSafe),
184 LangItem::VaList => Ok(from_rustc::LangItem::VaList),
185 LangItem::Complex => Ok(from_rustc::LangItem::Complex),
186 LangItem::Deref => Ok(from_rustc::LangItem::Deref),
187 LangItem::DerefMut => Ok(from_rustc::LangItem::DerefMut),
188 LangItem::DerefPure => Ok(from_rustc::LangItem::DerefPure),
189 LangItem::DerefTarget => Ok(from_rustc::LangItem::DerefTarget),
190 LangItem::Receiver => Ok(from_rustc::LangItem::Receiver),
191 LangItem::ReceiverTarget => Ok(from_rustc::LangItem::ReceiverTarget),
192 LangItem::LegacyReceiver => Ok(from_rustc::LangItem::LegacyReceiver),
193 LangItem::Fn => Ok(from_rustc::LangItem::Fn),
194 LangItem::FnMut => Ok(from_rustc::LangItem::FnMut),
195 LangItem::FnOnce => Ok(from_rustc::LangItem::FnOnce),
196 LangItem::AsyncFn => Ok(from_rustc::LangItem::AsyncFn),
197 LangItem::AsyncFnMut => Ok(from_rustc::LangItem::AsyncFnMut),
198 LangItem::AsyncFnOnce => Ok(from_rustc::LangItem::AsyncFnOnce),
199 LangItem::AsyncFnOnceOutput => Ok(from_rustc::LangItem::AsyncFnOnceOutput),
200 LangItem::CallOnceFuture => Ok(from_rustc::LangItem::CallOnceFuture),
201 LangItem::CallRefFuture => Ok(from_rustc::LangItem::CallRefFuture),
202 LangItem::AsyncFnKindHelper => Ok(from_rustc::LangItem::AsyncFnKindHelper),
203 LangItem::AsyncFnKindUpvars => Ok(from_rustc::LangItem::AsyncFnKindUpvars),
204 LangItem::FnOnceOutput => Ok(from_rustc::LangItem::FnOnceOutput),
205 LangItem::Iterator => Ok(from_rustc::LangItem::Iterator),
206 LangItem::FusedIterator => Ok(from_rustc::LangItem::FusedIterator),
207 LangItem::Future => Ok(from_rustc::LangItem::Future),
208 LangItem::FutureOutput => Ok(from_rustc::LangItem::FutureOutput),
209 LangItem::AsyncIterator => Ok(from_rustc::LangItem::AsyncIterator),
210 LangItem::CoroutineState => Ok(from_rustc::LangItem::CoroutineState),
211 LangItem::Coroutine => Ok(from_rustc::LangItem::Coroutine),
212 LangItem::CoroutineReturn => Ok(from_rustc::LangItem::CoroutineReturn),
213 LangItem::CoroutineYield => Ok(from_rustc::LangItem::CoroutineYield),
214 LangItem::CoroutineResume => Ok(from_rustc::LangItem::CoroutineResume),
215 LangItem::Unpin => Ok(from_rustc::LangItem::Unpin),
216 LangItem::Pin => Ok(from_rustc::LangItem::Pin),
217 LangItem::OrderingEnum => Ok(from_rustc::LangItem::OrderingEnum),
218 LangItem::PartialEq => Ok(from_rustc::LangItem::PartialEq),
219 LangItem::PartialOrd => Ok(from_rustc::LangItem::PartialOrd),
220 LangItem::CVoid => Ok(from_rustc::LangItem::CVoid),
221 LangItem::Type => Ok(from_rustc::LangItem::Type),
222 LangItem::TypeGeneric => Ok(from_rustc::LangItem::TypeGeneric),
223 LangItem::TypeId => Ok(from_rustc::LangItem::TypeId),
224 LangItem::Panic => Ok(from_rustc::LangItem::Panic),
225 LangItem::PanicNounwind => Ok(from_rustc::LangItem::PanicNounwind),
226 LangItem::PanicFmt => Ok(from_rustc::LangItem::PanicFmt),
227 LangItem::PanicDisplay => Ok(from_rustc::LangItem::PanicDisplay),
228 LangItem::ConstPanicFmt => Ok(from_rustc::LangItem::ConstPanicFmt),
229 LangItem::PanicBoundsCheck => Ok(from_rustc::LangItem::PanicBoundsCheck),
230 LangItem::PanicMisalignedPointerDereference => {
231 Ok(from_rustc::LangItem::PanicMisalignedPointerDereference)
232 }
233 LangItem::PanicInfo => Ok(from_rustc::LangItem::PanicInfo),
234 LangItem::PanicLocation => Ok(from_rustc::LangItem::PanicLocation),
235 LangItem::PanicImpl => Ok(from_rustc::LangItem::PanicImpl),
236 LangItem::PanicCannotUnwind => Ok(from_rustc::LangItem::PanicCannotUnwind),
237 LangItem::PanicInCleanup => Ok(from_rustc::LangItem::PanicInCleanup),
238 LangItem::PanicAddOverflow => Ok(from_rustc::LangItem::PanicAddOverflow),
239 LangItem::PanicSubOverflow => Ok(from_rustc::LangItem::PanicSubOverflow),
240 LangItem::PanicMulOverflow => Ok(from_rustc::LangItem::PanicMulOverflow),
241 LangItem::PanicDivOverflow => Ok(from_rustc::LangItem::PanicDivOverflow),
242 LangItem::PanicRemOverflow => Ok(from_rustc::LangItem::PanicRemOverflow),
243 LangItem::PanicNegOverflow => Ok(from_rustc::LangItem::PanicNegOverflow),
244 LangItem::PanicShrOverflow => Ok(from_rustc::LangItem::PanicShrOverflow),
245 LangItem::PanicShlOverflow => Ok(from_rustc::LangItem::PanicShlOverflow),
246 LangItem::PanicDivZero => Ok(from_rustc::LangItem::PanicDivZero),
247 LangItem::PanicRemZero => Ok(from_rustc::LangItem::PanicRemZero),
248 LangItem::PanicCoroutineResumed => Ok(from_rustc::LangItem::PanicCoroutineResumed),
249 LangItem::PanicAsyncFnResumed => Ok(from_rustc::LangItem::PanicAsyncFnResumed),
250 LangItem::PanicAsyncGenFnResumed => Ok(from_rustc::LangItem::PanicAsyncGenFnResumed),
251 LangItem::PanicGenFnNone => Ok(from_rustc::LangItem::PanicGenFnNone),
252 LangItem::PanicCoroutineResumedPanic => {
253 Ok(from_rustc::LangItem::PanicCoroutineResumedPanic)
254 }
255 LangItem::PanicAsyncFnResumedPanic => {
256 Ok(from_rustc::LangItem::PanicAsyncFnResumedPanic)
257 }
258 LangItem::PanicAsyncGenFnResumedPanic => {
259 Ok(from_rustc::LangItem::PanicAsyncGenFnResumedPanic)
260 }
261 LangItem::PanicGenFnNonePanic => Ok(from_rustc::LangItem::PanicGenFnNonePanic),
262 LangItem::PanicNullPointerDereference => {
263 Ok(from_rustc::LangItem::PanicNullPointerDereference)
264 }
265 LangItem::PanicNullReferenceConstructed => {
266 Ok(from_rustc::LangItem::PanicNullReferenceConstructed)
267 }
268 LangItem::PanicInvalidEnumConstruction => {
269 Ok(from_rustc::LangItem::PanicInvalidEnumConstruction)
270 }
271 LangItem::PanicCoroutineResumedDrop => {
272 Ok(from_rustc::LangItem::PanicCoroutineResumedDrop)
273 }
274 LangItem::PanicAsyncFnResumedDrop => Ok(from_rustc::LangItem::PanicAsyncFnResumedDrop),
275 LangItem::PanicAsyncGenFnResumedDrop => {
276 Ok(from_rustc::LangItem::PanicAsyncGenFnResumedDrop)
277 }
278 LangItem::PanicGenFnNoneDrop => Ok(from_rustc::LangItem::PanicGenFnNoneDrop),
279 LangItem::BeginPanic => Ok(from_rustc::LangItem::BeginPanic),
280 LangItem::FormatArgument => Ok(from_rustc::LangItem::FormatArgument),
281 LangItem::FormatArguments => Ok(from_rustc::LangItem::FormatArguments),
282 LangItem::DropGlue => Ok(from_rustc::LangItem::DropGlue),
283 LangItem::AllocLayout => Ok(from_rustc::LangItem::AllocLayout),
284 LangItem::Start => Ok(from_rustc::LangItem::Start),
285 LangItem::EhPersonality => Ok(from_rustc::LangItem::EhPersonality),
286 LangItem::CompilerMove => Ok(from_rustc::LangItem::CompilerMove),
287 LangItem::CompilerCopy => Ok(from_rustc::LangItem::CompilerCopy),
288 LangItem::OwnedBox => Ok(from_rustc::LangItem::OwnedBox),
289 LangItem::GlobalAlloc => Ok(from_rustc::LangItem::GlobalAlloc),
290 LangItem::PhantomData => Ok(from_rustc::LangItem::PhantomData),
291 LangItem::ManuallyDrop => Ok(from_rustc::LangItem::ManuallyDrop),
292 LangItem::MaybeDangling => Ok(from_rustc::LangItem::MaybeDangling),
293 LangItem::BikeshedGuaranteedNoDrop => {
294 Ok(from_rustc::LangItem::BikeshedGuaranteedNoDrop)
295 }
296 LangItem::MaybeUninit => Ok(from_rustc::LangItem::MaybeUninit),
297 LangItem::Termination => Ok(from_rustc::LangItem::Termination),
298 LangItem::Try => Ok(from_rustc::LangItem::Try),
299 LangItem::Tuple => Ok(from_rustc::LangItem::Tuple),
300 LangItem::SliceLen => Ok(from_rustc::LangItem::SliceLen),
301 LangItem::TryTraitFromResidual => Ok(from_rustc::LangItem::TryTraitFromResidual),
302 LangItem::TryTraitFromOutput => Ok(from_rustc::LangItem::TryTraitFromOutput),
303 LangItem::TryTraitBranch => Ok(from_rustc::LangItem::TryTraitBranch),
304 LangItem::TryTraitFromYeet => Ok(from_rustc::LangItem::TryTraitFromYeet),
305 LangItem::ResidualIntoTryType => Ok(from_rustc::LangItem::ResidualIntoTryType),
306 LangItem::CoercePointeeValidated => Ok(from_rustc::LangItem::CoercePointeeValidated),
307 LangItem::ConstParamTy => Ok(from_rustc::LangItem::ConstParamTy),
308 LangItem::Poll => Ok(from_rustc::LangItem::Poll),
309 LangItem::PollReady => Ok(from_rustc::LangItem::PollReady),
310 LangItem::PollPending => Ok(from_rustc::LangItem::PollPending),
311 LangItem::AsyncGenReady => Ok(from_rustc::LangItem::AsyncGenReady),
312 LangItem::AsyncGenPending => Ok(from_rustc::LangItem::AsyncGenPending),
313 LangItem::AsyncGenFinished => Ok(from_rustc::LangItem::AsyncGenFinished),
314 LangItem::ResumeTy => Ok(from_rustc::LangItem::ResumeTy),
315 LangItem::GetContext => Ok(from_rustc::LangItem::GetContext),
316 LangItem::Context => Ok(from_rustc::LangItem::Context),
317 LangItem::FuturePoll => Ok(from_rustc::LangItem::FuturePoll),
318 LangItem::AsyncIteratorPollNext => Ok(from_rustc::LangItem::AsyncIteratorPollNext),
319 LangItem::IntoAsyncIterIntoIter => Ok(from_rustc::LangItem::IntoAsyncIterIntoIter),
320 LangItem::Option => Ok(from_rustc::LangItem::Option),
321 LangItem::OptionSome => Ok(from_rustc::LangItem::OptionSome),
322 LangItem::OptionNone => Ok(from_rustc::LangItem::OptionNone),
323 LangItem::ResultOk => Ok(from_rustc::LangItem::ResultOk),
324 LangItem::ResultErr => Ok(from_rustc::LangItem::ResultErr),
325 LangItem::ControlFlowContinue => Ok(from_rustc::LangItem::ControlFlowContinue),
326 LangItem::ControlFlowBreak => Ok(from_rustc::LangItem::ControlFlowBreak),
327 LangItem::IntoFutureIntoFuture => Ok(from_rustc::LangItem::IntoFutureIntoFuture),
328 LangItem::IntoIterIntoIter => Ok(from_rustc::LangItem::IntoIterIntoIter),
329 LangItem::IteratorNext => Ok(from_rustc::LangItem::IteratorNext),
330 LangItem::PinNewUnchecked => Ok(from_rustc::LangItem::PinNewUnchecked),
331 LangItem::RangeFrom => Ok(from_rustc::LangItem::RangeFrom),
332 LangItem::RangeFull => Ok(from_rustc::LangItem::RangeFull),
333 LangItem::RangeInclusiveStruct => Ok(from_rustc::LangItem::RangeInclusiveStruct),
334 LangItem::RangeInclusiveNew => Ok(from_rustc::LangItem::RangeInclusiveNew),
335 LangItem::Range => Ok(from_rustc::LangItem::Range),
336 LangItem::RangeToInclusive => Ok(from_rustc::LangItem::RangeToInclusive),
337 LangItem::RangeTo => Ok(from_rustc::LangItem::RangeTo),
338 LangItem::RangeMax => Ok(from_rustc::LangItem::RangeMax),
339 LangItem::RangeMin => Ok(from_rustc::LangItem::RangeMin),
340 LangItem::RangeSub => Ok(from_rustc::LangItem::RangeSub),
341 LangItem::RangeFromCopy => Ok(from_rustc::LangItem::RangeFromCopy),
342 LangItem::RangeCopy => Ok(from_rustc::LangItem::RangeCopy),
343 LangItem::RangeInclusiveCopy => Ok(from_rustc::LangItem::RangeInclusiveCopy),
344 LangItem::RangeToInclusiveCopy => Ok(from_rustc::LangItem::RangeToInclusiveCopy),
345 LangItem::String => Ok(from_rustc::LangItem::String),
346 LangItem::CStr => Ok(from_rustc::LangItem::CStr),
347 LangItem::ContractBuildCheckEnsures => {
348 Ok(from_rustc::LangItem::ContractBuildCheckEnsures)
349 }
350 LangItem::ContractCheckRequires => Ok(from_rustc::LangItem::ContractCheckRequires),
351 LangItem::DefaultTrait4 => Ok(from_rustc::LangItem::DefaultTrait4),
352 LangItem::DefaultTrait3 => Ok(from_rustc::LangItem::DefaultTrait3),
353 LangItem::DefaultTrait2 => Ok(from_rustc::LangItem::DefaultTrait2),
354 LangItem::DefaultTrait1 => Ok(from_rustc::LangItem::DefaultTrait1),
355 LangItem::ContractCheckEnsures => Ok(from_rustc::LangItem::ContractCheckEnsures),
356 LangItem::Reborrow => Ok(from_rustc::LangItem::Reborrow),
357 LangItem::CoerceShared => Ok(from_rustc::LangItem::CoerceShared),
358 LangItem::FieldRepresentingType => Ok(from_rustc::LangItem::FieldRepresentingType),
359 LangItem::Field => Ok(from_rustc::LangItem::Field),
360 LangItem::FieldBase => Ok(from_rustc::LangItem::FieldBase),
361 LangItem::FieldType => Ok(from_rustc::LangItem::FieldType),
362 LangItem::FieldOffset => Ok(from_rustc::LangItem::FieldOffset),
363 LangItem::From => Ok(from_rustc::LangItem::From),
364 LangItem::FromFn => Ok(from_rustc::LangItem::FromFn),
365 _ => Err(FromRustcError),
367 }
368 }
369
370 fn translate_deprecation_from_rustc(
371 &mut self,
372 value: &Deprecation,
373 ) -> Result<from_rustc::Deprecation, FromRustcError> {
374 Ok(from_rustc::Deprecation {
375 since: self.translate_deprecated_since_from_rustc(&value.since)?,
376 note: (&value.note)
377 .as_ref()
378 .map(|value| Ok(self.translate_ident_from_rustc(value)?))
379 .transpose()?,
380 suggestion: (&value.suggestion)
381 .as_ref()
382 .map(|value| Ok((value).to_string().into()))
383 .transpose()?,
384 })
385 }
386
387 fn translate_inline_attr_from_rustc(
388 &mut self,
389 value: &InlineAttr,
390 ) -> Result<from_rustc::InlineAttr, FromRustcError> {
391 match value {
392 InlineAttr::None => Ok(from_rustc::InlineAttr::None),
393 InlineAttr::Hint => Ok(from_rustc::InlineAttr::Hint),
394 InlineAttr::Always => Ok(from_rustc::InlineAttr::Always),
395 InlineAttr::Never => Ok(from_rustc::InlineAttr::Never),
396 InlineAttr::Force { attr_span, reason } => Ok(from_rustc::InlineAttr::Force {
397 attr_span: self.translate_span(attr_span),
398 reason: (reason)
399 .as_ref()
400 .map(|value| Ok((value).to_string().into()))
401 .transpose()?,
402 }),
403 _ => Err(FromRustcError),
405 }
406 }
407
408 fn translate_optimize_attr_from_rustc(
409 &mut self,
410 value: &OptimizeAttr,
411 ) -> Result<from_rustc::OptimizeAttr, FromRustcError> {
412 match value {
413 OptimizeAttr::Default => Ok(from_rustc::OptimizeAttr::Default),
414 OptimizeAttr::DoNotOptimize => Ok(from_rustc::OptimizeAttr::DoNotOptimize),
415 OptimizeAttr::Speed => Ok(from_rustc::OptimizeAttr::Speed),
416 OptimizeAttr::Size => Ok(from_rustc::OptimizeAttr::Size),
417 _ => Err(FromRustcError),
419 }
420 }
421
422 fn translate_deprecated_since_from_rustc(
423 &mut self,
424 value: &DeprecatedSince,
425 ) -> Result<from_rustc::DeprecatedSince, FromRustcError> {
426 match value {
427 DeprecatedSince::RustcVersion(_0) => Ok(from_rustc::DeprecatedSince::RustcVersion(
428 self.translate_rustc_version_from_rustc(_0)?,
429 )),
430 DeprecatedSince::Future => Ok(from_rustc::DeprecatedSince::Future),
431 DeprecatedSince::NonStandard(_0) => Ok(from_rustc::DeprecatedSince::NonStandard(
432 (_0).to_string().into(),
433 )),
434 DeprecatedSince::Unspecified => Ok(from_rustc::DeprecatedSince::Unspecified),
435 DeprecatedSince::Err => Ok(from_rustc::DeprecatedSince::Err),
436 _ => Err(FromRustcError),
438 }
439 }
440
441 fn translate_ident_from_rustc(
442 &mut self,
443 value: &Ident,
444 ) -> Result<from_rustc::Ident, FromRustcError> {
445 Ok(from_rustc::Ident {
446 name: (&value.name).to_string().into(),
447 span: self.translate_span(&value.span),
448 })
449 }
450
451 fn translate_rustc_version_from_rustc(
452 &mut self,
453 value: &RustcVersion,
454 ) -> Result<from_rustc::RustcVersion, FromRustcError> {
455 Ok(from_rustc::RustcVersion {
456 major: *(&value.major),
457 minor: *(&value.minor),
458 patch: *(&value.patch),
459 })
460 }
461}