diff options
| author | bors <bors@rust-lang.org> | 2018-02-01 04:47:46 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2018-02-01 04:47:46 +0000 |
| commit | 26792f0607bea2b03daa5195c2688fd53289042b (patch) | |
| tree | 35a3660501f3d9c285d4fbfcdf2efd01777574a5 /src/libsyntax_ext | |
| parent | 8ccab7eed5f4fc93500fbf242e575073ca70d7cb (diff) | |
| parent | 540f95d9fad41a605e4c8b898d77f47374a76cbd (diff) | |
| download | rust-26792f0607bea2b03daa5195c2688fd53289042b.tar.gz rust-26792f0607bea2b03daa5195c2688fd53289042b.zip | |
Auto merge of #47540 - Manishearth:suggestion, r=nrc
Add approximate suggestions for rustfix This adds `span_approximate_suggestion()` that lets you emit a suggestion marked as "non-machine applicable" in the JSON output. UI users see no difference. This is for when rustc and clippy wish to emit suggestions which will make sense to the reader (e.g. they may have placeholders like `<type>`) but are not source-applicable, so that rustfix/etc can ignore these. fixes #39254
Diffstat (limited to 'src/libsyntax_ext')
| -rw-r--r-- | src/libsyntax_ext/deriving/encodable.rs | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/src/libsyntax_ext/deriving/encodable.rs b/src/libsyntax_ext/deriving/encodable.rs index 0e6e96438d8..743f22b6b31 100644 --- a/src/libsyntax_ext/deriving/encodable.rs +++ b/src/libsyntax_ext/deriving/encodable.rs @@ -190,7 +190,7 @@ fn encodable_substructure(cx: &mut ExtCtxt, Struct(_, ref fields) => { let emit_struct_field = cx.ident_of("emit_struct_field"); let mut stmts = Vec::new(); - for (i, &FieldInfo { name, ref self_, span, .. }) in fields.iter().enumerate() { + for (i, &FieldInfo { name, ref self_, span, attrs, .. }) in fields.iter().enumerate() { let name = match name { Some(id) => id.name, None => Symbol::intern(&format!("_field{}", i)), @@ -212,7 +212,19 @@ fn encodable_substructure(cx: &mut ExtCtxt, } else { cx.expr(span, ExprKind::Ret(Some(call))) }; - stmts.push(cx.stmt_expr(call)); + + // This exists for https://github.com/rust-lang/rust/pull/47540 + // + // If we decide to stabilize that flag this can be removed + let expr = if attrs.iter().any(|a| a.check_name("rustc_serialize_exclude_null")) { + let is_some = cx.ident_of("is_some"); + let condition = cx.expr_method_call(span, self_.clone(), is_some, vec![]); + cx.expr_if(span, condition, call, None) + } else { + call + }; + let stmt = cx.stmt_expr(expr); + stmts.push(stmt); } // unit structs have no fields and need to return Ok() |
