Skip to content

Commit 113d753

Browse files
authored
Check for duplicate function params in wit files (#1216)
1 parent 585a0bd commit 113d753

File tree

3 files changed

+23
-4
lines changed

3 files changed

+23
-4
lines changed

crates/wit-parser/src/ast/resolve.rs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1295,7 +1295,7 @@ impl<'a> Resolver<'a> {
12951295
}
12961296

12971297
fn resolve_params(&mut self, params: &ParamList<'_>, kind: &FunctionKind) -> Result<Params> {
1298-
let mut ret = Vec::new();
1298+
let mut ret = IndexMap::new();
12991299
match *kind {
13001300
// These kinds of methods don't have any adjustments to the
13011301
// parameters, so do nothing here.
@@ -1311,13 +1311,20 @@ impl<'a> Resolver<'a> {
13111311
name: None,
13121312
owner: TypeOwner::None,
13131313
});
1314-
ret.push(("self".to_string(), shared));
1314+
ret.insert("self".to_string(), shared);
13151315
}
13161316
}
13171317
for (name, ty) in params {
1318-
ret.push((name.name.to_string(), self.resolve_type(ty)?));
1318+
let prev = ret.insert(name.name.to_string(), self.resolve_type(ty)?);
1319+
if prev.is_some() {
1320+
return Err(Error {
1321+
span: name.span,
1322+
msg: format!("param `{}` is defined more than once", name.name),
1323+
}
1324+
.into());
1325+
}
13191326
}
1320-
Ok(ret)
1327+
Ok(ret.into_iter().collect())
13211328
}
13221329

13231330
fn resolve_results(
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// parse-fail
2+
3+
package foo:foo
4+
5+
interface foo {
6+
foo: func(foo: u32, foo: u64)
7+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
param `foo` is defined more than once
2+
--> tests/ui/parse-fail/duplicate-function-params.wit:6:23
3+
|
4+
6 | foo: func(foo: u32, foo: u64)
5+
| ^--

0 commit comments

Comments
 (0)