diff options
author | Martin Fischer <martin@push-f.com> | 2021-11-21 08:33:52 +0100 |
---|---|---|
committer | Martin Fischer <martin@push-f.com> | 2021-11-21 08:36:10 +0100 |
commit | 34dc166a9bc003bad36c28aeb29b625195d20a74 (patch) | |
tree | 1a4b7fbcd673f8094b019263cbe954ef38abb97c /src | |
parent | bd6f84036426c43e08078cf11e4ee70b7714ba2f (diff) |
better errors for assoc types in where clauses
Diffstat (limited to 'src')
-rw-r--r-- | src/lib.rs | 8 | ||||
-rw-r--r-- | src/parse_trait_sig.rs | 1 | ||||
-rw-r--r-- | src/transform.rs | 22 |
3 files changed, 25 insertions, 6 deletions
@@ -110,9 +110,11 @@ pub fn dynamize(_attr: TokenStream, input: TokenStream) -> TokenStream { MethodParseError::AssocTypeInUnsupportedReturnType | MethodParseError::UnconvertibleAssocTypeInFnInput, )) => return abort!(span, "dynamize does not know how to convert this type"), - Err((span, MethodParseError::UnconvertibleAssocTypeInTraitBound)) => { - return abort!(span, "dynamize does not support associated types here") - } + Err(( + span, + MethodParseError::UnconvertibleAssocTypeInTraitBound + | MethodParseError::UnconvertibleAssocTypeInWhereClause, + )) => return abort!(span, "dynamize does not support associated types here"), Err((span, MethodParseError::ImplTraitInInputs)) => { return abort!( span, diff --git a/src/parse_trait_sig.rs b/src/parse_trait_sig.rs index 508e131..82b8ee9 100644 --- a/src/parse_trait_sig.rs +++ b/src/parse_trait_sig.rs @@ -28,6 +28,7 @@ pub enum MethodParseError { AssocTypeInUnsupportedReturnType, UnconvertibleAssocTypeInFnInput, UnconvertibleAssocTypeInTraitBound, + UnconvertibleAssocTypeInWhereClause, UnconvertibleAssocType, } diff --git a/src/transform.rs b/src/transform.rs index 676cfd8..b13b7cf 100644 --- a/src/transform.rs +++ b/src/transform.rs @@ -141,11 +141,27 @@ pub fn dynamize_function_bounds( } } - // TODO: return error if predicate_type.bounded_ty contains associated type + // just to provide better error messages + if let Some(assoc_type) = + iter_type(&predicate_type.bounded_ty).find_map(filter_map_assoc_paths) + { + return Err(( + assoc_type.span(), + MethodParseError::UnconvertibleAssocTypeInWhereClause, + )); + } + // just to provide better error messages for bound in &mut predicate_type.bounds { - if let TypeParamBound::Trait(_bound) = bound { - // TODO: return error if bound.path contains associated type + if let TypeParamBound::Trait(bound) = bound { + if let Some(assoc_type) = + iter_path(&bound.path).find_map(filter_map_assoc_paths) + { + return Err(( + assoc_type.span(), + MethodParseError::UnconvertibleAssocTypeInWhereClause, + )); + } } } } |