Skip to content

Commit

Permalink
Added error test case for #[using] on trait functions, and made minor…
Browse files Browse the repository at this point in the history
… code improvements
  • Loading branch information
IsaacShelton committed Jan 26, 2025
1 parent 472fdf9 commit f814d0c
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 17 deletions.
35 changes: 20 additions & 15 deletions src/resolve/expr/call/infer_impl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,24 +25,29 @@ pub fn infer_callee_missing_impl_args(
continue;
};

let from_env = caller.impl_params.params.iter().filter(|(_, param_trait)| {
if catalog
.extend_if_match_all_types(ctx, &expected_trait.args, &param_trait.args)
.is_err()
{
return false;
}
let from_env = caller
.impl_params
.params
.iter()
.filter_map(|(param_name, param_trait)| {
if catalog
.extend_if_match_all_types(ctx, &expected_trait.args, &param_trait.args)
.is_err()
{
return None;
}

catalog
.resolver()
.resolve_trait(expected_trait)
.map_or(false, |expected_trait| {
param_trait.trait_ref == expected_trait.trait_ref
})
});
catalog
.resolver()
.resolve_trait(expected_trait)
.ok()
.and_then(|expected_trait| {
(param_trait.trait_ref == expected_trait.trait_ref).then_some(param_name)
})
});

match from_env.exactly_one() {
Ok((param_name, _)) => {
Ok(param_name) => {
if catalog
.polymorphs
.insert(expected_name.into(), PolyValue::PolyImpl(param_name.into()))
Expand Down
6 changes: 4 additions & 2 deletions src/resolve/polymorph/matcher.rs
Original file line number Diff line number Diff line change
Expand Up @@ -162,8 +162,10 @@ impl<'a, 'b, 'c> TypeMatcher<'a, 'b, 'c> {
}
}

self.partial
.insert(name.to_string(), PolyValue::Type(new_type.clone()));
assert!(self
.partial
.insert(name.to_string(), PolyValue::Type(new_type.clone()))
.is_none());

Ok(())
}
Expand Down
16 changes: 16 additions & 0 deletions tests/error/using_trait_on_trait_func/main.adept
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@

pragma => adept(c"3.0")

trait Example<$T> {
#[using Speak<$T>]
func invalidFunction(self $T) void
}

trait Speak<$T> {
func speak(self $T) void
}

func main {

}

0 comments on commit f814d0c

Please sign in to comment.