Auto merge of #26747 - huonw:stability-issue, r=alexcrichton

This takes an issue number and points people to it in the printed error
message. This commit does not make it an error to have no `issue` field.
This commit is contained in:
bors
2015-07-07 17:41:43 +00:00
4 changed files with 92 additions and 25 deletions

View File

@@ -378,6 +378,8 @@ pub struct Stability {
// The reason for the current stability level. If deprecated, the
// reason for deprecation.
pub reason: Option<InternedString>,
// The relevant rust-lang issue
pub issue: Option<u32>
}
/// The available stability levels.
@@ -412,41 +414,54 @@ fn find_stability_generic<'a,
used_attrs.push(attr);
let (feature, since, reason) = match attr.meta_item_list() {
let (feature, since, reason, issue) = match attr.meta_item_list() {
Some(metas) => {
let mut feature = None;
let mut since = None;
let mut reason = None;
let mut issue = None;
for meta in metas {
if meta.name() == "feature" {
match meta.value_str() {
Some(v) => feature = Some(v),
None => {
diagnostic.span_err(meta.span, "incorrect meta item");
continue 'outer;
match &*meta.name() {
"feature" => {
match meta.value_str() {
Some(v) => feature = Some(v),
None => {
diagnostic.span_err(meta.span, "incorrect meta item");
continue 'outer;
}
}
}
}
if &meta.name()[..] == "since" {
match meta.value_str() {
Some(v) => since = Some(v),
None => {
diagnostic.span_err(meta.span, "incorrect meta item");
continue 'outer;
"since" => {
match meta.value_str() {
Some(v) => since = Some(v),
None => {
diagnostic.span_err(meta.span, "incorrect meta item");
continue 'outer;
}
}
}
}
if &meta.name()[..] == "reason" {
match meta.value_str() {
Some(v) => reason = Some(v),
None => {
diagnostic.span_err(meta.span, "incorrect meta item");
continue 'outer;
"reason" => {
match meta.value_str() {
Some(v) => reason = Some(v),
None => {
diagnostic.span_err(meta.span, "incorrect meta item");
continue 'outer;
}
}
}
"issue" => {
match meta.value_str().and_then(|s| s.parse().ok()) {
Some(v) => issue = Some(v),
None => {
diagnostic.span_err(meta.span, "incorrect meta item");
continue 'outer;
}
}
}
_ => {}
}
}
(feature, since, reason)
(feature, since, reason, issue)
}
None => {
diagnostic.span_err(attr.span(), "incorrect stability attribute type");
@@ -480,7 +495,8 @@ fn find_stability_generic<'a,
feature: feature.unwrap_or(intern_and_get_ident("bogus")),
since: since,
deprecated_since: None,
reason: reason
reason: reason,
issue: issue,
});
} else { // "deprecated"
if deprecated.is_some() {
@@ -504,6 +520,12 @@ fn find_stability_generic<'a,
either stable or unstable attribute");
}
}
} else if stab.as_ref().map_or(false, |s| s.level == Unstable && s.issue.is_none()) {
// non-deprecated unstable items need to point to issues.
// FIXME: uncomment this error
// diagnostic.span_err(item_sp,
// "non-deprecated unstable items need to point \
// to an issue with `issue = \"NNN\"`");
}
(stab, used_attrs)