Skip to content

Commit a10989f

Browse files
committedFeb 1, 2017
Add a better error message for missing derive macros
1 parent 5276ba7 commit a10989f

File tree

1 file changed

+19
-14
lines changed
  • src/libsyntax_ext/deriving

1 file changed

+19
-14
lines changed
 

‎src/libsyntax_ext/deriving/mod.rs

+19-14
Original file line numberDiff line numberDiff line change
@@ -158,12 +158,13 @@ pub fn expand_derive(cx: &mut ExtCtxt,
158158
traits.retain(|titem| {
159159
let tword = titem.word().unwrap();
160160
let tname = tword.name();
161+
let legacy_name = Symbol::intern(&format!("derive_{}", tname));
161162

162-
if is_builtin_trait(tname) || {
163-
let derive_mode = ast::Path::from_ident(titem.span, ast::Ident::with_empty_ctxt(tname));
164-
cx.resolver.resolve_macro(cx.current_expansion.mark, &derive_mode, false).map(|ext| {
165-
if let SyntaxExtension::CustomDerive(_) = *ext { true } else { false }
166-
}).unwrap_or(false)
163+
// Skip macros that are builtin derives, and don't resolve as legacy derives.
164+
if is_builtin_trait(tname) || !{
165+
let derive_mode = ast::Path::from_ident(titem.span,
166+
ast::Ident::with_empty_ctxt(legacy_name));
167+
cx.resolver.resolve_macro(cx.current_expansion.mark, &derive_mode, false).is_ok()
167168
} {
168169
return true;
169170
}
@@ -175,11 +176,10 @@ pub fn expand_derive(cx: &mut ExtCtxt,
175176
feature_gate::GateIssue::Language,
176177
feature_gate::EXPLAIN_CUSTOM_DERIVE);
177178
} else {
178-
let name = Symbol::intern(&format!("derive_{}", tname));
179-
if !cx.resolver.is_whitelisted_legacy_custom_derive(name) {
179+
if !cx.resolver.is_whitelisted_legacy_custom_derive(legacy_name) {
180180
cx.span_warn(titem.span, feature_gate::EXPLAIN_DEPR_CUSTOM_DERIVE);
181181
}
182-
let mitem = cx.meta_word(titem.span, name);
182+
let mitem = cx.meta_word(titem.span, legacy_name);
183183
new_attributes.push(cx.attribute(mitem.span, mitem));
184184
}
185185
false
@@ -222,7 +222,6 @@ pub fn expand_derive(cx: &mut ExtCtxt,
222222
if let Some((i, titem)) = macros_11_derive {
223223
let tname = ast::Ident::with_empty_ctxt(titem.name().unwrap());
224224
let path = ast::Path::from_ident(titem.span, tname);
225-
let ext = cx.resolver.resolve_macro(cx.current_expansion.mark, &path, false).unwrap();
226225

227226
traits.remove(i);
228227
if traits.len() > 0 {
@@ -248,11 +247,17 @@ pub fn expand_derive(cx: &mut ExtCtxt,
248247
..mitem.span
249248
};
250249

251-
if let SyntaxExtension::CustomDerive(ref ext) = *ext {
252-
return ext.expand(cx, span, &mitem, item);
253-
} else {
254-
unreachable!()
255-
}
250+
match cx.resolver.resolve_macro(cx.current_expansion.mark, &path, false) {
251+
Ok(ext) => match *ext {
252+
SyntaxExtension::CustomDerive(ref ext) =>
253+
return ext.expand(cx, span, &mitem, item),
254+
_ => {},
255+
},
256+
_ => {},
257+
};
258+
259+
cx.span_err(span, &format!("cannot find derive macro `{}` in this scope", tname));
260+
return vec![item];
256261
}
257262

258263
// Ok, at this point we know that there are no old-style `#[derive_Foo]` nor

0 commit comments

Comments
 (0)