@@ -375,6 +375,8 @@ pub struct Stability {
375
375
// The reason for the current stability level. If deprecated, the
376
376
// reason for deprecation.
377
377
pub reason : Option < InternedString > ,
378
+ // The relevant rust-lang issue
379
+ pub issue : Option < u32 >
378
380
}
379
381
380
382
/// The available stability levels.
@@ -409,41 +411,54 @@ fn find_stability_generic<'a,
409
411
410
412
used_attrs. push ( attr) ;
411
413
412
- let ( feature, since, reason) = match attr. meta_item_list ( ) {
414
+ let ( feature, since, reason, issue ) = match attr. meta_item_list ( ) {
413
415
Some ( metas) => {
414
416
let mut feature = None ;
415
417
let mut since = None ;
416
418
let mut reason = None ;
419
+ let mut issue = None ;
417
420
for meta in metas {
418
- if meta. name ( ) == "feature" {
419
- match meta. value_str ( ) {
420
- Some ( v) => feature = Some ( v) ,
421
- None => {
422
- diagnostic. span_err ( meta. span , "incorrect meta item" ) ;
423
- continue ' outer;
421
+ match & * meta. name ( ) {
422
+ "feature" => {
423
+ match meta. value_str ( ) {
424
+ Some ( v) => feature = Some ( v) ,
425
+ None => {
426
+ diagnostic. span_err ( meta. span , "incorrect meta item" ) ;
427
+ continue ' outer;
428
+ }
424
429
}
425
430
}
426
- }
427
- if & meta. name ( ) [ .. ] == "since" {
428
- match meta . value_str ( ) {
429
- Some ( v ) => since = Some ( v ) ,
430
- None => {
431
- diagnostic . span_err ( meta . span , "incorrect meta item" ) ;
432
- continue ' outer ;
431
+ "since" => {
432
+ match meta. value_str ( ) {
433
+ Some ( v ) => since = Some ( v ) ,
434
+ None => {
435
+ diagnostic . span_err ( meta . span , "incorrect meta item" ) ;
436
+ continue ' outer ;
437
+ }
433
438
}
434
439
}
435
- }
436
- if & meta. name ( ) [ ..] == "reason" {
437
- match meta. value_str ( ) {
438
- Some ( v) => reason = Some ( v) ,
439
- None => {
440
- diagnostic. span_err ( meta. span , "incorrect meta item" ) ;
441
- continue ' outer;
440
+ "reason" => {
441
+ match meta. value_str ( ) {
442
+ Some ( v) => reason = Some ( v) ,
443
+ None => {
444
+ diagnostic. span_err ( meta. span , "incorrect meta item" ) ;
445
+ continue ' outer;
446
+ }
447
+ }
448
+ }
449
+ "issue" => {
450
+ match meta. value_str ( ) . and_then ( |s| s. parse ( ) . ok ( ) ) {
451
+ Some ( v) => issue = Some ( v) ,
452
+ None => {
453
+ diagnostic. span_err ( meta. span , "incorrect meta item" ) ;
454
+ continue ' outer;
455
+ }
442
456
}
443
457
}
458
+ _ => { }
444
459
}
445
460
}
446
- ( feature, since, reason)
461
+ ( feature, since, reason, issue )
447
462
}
448
463
None => {
449
464
diagnostic. span_err ( attr. span ( ) , "incorrect stability attribute type" ) ;
@@ -477,7 +492,8 @@ fn find_stability_generic<'a,
477
492
feature : feature. unwrap_or ( intern_and_get_ident ( "bogus" ) ) ,
478
493
since : since,
479
494
deprecated_since : None ,
480
- reason : reason
495
+ reason : reason,
496
+ issue : issue,
481
497
} ) ;
482
498
} else { // "deprecated"
483
499
if deprecated. is_some ( ) {
@@ -501,6 +517,12 @@ fn find_stability_generic<'a,
501
517
either stable or unstable attribute") ;
502
518
}
503
519
}
520
+ } else if stab. as_ref ( ) . map_or ( false , |s| s. level == Unstable && s. issue . is_none ( ) ) {
521
+ // non-deprecated unstable items need to point to issues.
522
+ // FIXME: uncomment this error
523
+ // diagnostic.span_err(item_sp,
524
+ // "non-deprecated unstable items need to point \
525
+ // to an issue with `issue = \"NNN\"`");
504
526
}
505
527
506
528
( stab, used_attrs)
0 commit comments