@@ -220,6 +220,7 @@ impl Config {
220220 if * severity == AllowWarnDeny :: Allow {
221221 rules. remove ( rule) ;
222222 } else {
223+ let _ = rules. remove ( rule) ;
223224 rules. insert ( rule. clone ( ) , * severity) ;
224225 }
225226 }
@@ -342,7 +343,10 @@ impl ConfigStore {
342343
343344#[ cfg( test) ]
344345mod test {
346+ use std:: str:: FromStr ;
347+
345348 use rustc_hash:: { FxHashMap , FxHashSet } ;
349+ use serde_json:: Value ;
346350
347351 use super :: { ConfigStore , ResolvedOxlintOverrides } ;
348352 use crate :: {
@@ -354,6 +358,7 @@ mod test {
354358 config_store:: { Config , ResolvedOxlintOverride , ResolvedOxlintOverrideRules } ,
355359 overrides:: GlobSet ,
356360 } ,
361+ rule:: Rule ,
357362 rules:: { EslintNoUnusedVars , ReactJsxFilenameExtension , TypescriptNoExplicitAny } ,
358363 } ;
359364
@@ -872,6 +877,68 @@ mod test {
872877 assert ! ( has_react_rules, "React rules should be enabled by categories for new plugin" ) ;
873878 }
874879
880+ #[ test]
881+ fn test_rule_config_override_replaces_properly ( ) {
882+ let base_rules = vec ! [ (
883+ RuleEnum :: EslintNoUnusedVars ( EslintNoUnusedVars :: default ( ) ) ,
884+ AllowWarnDeny :: Deny ,
885+ ) ] ;
886+ let override_rule =
887+ EslintNoUnusedVars :: from_configuration ( Value :: from_str ( r#"["local"]"# ) . unwrap ( ) ) ;
888+ let overrides = ResolvedOxlintOverrides :: new ( vec ! [ ResolvedOxlintOverride {
889+ env: None ,
890+ files: GlobSet :: new( vec![ "*.tsx" ] ) ,
891+ plugins: None ,
892+ globals: None ,
893+ rules: ResolvedOxlintOverrideRules {
894+ builtin_rules: vec![ (
895+ RuleEnum :: EslintNoUnusedVars ( override_rule) ,
896+ AllowWarnDeny :: Deny ,
897+ ) ] ,
898+ external_rules: vec![ ] ,
899+ } ,
900+ } ] ) ;
901+
902+ let store = ConfigStore :: new (
903+ Config :: new (
904+ base_rules. clone ( ) ,
905+ vec ! [ ] ,
906+ OxlintCategories :: default ( ) ,
907+ LintConfig :: default ( ) ,
908+ overrides,
909+ ) ,
910+ FxHashMap :: default ( ) ,
911+ ExternalPluginStore :: default ( ) ,
912+ ) ;
913+
914+ assert ! (
915+ format!( "{:?}" , base_rules[ 0 ] . 0 )
916+ == format!(
917+ "{:?}" ,
918+ store
919+ . resolve( "app.ts" . as_ref( ) )
920+ . rules
921+ . iter( )
922+ . find( |( rule, _) | matches!( rule, RuleEnum :: EslintNoUnusedVars ( _) ) )
923+ . unwrap( )
924+ . 0
925+ )
926+ ) ;
927+ assert ! (
928+ format!( "{:?}" , base_rules[ 0 ] . 0 )
929+ != format!(
930+ "{:?}" ,
931+ store
932+ . resolve( "app.tsx" . as_ref( ) )
933+ . rules
934+ . iter( )
935+ . find( |( rule, _) | matches!( rule, RuleEnum :: EslintNoUnusedVars ( _) ) )
936+ . unwrap( )
937+ . 0
938+ )
939+ ) ;
940+ }
941+
875942 #[ test]
876943 fn test_categories_not_reapplied_to_root_plugins ( ) {
877944 // Test that categories are NOT re-applied to plugins that were already in root
0 commit comments