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