1
Fork 0

Rollup merge of #79509 - GuillaumeGomez:improve-attr-spans, r=oli-obk

Improve attribute message error spans

I got the idea while working on https://github.com/rust-lang/rust/pull/79464
This commit is contained in:
Guillaume Gomez 2020-12-01 23:46:11 +01:00 committed by GitHub
commit 3d631b094b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 68 additions and 39 deletions

View file

@ -115,6 +115,10 @@ impl NestedMetaItem {
pub fn is_meta_item_list(&self) -> bool { pub fn is_meta_item_list(&self) -> bool {
self.meta_item_list().is_some() self.meta_item_list().is_some()
} }
pub fn name_value_literal_span(&self) -> Option<Span> {
self.meta_item()?.name_value_literal_span()
}
} }
impl Attribute { impl Attribute {
@ -175,6 +179,22 @@ impl Attribute {
pub fn is_value_str(&self) -> bool { pub fn is_value_str(&self) -> bool {
self.value_str().is_some() self.value_str().is_some()
} }
/// This is used in case you want the value span instead of the whole attribute. Example:
///
/// ```text
/// #[doc(alias = "foo")]
/// ```
///
/// In here, it'll return a span for `"foo"`.
pub fn name_value_literal_span(&self) -> Option<Span> {
match self.kind {
AttrKind::Normal(ref item, _) => {
item.meta(self.span).and_then(|meta| meta.name_value_literal_span())
}
AttrKind::DocComment(..) => None,
}
}
} }
impl MetaItem { impl MetaItem {
@ -227,6 +247,17 @@ impl MetaItem {
pub fn is_value_str(&self) -> bool { pub fn is_value_str(&self) -> bool {
self.value_str().is_some() self.value_str().is_some()
} }
/// This is used in case you want the value span instead of the whole attribute. Example:
///
/// ```text
/// #[doc(alias = "foo")]
/// ```
///
/// In here, it'll return a span for `"foo"`.
pub fn name_value_literal_span(&self) -> Option<Span> {
Some(self.name_value_literal()?.span)
}
} }
impl AttrItem { impl AttrItem {

View file

@ -294,7 +294,7 @@ where
or \"none\"", or \"none\"",
) )
.span_label( .span_label(
mi.name_value_literal().unwrap().span, mi.name_value_literal_span().unwrap(),
msg, msg,
) )
.emit(); .emit();

View file

@ -1603,23 +1603,22 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> {
items.push(ast::NestedMetaItem::MetaItem(item)); items.push(ast::NestedMetaItem::MetaItem(item));
} }
Err(e) => { Err(e) => {
let lit = let lit_span = it.name_value_literal_span().unwrap();
it.meta_item().and_then(|item| item.name_value_literal()).unwrap();
if e.kind() == ErrorKind::InvalidData { if e.kind() == ErrorKind::InvalidData {
self.cx self.cx
.struct_span_err( .struct_span_err(
lit.span, lit_span,
&format!("{} wasn't a utf-8 file", filename.display()), &format!("{} wasn't a utf-8 file", filename.display()),
) )
.span_label(lit.span, "contains invalid utf-8") .span_label(lit_span, "contains invalid utf-8")
.emit(); .emit();
} else { } else {
let mut err = self.cx.struct_span_err( let mut err = self.cx.struct_span_err(
lit.span, lit_span,
&format!("couldn't read {}: {}", filename.display(), e), &format!("couldn't read {}: {}", filename.display(), e),
); );
err.span_label(lit.span, "couldn't read file"); err.span_label(lit_span, "couldn't read file");
err.emit(); err.emit();
} }

View file

@ -43,8 +43,7 @@ fn update_limit(
let value_span = attr let value_span = attr
.meta() .meta()
.and_then(|meta| meta.name_value_literal().cloned()) .and_then(|meta| meta.name_value_literal_span())
.map(|lit| lit.span)
.unwrap_or(attr.span); .unwrap_or(attr.span);
let error_str = match e.kind() { let error_str = match e.kind() {

View file

@ -319,7 +319,7 @@ impl CheckAttrVisitor<'tcx> {
self.tcx self.tcx
.sess .sess
.struct_span_err( .struct_span_err(
meta.span(), meta.name_value_literal_span().unwrap_or_else(|| meta.span()),
&format!( &format!(
"{:?} character isn't allowed in `#[doc(alias = \"...\")]`", "{:?} character isn't allowed in `#[doc(alias = \"...\")]`",
c, c,
@ -332,7 +332,7 @@ impl CheckAttrVisitor<'tcx> {
self.tcx self.tcx
.sess .sess
.struct_span_err( .struct_span_err(
meta.span(), meta.name_value_literal_span().unwrap_or_else(|| meta.span()),
"`#[doc(alias = \"...\")]` cannot start or end with ' '", "`#[doc(alias = \"...\")]` cannot start or end with ' '",
) )
.emit(); .emit();

View file

@ -17,42 +17,42 @@ LL | #[doc(alias("bar"))]
| ^^^^^^^^^^^^ | ^^^^^^^^^^^^
error: '\"' character isn't allowed in `#[doc(alias = "...")]` error: '\"' character isn't allowed in `#[doc(alias = "...")]`
--> $DIR/check-doc-alias-attr.rs:9:7 --> $DIR/check-doc-alias-attr.rs:9:15
| |
LL | #[doc(alias = "\"")] LL | #[doc(alias = "\"")]
| ^^^^^^^^^^^^ | ^^^^
error: '\n' character isn't allowed in `#[doc(alias = "...")]` error: '\n' character isn't allowed in `#[doc(alias = "...")]`
--> $DIR/check-doc-alias-attr.rs:10:7 --> $DIR/check-doc-alias-attr.rs:10:15
| |
LL | #[doc(alias = "\n")] LL | #[doc(alias = "\n")]
| ^^^^^^^^^^^^ | ^^^^
error: '\n' character isn't allowed in `#[doc(alias = "...")]` error: '\n' character isn't allowed in `#[doc(alias = "...")]`
--> $DIR/check-doc-alias-attr.rs:11:7 --> $DIR/check-doc-alias-attr.rs:11:15
| |
LL | #[doc(alias = " LL | #[doc(alias = "
| _______^ | _______________^
LL | | ")] LL | | ")]
| |_^ | |_^
error: '\t' character isn't allowed in `#[doc(alias = "...")]` error: '\t' character isn't allowed in `#[doc(alias = "...")]`
--> $DIR/check-doc-alias-attr.rs:13:7 --> $DIR/check-doc-alias-attr.rs:13:15
| |
LL | #[doc(alias = "\t")] LL | #[doc(alias = "\t")]
| ^^^^^^^^^^^^ | ^^^^
error: `#[doc(alias = "...")]` cannot start or end with ' ' error: `#[doc(alias = "...")]` cannot start or end with ' '
--> $DIR/check-doc-alias-attr.rs:14:7 --> $DIR/check-doc-alias-attr.rs:14:15
| |
LL | #[doc(alias = " hello")] LL | #[doc(alias = " hello")]
| ^^^^^^^^^^^^^^^^ | ^^^^^^^^
error: `#[doc(alias = "...")]` cannot start or end with ' ' error: `#[doc(alias = "...")]` cannot start or end with ' '
--> $DIR/check-doc-alias-attr.rs:15:7 --> $DIR/check-doc-alias-attr.rs:15:15
| |
LL | #[doc(alias = "hello ")] LL | #[doc(alias = "hello ")]
| ^^^^^^^^^^^^^^^^ | ^^^^^^^^
error: aborting due to 9 previous errors error: aborting due to 9 previous errors

View file

@ -1,8 +1,8 @@
error: '\'' character isn't allowed in `#[doc(alias = "...")]` error: '\'' character isn't allowed in `#[doc(alias = "...")]`
--> $DIR/doc-alias-crate-level.rs:5:7 --> $DIR/doc-alias-crate-level.rs:5:15
| |
LL | #[doc(alias = "shouldn't work!")] LL | #[doc(alias = "shouldn't work!")]
| ^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^
error: `#![doc(alias = "...")]` isn't allowed as a crate level attribute error: `#![doc(alias = "...")]` isn't allowed as a crate level attribute
--> $DIR/doc-alias-crate-level.rs:3:8 --> $DIR/doc-alias-crate-level.rs:3:8

View file

@ -17,42 +17,42 @@ LL | #[doc(alias("bar"))]
| ^^^^^^^^^^^^ | ^^^^^^^^^^^^
error: '\"' character isn't allowed in `#[doc(alias = "...")]` error: '\"' character isn't allowed in `#[doc(alias = "...")]`
--> $DIR/check-doc-alias-attr.rs:10:7 --> $DIR/check-doc-alias-attr.rs:10:15
| |
LL | #[doc(alias = "\"")] LL | #[doc(alias = "\"")]
| ^^^^^^^^^^^^ | ^^^^
error: '\n' character isn't allowed in `#[doc(alias = "...")]` error: '\n' character isn't allowed in `#[doc(alias = "...")]`
--> $DIR/check-doc-alias-attr.rs:11:7 --> $DIR/check-doc-alias-attr.rs:11:15
| |
LL | #[doc(alias = "\n")] LL | #[doc(alias = "\n")]
| ^^^^^^^^^^^^ | ^^^^
error: '\n' character isn't allowed in `#[doc(alias = "...")]` error: '\n' character isn't allowed in `#[doc(alias = "...")]`
--> $DIR/check-doc-alias-attr.rs:12:7 --> $DIR/check-doc-alias-attr.rs:12:15
| |
LL | #[doc(alias = " LL | #[doc(alias = "
| _______^ | _______________^
LL | | ")] LL | | ")]
| |_^ | |_^
error: '\t' character isn't allowed in `#[doc(alias = "...")]` error: '\t' character isn't allowed in `#[doc(alias = "...")]`
--> $DIR/check-doc-alias-attr.rs:14:7 --> $DIR/check-doc-alias-attr.rs:14:15
| |
LL | #[doc(alias = "\t")] LL | #[doc(alias = "\t")]
| ^^^^^^^^^^^^ | ^^^^
error: `#[doc(alias = "...")]` cannot start or end with ' ' error: `#[doc(alias = "...")]` cannot start or end with ' '
--> $DIR/check-doc-alias-attr.rs:15:7 --> $DIR/check-doc-alias-attr.rs:15:15
| |
LL | #[doc(alias = " hello")] LL | #[doc(alias = " hello")]
| ^^^^^^^^^^^^^^^^ | ^^^^^^^^
error: `#[doc(alias = "...")]` cannot start or end with ' ' error: `#[doc(alias = "...")]` cannot start or end with ' '
--> $DIR/check-doc-alias-attr.rs:16:7 --> $DIR/check-doc-alias-attr.rs:16:15
| |
LL | #[doc(alias = "hello ")] LL | #[doc(alias = "hello ")]
| ^^^^^^^^^^^^^^^^ | ^^^^^^^^
error: aborting due to 9 previous errors error: aborting due to 9 previous errors

View file

@ -1,8 +1,8 @@
error: '\'' character isn't allowed in `#[doc(alias = "...")]` error: '\'' character isn't allowed in `#[doc(alias = "...")]`
--> $DIR/doc-alias-crate-level.rs:7:8 --> $DIR/doc-alias-crate-level.rs:7:16
| |
LL | #![doc(alias = "shouldn't work!")] LL | #![doc(alias = "shouldn't work!")]
| ^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^
error: aborting due to previous error error: aborting due to previous error