From 9a45b5ee35a370a4cddff967103529e91ca2af4e Mon Sep 17 00:00:00 2001 From: Jay Kickliter Date: Sun, 6 Sep 2020 18:12:47 -0700 Subject: [PATCH] Add spans for better error messages --- rustler_codegen/src/ex_struct.rs | 6 +++--- rustler_codegen/src/map.rs | 6 +++--- rustler_codegen/src/record.rs | 6 +++--- rustler_codegen/src/tuple.rs | 6 +++--- rustler_codegen/src/unit_enum.rs | 6 ++++-- rustler_codegen/src/untagged_enum.rs | 12 +++++++----- 6 files changed, 23 insertions(+), 19 deletions(-) diff --git a/rustler_codegen/src/ex_struct.rs b/rustler_codegen/src/ex_struct.rs index 33b83e9f..79850422 100644 --- a/rustler_codegen/src/ex_struct.rs +++ b/rustler_codegen/src/ex_struct.rs @@ -1,6 +1,6 @@ use proc_macro2::{Span, TokenStream}; -use syn::{self, Field, Ident}; +use syn::{self, spanned::Spanned, Field, Ident}; use super::context::Context; use super::RustlerAttr; @@ -70,7 +70,7 @@ fn gen_decoder(ctx: &Context, fields: &[&Field], atoms_module_name: &Ident) -> T let atom_fun = Context::field_to_atom_fun(field); let variable = Context::escape_ident_with_index(&ident.to_string(), index, "struct"); - let assignment = quote! { + let assignment = quote_spanned! { field.span() => let #variable = try_decode_field(env, term, #atom_fun())?; }; @@ -131,7 +131,7 @@ fn gen_encoder(ctx: &Context, fields: &[&Field], atoms_module_name: &Ident) -> T .map(|field| { let field_ident = field.ident.as_ref().unwrap(); let atom_fun = Context::field_to_atom_fun(field); - quote! { + quote_spanned! { field.span() => map = map.map_put(#atom_fun().encode(env), self.#field_ident.encode(env)).unwrap(); } }) diff --git a/rustler_codegen/src/map.rs b/rustler_codegen/src/map.rs index 2788ce5a..d61a0ed0 100644 --- a/rustler_codegen/src/map.rs +++ b/rustler_codegen/src/map.rs @@ -1,6 +1,6 @@ use proc_macro2::{Span, TokenStream}; -use syn::{self, Field, Ident}; +use syn::{self, spanned::Spanned, Field, Ident}; use super::context::Context; @@ -64,7 +64,7 @@ fn gen_decoder(ctx: &Context, fields: &[&Field], atoms_module_name: &Ident) -> T let atom_fun = Context::field_to_atom_fun(field); let variable = Context::escape_ident_with_index(&ident.to_string(), index, "map"); - let assignment = quote! { + let assignment = quote_spanned! { field.span() => let #variable = try_decode_field(env, term, #atom_fun())?; }; @@ -119,7 +119,7 @@ fn gen_encoder(ctx: &Context, fields: &[&Field], atoms_module_name: &Ident) -> T let field_ident = field.ident.as_ref().unwrap(); let atom_fun = Context::field_to_atom_fun(field); - quote! { + quote_spanned! { field.span() => map = map.map_put(#atom_fun().encode(env), self.#field_ident.encode(env)).unwrap(); } }) diff --git a/rustler_codegen/src/record.rs b/rustler_codegen/src/record.rs index f34c935f..fdb8a084 100644 --- a/rustler_codegen/src/record.rs +++ b/rustler_codegen/src/record.rs @@ -1,6 +1,6 @@ use proc_macro2::{Span, TokenStream}; -use syn::{self, Field, Ident, Index}; +use syn::{self, spanned::Spanned, Field, Ident, Index}; use super::context::Context; use super::RustlerAttr; @@ -66,7 +66,7 @@ fn gen_decoder(ctx: &Context, fields: &[&Field], atoms_module_name: &Ident) -> T let variable = Context::escape_ident(&pos_in_struct, "record"); - let assignment = quote! { + let assignment = quote_spanned! { field.span() => let #variable = try_decode_index(&terms, #pos_in_struct, #actual_index)?; }; @@ -150,7 +150,7 @@ fn gen_encoder(ctx: &Context, fields: &[&Field], atoms_module_name: &Ident) -> T Some(ident) => quote! { self.#ident }, }; - quote! { #field_source.encode(env) } + quote_spanned! { field.span() => #field_source.encode(env) } }) .collect(); diff --git a/rustler_codegen/src/tuple.rs b/rustler_codegen/src/tuple.rs index aa999e3c..2b5d4647 100644 --- a/rustler_codegen/src/tuple.rs +++ b/rustler_codegen/src/tuple.rs @@ -1,6 +1,6 @@ use proc_macro2::TokenStream; -use syn::{self, Field, Index}; +use syn::{self, spanned::Spanned, Field, Index}; use super::context::Context; @@ -51,7 +51,7 @@ fn gen_decoder(ctx: &Context, fields: &[&Field]) -> TokenStream { let variable = Context::escape_ident(&pos_in_struct, "struct"); - let assignment = quote! { + let assignment = quote_spanned! { field.span() => let #variable = try_decode_index(&terms, #pos_in_struct, #index)?; }; @@ -120,7 +120,7 @@ fn gen_encoder(ctx: &Context, fields: &[&Field]) -> TokenStream { Some(ident) => quote! { self.#ident }, }; - quote! { #field_source.encode(env) } + quote_spanned! { field.span() => #field_source.encode(env) } }) .collect(); diff --git a/rustler_codegen/src/unit_enum.rs b/rustler_codegen/src/unit_enum.rs index 7e21ada9..8ee49258 100644 --- a/rustler_codegen/src/unit_enum.rs +++ b/rustler_codegen/src/unit_enum.rs @@ -1,7 +1,7 @@ use proc_macro2::{Span, TokenStream}; use heck::SnakeCase; -use syn::{self, Fields, Ident, Variant}; +use syn::{self, spanned::Spanned, Fields, Ident, Variant}; use super::context::Context; @@ -16,7 +16,9 @@ pub fn transcoder_decorator(ast: &syn::DeriveInput) -> TokenStream { for variant in variants { if let Fields::Unit = variant.fields { } else { - panic!("NifUnitEnum can only be used with enums that contain all unit variants."); + return quote_spanned! { variant.span() => + compile_error!("NifUnitEnum can only be used with enums containing unit variants."); + }; } } diff --git a/rustler_codegen/src/untagged_enum.rs b/rustler_codegen/src/untagged_enum.rs index cb6fe048..21fc6dec 100644 --- a/rustler_codegen/src/untagged_enum.rs +++ b/rustler_codegen/src/untagged_enum.rs @@ -1,6 +1,6 @@ use proc_macro2::TokenStream; -use syn::{self, Fields, Variant}; +use syn::{self, spanned::Spanned, Fields, Variant}; use super::context::Context; @@ -15,12 +15,14 @@ pub fn transcoder_decorator(ast: &syn::DeriveInput) -> TokenStream { for variant in variants { if let Fields::Unnamed(_) = variant.fields { if variant.fields.iter().count() != 1 { - panic!("NifUntaggedEnum can only be used with enums that contain all NewType variants."); + return quote_spanned! { variant.span() => + compile_error!("NifUntaggedEnum can only be used with enums that contain all NewType variants."); + }; } } else { - panic!( - "NifUntaggedEnum can only be used with enums that contain all NewType variants." - ); + return quote_spanned! { variant.span() => + compile_error!("NifUntaggedEnum can only be used with enums that contain all NewType variants."); + }; } }