use crate::core::config::Language;
use std::collections::{HashMap, HashSet};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum NameSurface {
PublicHost,
Wire,
InternalRust,
Abi,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum IdentifierContext {
PublicType,
PublicMember,
PublicParameter,
PublicEnumVariant,
Wire,
InternalRust,
AbiSymbol,
SwiftSource,
SwiftRustShim,
KotlinSource,
KotlinRustBridge,
DartType,
DartValue,
DartTupleField,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum PublicIdentifierKind {
Function,
Method,
Field,
Type,
EnumVariant,
Parameter,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct NameCollision {
pub generated: String,
pub originals: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum NameError {
InvalidIdentifier {
lang: Language,
context: IdentifierContext,
name: String,
},
Collision(NameCollision),
}
pub fn detect_name_collisions<I, O, G>(items: I, generate: G) -> Vec<NameCollision>
where
I: IntoIterator<Item = O>,
O: AsRef<str>,
G: Fn(&str) -> String,
{
let mut grouped: HashMap<String, Vec<String>> = HashMap::new();
for item in items {
let original = item.as_ref();
grouped
.entry(generate(original))
.or_default()
.push(original.to_string());
}
grouped
.into_iter()
.filter_map(|(generated, originals)| {
let unique: HashSet<_> = originals.iter().collect();
(unique.len() > 1).then_some(NameCollision { generated, originals })
})
.collect()
}