From 659a53bdcbb8453b5072beee08987ae64ecd971a Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sat, 29 Jun 2024 21:58:49 -0500 Subject: [PATCH] config: Check if any classes are duplicated (#712) --- ...ate_external.rs => ce9_duplicate_classes.rs} | 12 ++++++------ libs/config/src/analyze/codes/mod.rs | 3 ++- ...ternal_duplicate.rs => duplicate_classes.rs} | 17 ++++++++++++++--- libs/config/src/analyze/config/mod.rs | 4 ++-- libs/config/tests/errors.rs | 4 ++-- .../ce3_duplicate_property_separate/source.hpp | 8 -------- .../ce3_duplicate_property_separate/stdout.ansi | 9 --------- .../tests/errors/ce9_duplicate_class/source.hpp | 5 +++++ .../errors/ce9_duplicate_class/stdout.ansi | 10 ++++++++++ .../source.hpp | 0 .../stdout.ansi | 2 +- 11 files changed, 42 insertions(+), 32 deletions(-) rename libs/config/src/analyze/codes/{ce8_duplicate_external.rs => ce9_duplicate_classes.rs} (88%) rename libs/config/src/analyze/config/{external_duplicate.rs => duplicate_classes.rs} (59%) delete mode 100644 libs/config/tests/errors/ce3_duplicate_property_separate/source.hpp delete mode 100644 libs/config/tests/errors/ce3_duplicate_property_separate/stdout.ansi create mode 100644 libs/config/tests/errors/ce9_duplicate_class/source.hpp create mode 100644 libs/config/tests/errors/ce9_duplicate_class/stdout.ansi rename libs/config/tests/errors/{ce8_duplicate_external => ce9_duplicate_external}/source.hpp (100%) rename libs/config/tests/errors/{ce8_duplicate_external => ce9_duplicate_external}/stdout.ansi (85%) diff --git a/libs/config/src/analyze/codes/ce8_duplicate_external.rs b/libs/config/src/analyze/codes/ce9_duplicate_classes.rs similarity index 88% rename from libs/config/src/analyze/codes/ce8_duplicate_external.rs rename to libs/config/src/analyze/codes/ce9_duplicate_classes.rs index c162a6f2..beb7afe9 100644 --- a/libs/config/src/analyze/codes/ce8_duplicate_external.rs +++ b/libs/config/src/analyze/codes/ce9_duplicate_classes.rs @@ -2,18 +2,18 @@ use hemtt_workspace::reporting::{Code, Diagnostic, Label, Processed}; use crate::Class; -pub struct DuplicateExternal { +pub struct DuplicateClasses { classes: Vec, diagnostic: Option, } -impl Code for DuplicateExternal { +impl Code for DuplicateClasses { fn ident(&self) -> &'static str { - "CE8" + "CE9" } fn message(&self) -> String { - "external class defined multiple times".to_string() + "class defined multiple times".to_string() } fn label_message(&self) -> String { @@ -38,7 +38,7 @@ impl Code for DuplicateExternal { } } -impl DuplicateExternal { +impl DuplicateClasses { pub fn new(classes: Vec, processed: &Processed) -> Self { Self { classes, @@ -49,7 +49,7 @@ impl DuplicateExternal { fn generate_processed(mut self, processed: &Processed) -> Self { let Some(name) = self.classes[0].name() else { - panic!("DuplicateExternal::generate_processed called on class without name"); + panic!("DuplicateClasses::generate_processed called on class without name"); }; self.diagnostic = Diagnostic::new_for_processed(&self, name.span.clone(), processed); if let Some(diag) = &mut self.diagnostic { diff --git a/libs/config/src/analyze/codes/mod.rs b/libs/config/src/analyze/codes/mod.rs index 1d0624b5..67c876ba 100644 --- a/libs/config/src/analyze/codes/mod.rs +++ b/libs/config/src/analyze/codes/mod.rs @@ -8,7 +8,8 @@ pub mod ce4_missing_semicolon; pub mod ce5_unexpected_array; pub mod ce6_expected_array; pub mod ce7_missing_parent; -pub mod ce8_duplicate_external; +// pub mod ce8_duplicate_external //* superseded by ce9_duplicate_classes +pub mod ce9_duplicate_classes; pub mod cw1_parent_case; pub mod cw2_magwell_missing_magazine; diff --git a/libs/config/src/analyze/config/external_duplicate.rs b/libs/config/src/analyze/config/duplicate_classes.rs similarity index 59% rename from libs/config/src/analyze/config/external_duplicate.rs rename to libs/config/src/analyze/config/duplicate_classes.rs index 4964f713..dd3dcde3 100644 --- a/libs/config/src/analyze/config/external_duplicate.rs +++ b/libs/config/src/analyze/config/duplicate_classes.rs @@ -2,7 +2,7 @@ use std::{collections::HashMap, sync::Arc}; use hemtt_workspace::reporting::{Code, Processed}; -use crate::{analyze::codes::ce8_duplicate_external::DuplicateExternal, Class, Property}; +use crate::{analyze::codes::ce9_duplicate_classes::DuplicateClasses, Class, Property}; pub fn error(properties: &[Property], processed: &Processed) -> Vec> { let mut defined: HashMap> = HashMap::new(); @@ -10,7 +10,7 @@ pub fn error(properties: &[Property], processed: &Processed) -> Vec { + Class::Root { properties } => { errors.extend(error(properties, processed)); } Class::External { name } => { @@ -19,12 +19,23 @@ pub fn error(properties: &[Property], processed: &Processed) -> Vec { + errors.extend(error(properties, processed)); + defined + .entry(name.value.to_lowercase()) + .or_default() + .push(c.clone()); + } } } } errors.extend(defined.into_iter().filter_map(|(_, classes)| { if classes.len() > 1 { - Some(Arc::new(DuplicateExternal::new(classes, processed)) as Arc) + Some(Arc::new(DuplicateClasses::new(classes, processed)) as Arc) } else { None } diff --git a/libs/config/src/analyze/config/mod.rs b/libs/config/src/analyze/config/mod.rs index ba94bc41..8b4970cd 100644 --- a/libs/config/src/analyze/config/mod.rs +++ b/libs/config/src/analyze/config/mod.rs @@ -7,8 +7,8 @@ use crate::Config; use super::Analyze; +mod duplicate_classes; mod duplicate_properties; -mod external_duplicate; mod external_missing; mod external_parent_case; mod magwells; @@ -37,7 +37,7 @@ impl Analyze for Config { .iter() .flat_map(|p| p.errors(project, processed)) .collect::>(); - errors.extend(external_duplicate::error(&self.0, processed)); + errors.extend(duplicate_classes::error(&self.0, processed)); errors.extend(external_missing::error(&self.0, processed)); errors.extend(duplicate_properties::duplicate_properties( &self.0, processed, diff --git a/libs/config/tests/errors.rs b/libs/config/tests/errors.rs index d77fc470..7bdd5872 100644 --- a/libs/config/tests/errors.rs +++ b/libs/config/tests/errors.rs @@ -68,10 +68,10 @@ fn check(dir: &str) { bootstrap!(ce1_invalid_value); bootstrap!(ce2_invalid_value_macro); -bootstrap!(ce3_duplicate_property_separate); bootstrap!(ce3_duplicate_property_shadow_property); bootstrap!(ce4_missing_semicolon); bootstrap!(ce5_unexpected_array); bootstrap!(ce6_expected_array); bootstrap!(ce7_missing_parent); -bootstrap!(ce8_duplicate_external); +bootstrap!(ce9_duplicate_class); +bootstrap!(ce9_duplicate_external); diff --git a/libs/config/tests/errors/ce3_duplicate_property_separate/source.hpp b/libs/config/tests/errors/ce3_duplicate_property_separate/source.hpp deleted file mode 100644 index 75ae66b0..00000000 --- a/libs/config/tests/errors/ce3_duplicate_property_separate/source.hpp +++ /dev/null @@ -1,8 +0,0 @@ -class Test { - class Child { - inner = "something"; - }; - class Child { - inner = "something"; - }; -}; diff --git a/libs/config/tests/errors/ce3_duplicate_property_separate/stdout.ansi b/libs/config/tests/errors/ce3_duplicate_property_separate/stdout.ansi deleted file mode 100644 index 3489c066..00000000 --- a/libs/config/tests/errors/ce3_duplicate_property_separate/stdout.ansi +++ /dev/null @@ -1,9 +0,0 @@ -error[CE3]: property was defined more than once - ┌─ source.hpp:6:9 - │ -3 │ inner = "something"; - │ ----- also defined here - · -6 │ inner = "something"; - │ ^^^^^ duplicate property - diff --git a/libs/config/tests/errors/ce9_duplicate_class/source.hpp b/libs/config/tests/errors/ce9_duplicate_class/source.hpp new file mode 100644 index 00000000..426f7275 --- /dev/null +++ b/libs/config/tests/errors/ce9_duplicate_class/source.hpp @@ -0,0 +1,5 @@ +class CfgAmmo { + class BulletBase; + class MissileBase; + class MissileBase: BulletBase {}; +}; diff --git a/libs/config/tests/errors/ce9_duplicate_class/stdout.ansi b/libs/config/tests/errors/ce9_duplicate_class/stdout.ansi new file mode 100644 index 00000000..aaef13e2 --- /dev/null +++ b/libs/config/tests/errors/ce9_duplicate_class/stdout.ansi @@ -0,0 +1,10 @@ +error[CE9]: class defined multiple times + ┌─ source.hpp:3:11 + │ +3 │ class MissileBase; + │ ^^^^^^^^^^^ defined multiple times +4 │ class MissileBase: BulletBase {}; + │ ----------- also defined here + │ + = help: remove all but the first definition of `class MissileBase;` + diff --git a/libs/config/tests/errors/ce8_duplicate_external/source.hpp b/libs/config/tests/errors/ce9_duplicate_external/source.hpp similarity index 100% rename from libs/config/tests/errors/ce8_duplicate_external/source.hpp rename to libs/config/tests/errors/ce9_duplicate_external/source.hpp diff --git a/libs/config/tests/errors/ce8_duplicate_external/stdout.ansi b/libs/config/tests/errors/ce9_duplicate_external/stdout.ansi similarity index 85% rename from libs/config/tests/errors/ce8_duplicate_external/stdout.ansi rename to libs/config/tests/errors/ce9_duplicate_external/stdout.ansi index a9e5218f..aa1f5d90 100644 --- a/libs/config/tests/errors/ce8_duplicate_external/stdout.ansi +++ b/libs/config/tests/errors/ce9_duplicate_external/stdout.ansi @@ -1,4 +1,4 @@ -error[CE8]: external class defined multiple times +error[CE9]: class defined multiple times ┌─ source.hpp:2:11 │ 2 │ class BulletBase;