Skip to content

Commit c0bd284

Browse files
committed
Cleaned up code for auto-assigning trait implementation arguments to implementation parameters
1 parent a2cbd03 commit c0bd284

File tree

1 file changed

+26
-21
lines changed

1 file changed

+26
-21
lines changed

Diff for: src/resolve/expr/call.rs

+26-21
Original file line numberDiff line numberDiff line change
@@ -85,27 +85,32 @@ pub fn call_callee(
8585
let arg_concrete_trait = impl_poly_catalog.bake().resolve_trait(&imp.target)?;
8686
let function = ctx.asg.funcs.get(callee.function).unwrap();
8787

88-
let poly_impl_name = if let Some(name) = &impl_using.name {
89-
name.clone()
90-
} else {
91-
function
92-
.impl_params
93-
.params
94-
.iter()
95-
.filter(|(param_name, param)| {
96-
param.trait_ref == arg_concrete_trait.trait_ref
97-
&& !used_names.contains(*param_name)
98-
})
99-
.map(|(param_name, _)| param_name)
100-
.next()
101-
.ok_or_else(|| {
102-
ResolveError::other(
103-
"No implementation parameter left for implementation argument",
104-
impl_arg.source,
105-
)
106-
})?
107-
.clone()
108-
};
88+
let poly_impl_name = impl_using
89+
.name
90+
.as_ref()
91+
.ok_or(())
92+
.or_else(|_| {
93+
function
94+
.impl_params
95+
.params
96+
.iter()
97+
.filter(|(param_name, param)| {
98+
param.trait_ref == arg_concrete_trait.trait_ref
99+
&& !used_names.contains(*param_name)
100+
})
101+
.map(|(param_name, _)| param_name)
102+
.next()
103+
.ok_or_else(|| {
104+
ResolveError::other(
105+
format!(
106+
"Excess implementation of trait '{}' is not used by callee",
107+
arg_concrete_trait.display(&ctx.asg)
108+
),
109+
impl_arg.source,
110+
)
111+
})
112+
})?
113+
.clone();
109114

110115
if !used_names.insert(poly_impl_name.clone()) {
111116
return Err(ResolveError::other(

0 commit comments

Comments
 (0)