aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Fischer <martin@push-f.com>2021-11-22 09:29:41 +0100
committerMartin Fischer <martin@push-f.com>2021-11-22 09:29:43 +0100
commit4101b0d0f188a7814bdfbf59378b0c528faa7147 (patch)
treed616d6dd73c5da9aae3ceaccd35b4cf3259b130d
parentef698909223b2f29f7a6cae17f0aba3461c8803d (diff)
rename AssocTypeConversions to TypeConverter
-rw-r--r--src/lib.rs10
-rw-r--r--src/parse_trait_sig.rs17
-rw-r--r--src/transform.rs37
3 files changed, 32 insertions, 32 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 5e3653d..8fa1294 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -44,7 +44,7 @@ use crate::parse_trait_sig::SignatureChanges;
use crate::parse_trait_sig::TypeTransform;
use crate::syn_utils::iter_path;
use crate::syn_utils::trait_bounds;
-use crate::transform::AssocTypeConversions;
+use crate::transform::TypeConverter;
mod parse_assoc_type;
mod parse_trait_sig;
@@ -66,7 +66,7 @@ pub fn dynamize(_attr: TokenStream, input: TokenStream) -> TokenStream {
let mut objectifiable_methods: Vec<(Signature, SignatureChanges)> = Vec::new();
- let mut assoc_type_conversions = AssocTypeConversions::default();
+ let mut type_converter = TypeConverter::default();
for item in &original_trait.items {
if let TraitItem::Type(assoc_type) = item {
@@ -82,7 +82,9 @@ pub fn dynamize(_attr: TokenStream, input: TokenStream) -> TokenStream {
)
}
Ok((ident, type_)) => {
- assoc_type_conversions.0.insert(ident.clone(), type_);
+ type_converter
+ .assoc_type_conversions
+ .insert(ident.clone(), type_);
}
}
}
@@ -91,7 +93,7 @@ pub fn dynamize(_attr: TokenStream, input: TokenStream) -> TokenStream {
for item in &original_trait.items {
if let TraitItem::Method(method) = item {
let mut signature = method.sig.clone();
- match parse_trait_signature(&mut signature, &assoc_type_conversions) {
+ match parse_trait_signature(&mut signature, &type_converter) {
Err((_, MethodParseError::NonDispatchableMethod)) => continue,
Err((span, MethodParseError::UnconvertibleAssocType)) => {
return abort!(
diff --git a/src/parse_trait_sig.rs b/src/parse_trait_sig.rs
index 4c0b4fd..8f578f7 100644
--- a/src/parse_trait_sig.rs
+++ b/src/parse_trait_sig.rs
@@ -9,7 +9,7 @@ use syn::{Ident, Signature, TypeImplTrait};
use crate::match_assoc_type;
use crate::parse_assoc_type::BoxType;
use crate::syn_utils::{iter_type, trait_bounds, TypeOrPath};
-use crate::transform::{dynamize_function_bounds, AssocTypeConversions, TransformError};
+use crate::transform::{dynamize_function_bounds, TransformError, TypeConverter};
#[derive(Debug, Clone)]
pub enum TypeTransform {
@@ -49,7 +49,7 @@ pub struct SignatureChanges {
pub fn parse_trait_signature(
signature: &mut Signature,
- assoc_type_conversions: &AssocTypeConversions,
+ type_converter: &TypeConverter,
) -> Result<SignatureChanges, (Span, MethodParseError)> {
if is_non_dispatchable(signature) {
return Err((signature.span(), MethodParseError::NonDispatchableMethod));
@@ -67,11 +67,10 @@ pub fn parse_trait_signature(
}
}
- let type_param_transforms =
- dynamize_function_bounds(&mut signature.generics, assoc_type_conversions)?;
+ let type_param_transforms = dynamize_function_bounds(&mut signature.generics, type_converter)?;
let return_type = match &mut signature.output {
- ReturnType::Type(_, og_type) => match assoc_type_conversions.parse_type_path(og_type) {
+ ReturnType::Type(_, og_type) => match type_converter.convert_type(og_type) {
Ok(ret_type) => ret_type,
Err(TransformError::UnconvertibleAssocType(span)) => {
return Err((span, MethodParseError::UnconvertibleAssocType));
@@ -147,7 +146,7 @@ mod tests {
parse_trait_sig::{
parse_trait_signature, MethodParseError, SignatureChanges, TypeTransform,
},
- transform::AssocTypeConversions,
+ transform::TypeConverter,
};
#[test]
@@ -173,14 +172,14 @@ mod tests {
})
.unwrap();
- let mut assoc_type_map = AssocTypeConversions::default();
+ let mut type_converter = TypeConverter::default();
let ident = format_ident!("A");
let dest_inner = Type::Verbatim(quote! {Example});
let dest = DestType::Into(&dest_inner);
- assoc_type_map.0.insert(ident, dest);
+ type_converter.assoc_type_conversions.insert(ident, dest);
assert!(matches!(
- parse_trait_signature(&mut type1.sig, &assoc_type_map),
+ parse_trait_signature(&mut type1.sig, &type_converter),
Ok(SignatureChanges {
return_type: TypeTransform::Into,
..
diff --git a/src/transform.rs b/src/transform.rs
index 4625f4c..47e27a6 100644
--- a/src/transform.rs
+++ b/src/transform.rs
@@ -15,7 +15,9 @@ use crate::{
};
#[derive(Default)]
-pub struct AssocTypeConversions<'a>(pub HashMap<Ident, DestType<'a>>);
+pub struct TypeConverter<'a> {
+ pub assoc_type_conversions: HashMap<Ident, DestType<'a>>,
+}
pub enum TransformError {
UnconvertibleAssocType(Span),
@@ -39,8 +41,8 @@ fn is_supported_collection_map(ident: &Ident) -> bool {
ident == "HashMap" || ident == "BTreeMap"
}
-impl AssocTypeConversions<'_> {
- pub fn parse_type_path(&self, type_: &mut Type) -> Result<TypeTransform, TransformError> {
+impl TypeConverter<'_> {
+ pub fn convert_type(&self, type_: &mut Type) -> Result<TypeTransform, TransformError> {
if !iter_type(type_).any(match_assoc_type) {
return Ok(TypeTransform::NoOp);
}
@@ -69,8 +71,7 @@ impl AssocTypeConversions<'_> {
if binding.ident == "Item"
&& iter_type(&binding.ty).any(match_assoc_type)
{
- let inner =
- self.parse_type_path(&mut binding.ty)?;
+ let inner = self.convert_type(&mut binding.ty)?;
let box_type = BoxType {
inner: quote! {#elem},
placeholder_lifetime: true,
@@ -96,7 +97,7 @@ impl AssocTypeConversions<'_> {
if path.segments.len() == 2 {
let ident = &path.segments.last().unwrap().ident;
let dest_type = self
- .0
+ .assoc_type_conversions
.get(ident)
.ok_or_else(|| TransformError::UnconvertibleAssocType(ident.span()))?;
*type_ = dest_type.get_dest();
@@ -113,13 +114,11 @@ impl AssocTypeConversions<'_> {
if (last_seg.ident == "Option" && path_len == 1)
|| last_seg.ident == "Result"
{
- return Ok(TypeTransform::Map(
- self.parse_type_path(arg)?.into(),
- ));
+ return Ok(TypeTransform::Map(self.convert_type(arg)?.into()));
} else if is_supported_collection(&last_seg.ident) && path_len == 1
{
return Ok(TypeTransform::Collection(
- self.parse_type_path(arg)?.into(),
+ self.convert_type(arg)?.into(),
));
}
}
@@ -134,13 +133,13 @@ impl AssocTypeConversions<'_> {
{
if last_seg.ident == "Result" {
return Ok(TypeTransform::Result(
- self.parse_type_path(arg1)?.into(),
- self.parse_type_path(arg2)?.into(),
+ self.convert_type(arg1)?.into(),
+ self.convert_type(arg2)?.into(),
));
} else if is_supported_collection_map(&last_seg.ident) {
return Ok(TypeTransform::CollectionMap(
- self.parse_type_path(arg1)?.into(),
- self.parse_type_path(arg2)?.into(),
+ self.convert_type(arg1)?.into(),
+ self.convert_type(arg2)?.into(),
));
}
}
@@ -158,7 +157,7 @@ impl AssocTypeConversions<'_> {
pub fn dynamize_function_bounds(
generics: &mut Generics,
- assoc_type_conversions: &AssocTypeConversions,
+ type_converter: &TypeConverter,
) -> Result<HashMap<Ident, Vec<TypeTransform>>, (Span, MethodParseError)> {
let mut type_param_transforms = HashMap::new();
@@ -167,7 +166,7 @@ pub fn dynamize_function_bounds(
if let TypeParamBound::Trait(bound) = bound {
dynamize_trait_bound(
bound,
- assoc_type_conversions,
+ type_converter,
&type_param.ident,
&mut type_param_transforms,
)?;
@@ -184,7 +183,7 @@ pub fn dynamize_function_bounds(
if let TypeParamBound::Trait(bound) = bound {
dynamize_trait_bound(
bound,
- assoc_type_conversions,
+ type_converter,
ident,
&mut type_param_transforms,
)?;
@@ -226,7 +225,7 @@ pub fn dynamize_function_bounds(
fn dynamize_trait_bound(
bound: &mut TraitBound,
- assoc_type_conversions: &AssocTypeConversions,
+ type_converter: &TypeConverter,
type_ident: &Ident,
type_param_transforms: &mut HashMap<Ident, Vec<TypeTransform>>,
) -> Result<(), (Span, MethodParseError)> {
@@ -237,7 +236,7 @@ fn dynamize_trait_bound(
if segment.ident == "Fn" || segment.ident == "FnOnce" || segment.ident == "FnMut" {
let mut transforms = Vec::new();
for input_type in &mut args.inputs {
- match assoc_type_conversions.parse_type_path(input_type) {
+ match type_converter.convert_type(input_type) {
Ok(ret_type) => {
transforms.push(ret_type);
}