From f6b6c946759381f4addc413c5870c734f1a0b93b Mon Sep 17 00:00:00 2001 From: Jimmy Cuadra Date: Sun, 13 May 2018 00:19:37 -0700 Subject: [PATCH] Preserve span information for fields. --- src/api/request.rs | 27 ++++++++++++++++++++------- src/api/response.rs | 28 ++++++++++++++++++++-------- 2 files changed, 40 insertions(+), 15 deletions(-) diff --git a/src/api/request.rs b/src/api/request.rs index 4abdd02f..dd1093a6 100644 --- a/src/api/request.rs +++ b/src/api/request.rs @@ -1,4 +1,5 @@ use quote::{ToTokens, Tokens}; +use syn::spanned::Spanned; use syn::{Field, Meta, NestedMeta}; use api::strip_serde_attrs; @@ -54,8 +55,9 @@ impl Request { for field in self.fields.iter().flat_map(|f| f.field_(request_field_kind)) { let field_name = field.ident.expect("expected field to have an identifier"); + let span = field.span(); - tokens.append_all(quote! { + tokens.append_all(quote_spanned! {span=> #field_name: request.#field_name, }); } @@ -146,7 +148,12 @@ impl ToTokens for Request { tokens.append_all("{".into_tokens()); for request_field in self.fields.iter() { - strip_serde_attrs(request_field.field()).to_tokens(&mut tokens); + let field = request_field.field(); + let span = field.span(); + + strip_serde_attrs(field).to_tokens(&mut tokens); + + tokens.append_all(quote_spanned!(span=> #field)); tokens.append_all(",".into_tokens()); } @@ -156,9 +163,10 @@ impl ToTokens for Request { if let Some(newtype_body_field) = self.newtype_body_field() { let mut field = newtype_body_field.clone(); - let ty = field.ty; + let ty = &field.ty; + let span = field.span(); - tokens.append_all(quote! { + tokens.append_all(quote_spanned! {span=> /// Data in the request body. #[derive(Debug, Serialize)] struct RequestBody(#ty); @@ -175,7 +183,8 @@ impl ToTokens for Request { for request_field in self.fields.iter() { match *request_field { RequestField::Body(ref field) => { - field.to_tokens(&mut tokens); + let span = field.span(); + tokens.append_all(quote_spanned!(span=> #field)); tokens.append_all(",".into_tokens()); } @@ -198,7 +207,9 @@ impl ToTokens for Request { for request_field in self.fields.iter() { match *request_field { RequestField::Path(ref field) => { - field.to_tokens(&mut tokens); + let span = field.span(); + + tokens.append_all(quote_spanned!(span=> #field)); tokens.append_all(",".into_tokens()); } @@ -221,7 +232,9 @@ impl ToTokens for Request { for request_field in self.fields.iter() { match *request_field { RequestField::Query(ref field) => { - field.to_tokens(&mut tokens); + let span = field.span(); + + tokens.append_all(quote_spanned!(span=> #field)); tokens.append_all(",".into_tokens()); } diff --git a/src/api/response.rs b/src/api/response.rs index 7246e4e1..bd6048cc 100644 --- a/src/api/response.rs +++ b/src/api/response.rs @@ -1,4 +1,5 @@ use quote::{ToTokens, Tokens}; +use syn::spanned::Spanned; use syn::{Field, Meta, NestedMeta}; use api::strip_serde_attrs; @@ -27,24 +28,27 @@ impl Response { match *response_field { ResponseField::Body(ref field) => { let field_name = field.ident.expect("expected field to have an identifier"); + let span = field.span(); - tokens.append_all(quote! { + tokens.append_all(quote_spanned! {span=> #field_name: response_body.#field_name, }); } ResponseField::Header(ref field) => { let field_name = field.ident.expect("expected field to have an identifier"); let field_type = &field.ty; + let span = field.span(); - tokens.append_all(quote! { + tokens.append_all(quote_spanned! {span=> #field_name: headers.remove::<#field_type>() .expect("missing expected request header"), }); } ResponseField::NewtypeBody(ref field) => { let field_name = field.ident.expect("expected field to have an identifier"); + let span = field.span(); - tokens.append_all(quote! { + tokens.append_all(quote_spanned! {span=> #field_name: response_body, }); } @@ -140,7 +144,7 @@ impl From> for Response { } impl ToTokens for Response { - fn to_tokens(&self, mut tokens: &mut Tokens) { + fn to_tokens(&self, tokens: &mut Tokens) { tokens.append_all(quote! { /// Data in the response from this API endpoint. #[derive(Debug)] @@ -153,7 +157,12 @@ impl ToTokens for Response { tokens.append_all("{".into_tokens()); for response_field in self.fields.iter() { - strip_serde_attrs(response_field.field()).to_tokens(&mut tokens); + let field = response_field.field(); + let span = field.span(); + + strip_serde_attrs(field); + + tokens.append_all(quote_spanned!(span=> #field)); tokens.append_all(",".into_tokens()); } @@ -163,9 +172,10 @@ impl ToTokens for Response { if let Some(newtype_body_field) = self.newtype_body_field() { let mut field = newtype_body_field.clone(); - let ty = field.ty; + let ty = &field.ty; + let span = field.span(); - tokens.append_all(quote! { + tokens.append_all(quote_spanned! {span=> /// Data in the response body. #[derive(Debug, Deserialize)] struct ResponseBody(#ty); @@ -182,7 +192,9 @@ impl ToTokens for Response { for response_field in self.fields.iter() { match *response_field { ResponseField::Body(ref field) => { - field.to_tokens(&mut tokens); + let span = field.span(); + + tokens.append_all(quote_spanned!(span=> #field)); tokens.append_all(",".into_tokens()); }