Skip to content

Commit 577be95

Browse files
committed
fix(linter): delay merging of oxlintrc configs
1 parent f1e71af commit 577be95

File tree

2 files changed

+61
-1
lines changed

2 files changed

+61
-1
lines changed

crates/oxc_linter/src/config/categories.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
use std::{borrow::Cow, ops::Deref};
1+
use std::{
2+
borrow::Cow,
3+
ops::{Deref, DerefMut},
4+
};
25

36
use rustc_hash::FxHashMap;
47
use schemars::JsonSchema;
@@ -18,6 +21,12 @@ impl Deref for OxlintCategories {
1821
}
1922
}
2023

24+
impl DerefMut for OxlintCategories {
25+
fn deref_mut(&mut self) -> &mut Self::Target {
26+
&mut self.0
27+
}
28+
}
29+
2130
impl OxlintCategories {
2231
pub fn filters(&self) -> impl Iterator<Item = LintFilter> + '_ {
2332
self.iter().map(|(category, severity)| LintFilter::new(*severity, *category).unwrap())

crates/oxc_linter/src/config/oxlintrc.rs

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use std::{
33
path::{Path, PathBuf},
44
};
55

6+
use rustc_hash::FxHashMap;
67
use schemars::JsonSchema;
78
use serde::{Deserialize, Serialize};
89

@@ -141,6 +142,56 @@ impl Oxlintrc {
141142

142143
Ok(config)
143144
}
145+
146+
/// Merges two [Oxlintrc] files together
147+
/// [Self] takes priority over `other`
148+
#[must_use]
149+
pub fn merge(&self, other: Oxlintrc) -> Oxlintrc {
150+
let mut categories = other.categories.clone();
151+
categories.extend(self.categories.iter());
152+
153+
let rules = self
154+
.rules
155+
.rules
156+
.iter()
157+
.chain(&other.rules.rules)
158+
.fold(FxHashMap::default(), |mut rules_set, rule| {
159+
if rules_set.contains_key(&(&rule.plugin_name, &rule.rule_name)) {
160+
return rules_set;
161+
}
162+
rules_set.insert((&rule.plugin_name, &rule.rule_name), rule);
163+
rules_set
164+
})
165+
.values()
166+
.map(|rule| (**rule).clone())
167+
.collect::<Vec<_>>();
168+
169+
let settings = self.settings.clone();
170+
let env = self.env.clone();
171+
let globals = self.globals.clone();
172+
173+
let mut overrides = self.overrides.clone();
174+
overrides.extend(other.overrides);
175+
176+
Oxlintrc {
177+
plugins: other.plugins.union(self.plugins),
178+
categories,
179+
rules: OxlintRules::new(rules),
180+
settings,
181+
env,
182+
globals,
183+
overrides,
184+
path: self.path.clone(),
185+
ignore_patterns: self
186+
.ignore_patterns
187+
.clone()
188+
.iter()
189+
.chain(&other.ignore_patterns)
190+
.map(std::string::ToString::to_string)
191+
.collect::<Vec<_>>(),
192+
extends: self.extends.clone(),
193+
}
194+
}
144195
}
145196

146197
fn is_json_ext(ext: &str) -> bool {

0 commit comments

Comments
 (0)