Skip to content

Commit de4f141

Browse files
authored
Fix generated Error::provide and tests to reflect recent changes in nightly APIs (#294)
## Synopsis Update derive and tests to work on the latest nightly with the changes in [this PR](rust-lang/rust#113464). ## Solution Use `error::{Request, request_ref, request_value}` instead of `any::{Demand, request_ref, request_value}`. Currently, `request_value` is not re-exported from `core::error` in `std::error`, which means backtrace tests require `#![feature(error_in_core)]`. Presumably this is a bug, and will be fixed later.
1 parent 4aefdbb commit de4f141

9 files changed

+187
-190
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
3636
- The `Into` derive now uses `#[into(<types>)]` instead of `#[into(types(<types>))]`
3737
and ignores field type itself.
3838
- Importing a derive macro now also import its corresponding trait.
39+
- The `Error` derive is updated with changes to the `error_generic_member_access` unstable feature for nightly users. ([#200](https://github.com/JelteF/derive_more/pull/200), [#294](https://github.com/JelteF/derive_more/pull/294))
3940

4041
### Added
4142

impl/doc/error.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,13 @@ Backtraces don't work though, because the `Backtrace` type is only available in
5959
## Example usage
6060

6161
```rust
62-
# #![cfg_attr(nightly, feature(error_generic_member_access, provide_any))]
62+
# #![cfg_attr(nightly, feature(error_generic_member_access, error_in_core))]
6363
// Nightly requires enabling these features:
64-
// #![feature(error_generic_member_access, provide_any)]
64+
// #![feature(error_generic_member_access, error_in_core)]
6565
# #[cfg(not(nightly))] fn main() {}
6666
# #[cfg(nightly)] fn main() {
67-
# use std::{any, error::Error as _, backtrace::Backtrace};
67+
# use core::error::{request_ref, request_value, Error as __};
68+
# use std::backtrace::Backtrace;
6869
#
6970
# use derive_more::{Display, Error, From};
7071

@@ -129,7 +130,7 @@ enum CompoundError {
129130
}
130131

131132
assert!(Simple.source().is_none());
132-
assert!(any::request_ref::<Backtrace>(&Simple).is_none());
133+
assert!(request_ref::<Backtrace>(&Simple).is_none());
133134
assert!(WithSource::default().source().is_some());
134135
assert!(WithExplicitSource::default().source().is_some());
135136
assert!(Tuple::default().source().is_some());
@@ -139,7 +140,7 @@ let with_source_and_backtrace = WithSourceAndBacktrace {
139140
backtrace: Backtrace::capture(),
140141
};
141142
assert!(with_source_and_backtrace.source().is_some());
142-
assert!(any::request_ref::<Backtrace>(&with_source_and_backtrace).is_some());
143+
assert!(request_ref::<Backtrace>(&with_source_and_backtrace).is_some());
143144

144145
assert!(CompoundError::Simple.source().is_none());
145146
assert!(CompoundError::from(Simple).source().is_some());

impl/src/error.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ pub fn expand(
4747

4848
let provide = provide.map(|provide| {
4949
quote! {
50-
fn provide<'_demand>(&'_demand self, demand: &mut ::core::any::Demand<'_demand>) {
50+
fn provide<'_request>(&'_request self, request: &mut ::core::error::Request<'_request>) {
5151
#provide
5252
}
5353
}
@@ -205,7 +205,7 @@ impl<'input, 'state> ParsedFields<'input, 'state> {
205205
let source_provider = self.source.map(|source| {
206206
let source_expr = &self.data.members[source];
207207
quote! {
208-
::derive_more::Error::provide(&#source_expr, demand);
208+
::derive_more::Error::provide(&#source_expr, request);
209209
}
210210
});
211211
let backtrace_provider = self
@@ -215,7 +215,7 @@ impl<'input, 'state> ParsedFields<'input, 'state> {
215215
.then(|| {
216216
let backtrace_expr = &self.data.members[backtrace];
217217
quote! {
218-
demand.provide_ref::<::std::backtrace::Backtrace>(&#backtrace_expr);
218+
request.provide_ref::<::std::backtrace::Backtrace>(&#backtrace_expr);
219219
}
220220
});
221221

@@ -235,7 +235,7 @@ impl<'input, 'state> ParsedFields<'input, 'state> {
235235
let pattern = self.data.matcher(&[source], &[quote! { source }]);
236236
Some(quote! {
237237
#pattern => {
238-
::derive_more::Error::provide(source, demand);
238+
::derive_more::Error::provide(source, request);
239239
}
240240
})
241241
}
@@ -246,16 +246,16 @@ impl<'input, 'state> ParsedFields<'input, 'state> {
246246
);
247247
Some(quote! {
248248
#pattern => {
249-
demand.provide_ref::<::std::backtrace::Backtrace>(backtrace);
250-
::derive_more::Error::provide(source, demand);
249+
request.provide_ref::<::std::backtrace::Backtrace>(backtrace);
250+
::derive_more::Error::provide(source, request);
251251
}
252252
})
253253
}
254254
None => {
255255
let pattern = self.data.matcher(&[backtrace], &[quote! { backtrace }]);
256256
Some(quote! {
257257
#pattern => {
258-
demand.provide_ref::<::std::backtrace::Backtrace>(backtrace);
258+
request.provide_ref::<::std::backtrace::Backtrace>(backtrace);
259259
}
260260
})
261261
}

tests/error/nightly/derives_for_enums_with_backtrace.rs

Lines changed: 40 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#![allow(dead_code)]
22

3-
use std::any;
3+
use core::error::{request_ref, request_value};
44

55
use super::*;
66

@@ -146,7 +146,7 @@ impl TestErr {
146146
}
147147

148148
fn get_source_backtrace(&self) -> &Backtrace {
149-
any::request_ref(match self {
149+
request_ref(match self {
150150
Self::NamedExplicitBacktraceFromSource { err }
151151
| Self::NamedExplicitDifferentSourceAndBacktrace { err, .. }
152152
| Self::NamedImplicitDifferentSourceAndBacktrace { err, .. }
@@ -163,14 +163,14 @@ type MyBacktrace = Backtrace;
163163

164164
#[test]
165165
fn unit() {
166-
assert!(any::request_ref::<Backtrace>(&TestErr::Unit).is_none());
166+
assert!(request_ref::<Backtrace>(&TestErr::Unit).is_none());
167167
}
168168

169169
#[test]
170170
fn named_implicit_no_backtrace() {
171171
let err = TestErr::NamedImplicitNoBacktrace { field: 0 };
172172

173-
assert!(any::request_ref::<Backtrace>(&err).is_none());
173+
assert!(request_ref::<Backtrace>(&err).is_none());
174174
}
175175

176176
#[test]
@@ -180,7 +180,7 @@ fn named_implicit_backtrace_by_field_name() {
180180
field: 0,
181181
};
182182

183-
assert!(any::request_ref::<Backtrace>(&err).is_some());
183+
assert!(request_ref::<Backtrace>(&err).is_some());
184184
assert_bt!(==, err, .get_stored_backtrace);
185185
}
186186

@@ -191,7 +191,7 @@ fn named_implicit_backtrace_by_field_type() {
191191
field: 0,
192192
};
193193

194-
assert!(any::request_ref::<Backtrace>(&err).is_some());
194+
assert!(request_ref::<Backtrace>(&err).is_some());
195195
assert_bt!(==, err, .get_stored_backtrace);
196196
}
197197

@@ -202,7 +202,7 @@ fn named_explicit_no_backtrace_by_field_name() {
202202
field: 0,
203203
};
204204

205-
assert!(any::request_ref::<Backtrace>(&err).is_none());
205+
assert!(request_ref::<Backtrace>(&err).is_none());
206206
}
207207

208208
#[test]
@@ -212,7 +212,7 @@ fn named_explicit_no_backtrace_by_field_type() {
212212
field: 0,
213213
};
214214

215-
assert!(any::request_ref::<Backtrace>(&err).is_none());
215+
assert!(request_ref::<Backtrace>(&err).is_none());
216216
}
217217

218218
#[test]
@@ -222,7 +222,7 @@ fn named_explicit_backtrace() {
222222
field: 0,
223223
};
224224

225-
assert!(any::request_ref::<Backtrace>(&err).is_some());
225+
assert!(request_ref::<Backtrace>(&err).is_some());
226226
assert_bt!(==, err, .get_stored_backtrace);
227227
}
228228

@@ -233,7 +233,7 @@ fn named_explicit_no_backtrace_redundant() {
233233
field: 0,
234234
};
235235

236-
assert!(any::request_ref::<Backtrace>(&err).is_none());
236+
assert!(request_ref::<Backtrace>(&err).is_none());
237237
}
238238

239239
#[test]
@@ -243,7 +243,7 @@ fn named_explicit_backtrace_by_field_name_redundant() {
243243
field: 0,
244244
};
245245

246-
assert!(any::request_ref::<Backtrace>(&err).is_some());
246+
assert!(request_ref::<Backtrace>(&err).is_some());
247247
assert_bt!(==, err, .get_stored_backtrace);
248248
}
249249

@@ -254,7 +254,7 @@ fn named_explicit_backtrace_by_field_type_redundant() {
254254
field: 0,
255255
};
256256

257-
assert!(any::request_ref::<Backtrace>(&err).is_some());
257+
assert!(request_ref::<Backtrace>(&err).is_some());
258258
assert_bt!(==, err, .get_stored_backtrace);
259259
}
260260

@@ -266,7 +266,7 @@ fn named_explicit_suppresses_implicit() {
266266
field: 0,
267267
};
268268

269-
assert!(any::request_ref::<Backtrace>(&err).is_some());
269+
assert!(request_ref::<Backtrace>(&err).is_some());
270270
assert_bt!(==, err, .get_stored_backtrace);
271271
assert_bt!(!=, err, .get_unused_backtrace);
272272
}
@@ -280,8 +280,8 @@ fn named_implicit_no_backtrace_from_source() {
280280
};
281281

282282
assert!(err.source().is_some());
283-
assert!(any::request_ref::<Backtrace>(&err).is_none());
284-
assert!(any::request_value::<i32>(&err).is_none());
283+
assert!(request_ref::<Backtrace>(&err).is_none());
284+
assert!(request_value::<i32>(&err).is_none());
285285
}
286286

287287
#[test]
@@ -293,8 +293,8 @@ fn named_explicit_no_backtrace_from_source() {
293293
};
294294

295295
assert!(err.source().is_some());
296-
assert!(any::request_ref::<Backtrace>(&err).is_none());
297-
assert!(any::request_value::<i32>(&err).is_none());
296+
assert!(request_ref::<Backtrace>(&err).is_none());
297+
assert!(request_value::<i32>(&err).is_none());
298298
}
299299

300300
#[test]
@@ -306,8 +306,8 @@ fn named_explicit_backtrace_from_source() {
306306
};
307307

308308
assert!(err.source().is_some());
309-
assert!(any::request_ref::<Backtrace>(&err).is_some());
310-
assert_eq!(any::request_value::<i32>(&err), Some(42));
309+
assert!(request_ref::<Backtrace>(&err).is_some());
310+
assert_eq!(request_value::<i32>(&err), Some(42));
311311
assert_bt!(==, err, .get_source_backtrace);
312312
}
313313

@@ -321,8 +321,8 @@ fn named_implicit_different_source_and_backtrace() {
321321
};
322322

323323
assert!(err.source().is_some());
324-
assert!(any::request_ref::<Backtrace>(&err).is_some());
325-
assert_eq!(any::request_value::<i32>(&err), Some(42));
324+
assert!(request_ref::<Backtrace>(&err).is_some());
325+
assert_eq!(request_value::<i32>(&err), Some(42));
326326
assert_bt!(==, err, .get_stored_backtrace);
327327
assert_bt!(!=, err, .get_source_backtrace);
328328
}
@@ -337,8 +337,8 @@ fn named_explicit_different_source_and_backtrace() {
337337
};
338338

339339
assert!(err.source().is_some());
340-
assert!(any::request_ref::<Backtrace>(&err).is_some());
341-
assert_eq!(any::request_value::<i32>(&err), Some(42));
340+
assert!(request_ref::<Backtrace>(&err).is_some());
341+
assert_eq!(request_value::<i32>(&err), Some(42));
342342
assert_bt!(==, err, .get_stored_backtrace);
343343
assert_bt!(!=, err, .get_source_backtrace);
344344
}
@@ -347,29 +347,29 @@ fn named_explicit_different_source_and_backtrace() {
347347
fn unnamed_implicit_no_backtrace() {
348348
let err = TestErr::UnnamedImplicitNoBacktrace(0, 0);
349349

350-
assert!(any::request_ref::<Backtrace>(&err).is_none());
350+
assert!(request_ref::<Backtrace>(&err).is_none());
351351
}
352352

353353
#[test]
354354
fn unnamed_implicit_backtrace() {
355355
let err = TestErr::UnnamedImplicitBacktrace(Backtrace::force_capture(), 0, 0);
356356

357-
assert!(any::request_ref::<Backtrace>(&err).is_some());
357+
assert!(request_ref::<Backtrace>(&err).is_some());
358358
assert_bt!(==, err, .get_stored_backtrace);
359359
}
360360

361361
#[test]
362362
fn unnamed_explicit_no_backtrace() {
363363
let err = TestErr::UnnamedExplicitNoBacktrace(Backtrace::force_capture(), 0);
364364

365-
assert!(any::request_ref::<Backtrace>(&err).is_none());
365+
assert!(request_ref::<Backtrace>(&err).is_none());
366366
}
367367

368368
#[test]
369369
fn unnamed_explicit_backtrace() {
370370
let err = TestErr::UnnamedExplicitBacktrace(Backtrace::force_capture(), 0, 0);
371371

372-
assert!(any::request_ref::<Backtrace>(&err).is_some());
372+
assert!(request_ref::<Backtrace>(&err).is_some());
373373
assert_bt!(==, err, .get_stored_backtrace);
374374
}
375375

@@ -378,15 +378,15 @@ fn unnamed_explicit_no_backtrace_redundant() {
378378
let err =
379379
TestErr::UnnamedExplicitNoBacktraceRedundant(Backtrace::force_capture(), 0);
380380

381-
assert!(any::request_ref::<Backtrace>(&err).is_none());
381+
assert!(request_ref::<Backtrace>(&err).is_none());
382382
}
383383

384384
#[test]
385385
fn unnamed_explicit_backtrace_redundant() {
386386
let err =
387387
TestErr::UnnamedExplicitBacktraceRedundant(Backtrace::force_capture(), 0, 0);
388388

389-
assert!(any::request_ref::<Backtrace>(&err).is_some());
389+
assert!(request_ref::<Backtrace>(&err).is_some());
390390
assert_bt!(==, err, .get_stored_backtrace);
391391
}
392392

@@ -398,7 +398,7 @@ fn unnamed_explicit_suppresses_implicit() {
398398
0,
399399
);
400400

401-
assert!(any::request_ref::<Backtrace>(&err).is_some());
401+
assert!(request_ref::<Backtrace>(&err).is_some());
402402
assert_bt!(==, err, .get_stored_backtrace);
403403
assert_bt!(!=, err, .get_unused_backtrace);
404404
}
@@ -410,8 +410,8 @@ fn unnamed_implicit_no_backtrace_from_source() {
410410
});
411411

412412
assert!(err.source().is_some());
413-
assert!(any::request_ref::<Backtrace>(&err).is_none());
414-
assert!(any::request_value::<i32>(&err).is_none());
413+
assert!(request_ref::<Backtrace>(&err).is_none());
414+
assert!(request_value::<i32>(&err).is_none());
415415
}
416416

417417
#[test]
@@ -421,8 +421,8 @@ fn unnamed_explicit_no_backtrace_from_source() {
421421
});
422422

423423
assert!(err.source().is_some());
424-
assert!(any::request_ref::<Backtrace>(&err).is_none());
425-
assert!(any::request_value::<i32>(&err).is_none());
424+
assert!(request_ref::<Backtrace>(&err).is_none());
425+
assert!(request_value::<i32>(&err).is_none());
426426
}
427427

428428
#[test]
@@ -432,8 +432,8 @@ fn unnamed_explicit_backtrace_from_source() {
432432
});
433433

434434
assert!(err.source().is_some());
435-
assert!(any::request_ref::<Backtrace>(&err).is_some());
436-
assert_eq!(any::request_value::<i32>(&err), Some(42));
435+
assert!(request_ref::<Backtrace>(&err).is_some());
436+
assert_eq!(request_value::<i32>(&err), Some(42));
437437
assert_bt!(==, err, .get_source_backtrace);
438438
}
439439

@@ -447,8 +447,8 @@ fn unnamed_implicit_different_source_and_backtrace() {
447447
);
448448

449449
assert!(err.source().is_some());
450-
assert!(any::request_ref::<Backtrace>(&err).is_some());
451-
assert_eq!(any::request_value::<i32>(&err), Some(42));
450+
assert!(request_ref::<Backtrace>(&err).is_some());
451+
assert_eq!(request_value::<i32>(&err), Some(42));
452452
assert_bt!(==, err, .get_stored_backtrace);
453453
assert_bt!(!=, err, .get_source_backtrace);
454454
}
@@ -463,8 +463,8 @@ fn unnamed_explicit_different_source_and_backtrace() {
463463
);
464464

465465
assert!(err.source().is_some());
466-
assert!(any::request_ref::<Backtrace>(&err).is_some());
467-
assert_eq!(any::request_value::<i32>(&err), Some(42));
466+
assert!(request_ref::<Backtrace>(&err).is_some());
467+
assert_eq!(request_value::<i32>(&err), Some(42));
468468
assert_bt!(==, err, .get_stored_backtrace);
469469
assert_bt!(!=, err, .get_source_backtrace);
470470
}

0 commit comments

Comments
 (0)