Auto merge of #36308 - dtolnay:inputitem, r=alexcrichton
Point macros 1.1 errors to the input item Moved from https://github.com/alexcrichton/rust/pull/6 to continue discussion. Fixes #36218. Before: ```rust error[E0106]: missing lifetime specifier --> src/main.rs:10:10 | 10 | #[derive(Serialize, Deserialize)] | ^ expected lifetime parameter error[E0038]: the trait `T` cannot be made into an object --> src/main.rs:15:15 | 15 | #[derive(Serialize, Deserialize)] | ^^^^^^^^^^ the trait `T` cannot be made into an object ``` After: ```rust error[E0106]: missing lifetime specifier --> src/main.rs:11:1 | 11 | struct A { | ^ expected lifetime parameter error[E0038]: the trait `T` cannot be made into an object --> src/main.rs:16:1 | 16 | struct B<'a> { | ^ the trait `T` cannot be made into an object ```
This commit is contained in:
commit
0be88eb794
|
@ -10,12 +10,14 @@
|
|||
|
||||
use std::panic;
|
||||
|
||||
use errors::FatalError;
|
||||
use rustc_macro::{TokenStream, __internal};
|
||||
use syntax::ast::{self, ItemKind};
|
||||
use syntax::codemap::Span;
|
||||
use syntax::codemap::{ExpnInfo, MacroAttribute, NameAndSpan, Span};
|
||||
use syntax::ext::base::*;
|
||||
use syntax::fold::{self, Folder};
|
||||
use errors::FatalError;
|
||||
use syntax::parse::token::intern;
|
||||
use syntax::print::pprust;
|
||||
|
||||
pub struct CustomDerive {
|
||||
inner: fn(TokenStream) -> TokenStream,
|
||||
|
@ -31,7 +33,7 @@ impl MultiItemModifier for CustomDerive {
|
|||
fn expand(&self,
|
||||
ecx: &mut ExtCtxt,
|
||||
span: Span,
|
||||
_meta_item: &ast::MetaItem,
|
||||
meta_item: &ast::MetaItem,
|
||||
item: Annotatable)
|
||||
-> Vec<Annotatable> {
|
||||
let item = match item {
|
||||
|
@ -53,6 +55,17 @@ impl MultiItemModifier for CustomDerive {
|
|||
}
|
||||
}
|
||||
|
||||
let input_span = Span {
|
||||
expn_id: ecx.codemap().record_expansion(ExpnInfo {
|
||||
call_site: span,
|
||||
callee: NameAndSpan {
|
||||
format: MacroAttribute(intern(&pprust::meta_item_to_string(meta_item))),
|
||||
span: Some(span),
|
||||
allow_internal_unstable: true,
|
||||
},
|
||||
}),
|
||||
..item.span
|
||||
};
|
||||
let input = __internal::new_token_stream(item);
|
||||
let res = __internal::set_parse_sess(&ecx.parse_sess, || {
|
||||
let inner = self.inner;
|
||||
|
@ -77,9 +90,9 @@ impl MultiItemModifier for CustomDerive {
|
|||
|
||||
// Right now we have no knowledge of spans at all in custom derive
|
||||
// macros, everything is just parsed as a string. Reassign all spans to
|
||||
// the #[derive] attribute for better errors here.
|
||||
// the input `item` for better errors here.
|
||||
item.into_iter().flat_map(|item| {
|
||||
ChangeSpan { span: span }.fold_item(item)
|
||||
ChangeSpan { span: input_span }.fold_item(item)
|
||||
}).map(Annotatable::Item).collect()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,8 +23,8 @@ trait Append {
|
|||
#[derive(PartialEq,
|
||||
Append,
|
||||
Eq)]
|
||||
//~^^ ERROR: the semantics of constant patterns is not yet settled
|
||||
struct A {
|
||||
//~^ ERROR: the semantics of constant patterns is not yet settled
|
||||
inner: u32,
|
||||
}
|
||||
|
||||
|
|
|
@ -17,8 +17,8 @@
|
|||
extern crate derive_unstable_2;
|
||||
|
||||
#[derive(Unstable)]
|
||||
//~^ ERROR: reserved for internal compiler
|
||||
struct A;
|
||||
//~^ ERROR: reserved for internal compiler
|
||||
|
||||
fn main() {
|
||||
foo();
|
||||
|
|
|
@ -17,8 +17,8 @@
|
|||
extern crate derive_unstable;
|
||||
|
||||
#[derive(Unstable)]
|
||||
//~^ ERROR: use of unstable library feature
|
||||
struct A;
|
||||
//~^ ERROR: use of unstable library feature
|
||||
|
||||
fn main() {
|
||||
unsafe { foo(); }
|
||||
|
|
Loading…
Reference in New Issue