Use actual spans instead of Span::call_site()

This commit is contained in:
Dmitry Samoylov
2020-02-04 19:56:22 +07:00
parent 65838ced80
commit f9e8d91590
9 changed files with 83 additions and 67 deletions

View File

@@ -50,7 +50,13 @@ pub fn serialize_element(
let inner = enclose_characters(label, label_name);
if let Some(ref d) = default {
let default_function = Ident::new(&d, Span::call_site());
let default_function = Ident::new(
&d,
label
.as_ref()
.map_or(Span::call_site(), |ident| ident.span()),
);
Some(quote! {
if self.#label != #default_function() {
#inner

View File

@@ -1,7 +1,8 @@
use attribute::*;
use field_type::*;
use proc_macro2::{Span, TokenStream};
use proc_macro2::TokenStream;
use std::collections::BTreeMap;
use syn::spanned::Spanned;
use syn::DataEnum;
use syn::Fields;
use syn::Ident;
@@ -53,7 +54,7 @@ pub fn serialize(
}
let renamed_field_label = match field_attrs.rename {
Some(value) => Some(Ident::new(&value.replace("\"", ""), Span::call_site())),
Some(value) => Some(Ident::new(&value.replace("\"", ""), field.span())),
None => field.ident.clone(),
};
let field_label_name = renamed_field_label.unwrap().to_string();

View File

@@ -1,8 +1,9 @@
use attribute::*;
use field_type::*;
use proc_macro2::{Span, TokenStream};
use proc_macro2::TokenStream;
use std::collections::BTreeMap;
use std::string::ToString;
use syn::spanned::Spanned;
use syn::DataStruct;
use syn::Ident;
@@ -27,7 +28,7 @@ pub fn serialize(
let label_name = build_label_name(&field, &field_attrs);
get_field_type(field).and_then(|field| match field {
get_field_type(field).and_then(|f| match f {
FieldType::FieldTypeString
| FieldType::FieldTypeBool
| FieldType::FieldTypeI8
@@ -41,7 +42,7 @@ pub fn serialize(
| FieldType::FieldTypeF32
| FieldType::FieldTypeF64 => {
if let Some(ref d) = field_attrs.default {
let default_function = Ident::new(&d, Span::call_site());
let default_function = Ident::new(&d, field.span());
Some(quote! {
let struct_start_event =
if self.#label != #default_function() {
@@ -75,7 +76,7 @@ pub fn serialize(
FieldType::FieldTypeOption { data_type } => match *data_type {
FieldType::FieldTypeString => {
if let Some(ref d) = field_attrs.default {
let default_function = Ident::new(&d, Span::call_site());
let default_function = Ident::new(&d, field.span());
Some(quote! {
let struct_start_event =
if self.#label != #default_function() {
@@ -111,7 +112,7 @@ pub fn serialize(
| FieldType::FieldTypeF32
| FieldType::FieldTypeF64 => {
if let Some(ref d) = field_attrs.default {
let default_function = Ident::new(&d, Span::call_site());
let default_function = Ident::new(&d, field.span());
Some(quote! {
let struct_start_event =
if self.#label != #default_function() {
@@ -152,11 +153,11 @@ pub fn serialize(
}
}
FieldType::FieldTypeVec { .. } => {
let item_ident = Ident::new("yas_item", Span::call_site());
let item_ident = Ident::new("yas_item", field.span());
let inner = enclose_formatted_characters(&item_ident, label_name);
if let Some(ref d) = field_attrs.default {
let default_function = Ident::new(&d, Span::call_site());
let default_function = Ident::new(&d, field.span());
Some(quote! {
if self.#label != #default_function() {
@@ -179,7 +180,7 @@ pub fn serialize(
},
FieldType::FieldTypeStruct { .. } => {
if let Some(ref d) = field_attrs.default {
let default_function = Ident::new(&d, Span::call_site());
let default_function = Ident::new(&d, field.span());
Some(quote! {
let struct_start_event =
if self.#label != #default_function() {
@@ -253,7 +254,7 @@ pub fn serialize(
let label_name = build_label_name(&field, &field_attrs);
get_field_type(field).and_then(|field| match field {
get_field_type(field).and_then(|f| match f {
FieldType::FieldTypeString
| FieldType::FieldTypeBool
| FieldType::FieldTypeI8
@@ -279,11 +280,11 @@ pub fn serialize(
| FieldType::FieldTypeU64
| FieldType::FieldTypeF32
| FieldType::FieldTypeF64 => {
let item_ident = Ident::new("yas_item", Span::call_site());
let item_ident = Ident::new("yas_item", field.span());
let inner = enclose_formatted_characters_for_value(&item_ident, label_name);
if let Some(ref d) = field_attrs.default {
let default_function = Ident::new(&d, Span::call_site());
let default_function = Ident::new(&d, field.span());
Some(quote! {
if self.#label != #default_function() {
@@ -301,11 +302,11 @@ pub fn serialize(
}
}
FieldType::FieldTypeVec { .. } => {
let item_ident = Ident::new("yas_item", Span::call_site());
let item_ident = Ident::new("yas_item", field.span());
let inner = enclose_formatted_characters_for_value(&item_ident, label_name);
if let Some(ref d) = field_attrs.default {
let default_function = Ident::new(&d, Span::call_site());
let default_function = Ident::new(&d, field.span());
Some(quote! {
if self.#label != #default_function() {
@@ -342,7 +343,7 @@ pub fn serialize(
}),
FieldType::FieldTypeVec { data_type } => match *data_type {
FieldType::FieldTypeString => {
let item_ident = Ident::new("yas_item", Span::call_site());
let item_ident = Ident::new("yas_item", field.span());
let inner = enclose_formatted_characters_for_value(&item_ident, label_name);
Some(quote! {
@@ -362,7 +363,7 @@ pub fn serialize(
| FieldType::FieldTypeU64
| FieldType::FieldTypeF32
| FieldType::FieldTypeF64 => {
let item_ident = Ident::new("yas_item", Span::call_site());
let item_ident = Ident::new("yas_item", field.span());
let inner = enclose_formatted_characters_for_value(&item_ident, label_name);
Some(quote! {

View File

@@ -3,7 +3,7 @@ pub mod expand_enum;
pub mod expand_struct;
use attribute;
use proc_macro2::{Span, TokenStream};
use proc_macro2::TokenStream;
use syn;
use syn::Ident;
@@ -31,10 +31,7 @@ pub fn expand_derive_serialize(ast: &syn::DeriveInput) -> Result<TokenStream, St
syn::Data::Union(ref _data_union) => unimplemented!(),
};
let dummy_const = Ident::new(
&format!("_IMPL_YA_SERIALIZE_FOR_{}", name),
Span::call_site(),
);
let dummy_const = Ident::new(&format!("_IMPL_YA_SERIALIZE_FOR_{}", name), name.span());
let generated = quote! {
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications)]