|
3 | 3 | use std::{collections::VecDeque, fmt::Debug};
|
4 | 4 |
|
5 | 5 | use anyhow::bail;
|
| 6 | +use formality_core::Set; |
6 | 7 | use formality_prove::{is_definitely_not_proveable, Decls, Env};
|
7 | 8 | use formality_rust::{
|
8 | 9 | grammar::{Crate, CrateItem, Program, Test, TestBoundData},
|
@@ -71,7 +72,38 @@ impl Check<'_> {
|
71 | 72 | }
|
72 | 73 |
|
73 | 74 | 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 | + |
75 | 107 | Ok(())
|
76 | 108 | }
|
77 | 109 |
|
|
0 commit comments