Skip to content

Commit b442a43

Browse files
committed
Check for duplicate items in crate
1 parent b8306ab commit b442a43

File tree

1 file changed

+33
-1
lines changed
  • crates/formality-check/src

1 file changed

+33
-1
lines changed

crates/formality-check/src/lib.rs

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
use std::{collections::VecDeque, fmt::Debug};
44

55
use anyhow::bail;
6+
use formality_core::Set;
67
use formality_prove::{is_definitely_not_proveable, Decls, Env};
78
use formality_rust::{
89
grammar::{Crate, CrateItem, Program, Test, TestBoundData},
@@ -71,7 +72,38 @@ impl Check<'_> {
7172
}
7273

7374
fn check_for_duplicate_items(&self) -> Fallible<()> {
74-
// FIXME: check for items with duplicate names, respecting the various Rust rules about namespaces
75+
let Program { crates } = &self.program;
76+
for c in crates.iter() {
77+
let mut items = Set::new();
78+
let mut traits = Set::new();
79+
let mut functions = Set::new();
80+
for item in c.items.iter() {
81+
match item {
82+
CrateItem::Struct(s) => {
83+
if !items.insert(&s.id) {
84+
bail!("the item name `{:?}` is defined multiple times", s.id);
85+
}
86+
}
87+
CrateItem::Enum(e) => {
88+
if !items.insert(&e.id) {
89+
bail!("the item name `{:?}` is defined multiple times", e.id);
90+
}
91+
}
92+
CrateItem::Trait(t) => {
93+
if !traits.insert(&t.id) {
94+
bail!("the trait name `{:?}` is defined multiple times", t.id);
95+
}
96+
}
97+
CrateItem::Fn(f) => {
98+
if !functions.insert(&f.id) {
99+
bail!("the function name `{:?}` is defined multiple times", f.id);
100+
}
101+
}
102+
CrateItem::TraitImpl(_) | CrateItem::NegTraitImpl(_) | CrateItem::Test(_) => {}
103+
}
104+
}
105+
}
106+
75107
Ok(())
76108
}
77109

0 commit comments

Comments
 (0)