Skip to content

Commit 2e21f2e

Browse files
fix(analyser): recognize disabled rules (#438)
1 parent 1535b76 commit 2e21f2e

File tree

3 files changed

+78
-0
lines changed

3 files changed

+78
-0
lines changed

crates/pgt_configuration/src/analyser/linter/rules.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,14 @@ impl Rules {
121121
}
122122
enabled_rules.difference(&disabled_rules).copied().collect()
123123
}
124+
#[doc = r" It returns the disabled rules by configuration."]
125+
pub fn as_disabled_rules(&self) -> FxHashSet<RuleFilter<'static>> {
126+
let mut disabled_rules = FxHashSet::default();
127+
if let Some(group) = self.safety.as_ref() {
128+
disabled_rules.extend(&group.get_disabled_rules());
129+
}
130+
disabled_rules
131+
}
124132
}
125133
#[derive(Clone, Debug, Default, Deserialize, Eq, Merge, PartialEq, Serialize)]
126134
#[cfg_attr(feature = "schema", derive(JsonSchema))]

crates/pgt_workspace/src/workspace/server/analyser.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,14 +68,23 @@ impl<'a, 'b> LintVisitor<'a, 'b> {
6868

6969
fn finish(mut self) -> (FxHashSet<RuleFilter<'a>>, FxHashSet<RuleFilter<'a>>) {
7070
let has_only_filter = !self.only.is_empty();
71+
7172
if !has_only_filter {
7273
let enabled_rules = self
7374
.settings
7475
.as_linter_rules()
7576
.map(|rules| rules.as_enabled_rules())
7677
.unwrap_or_default();
7778
self.enabled_rules.extend(enabled_rules);
79+
80+
let disabled_rules = self
81+
.settings
82+
.as_linter_rules()
83+
.map(|rules| rules.as_disabled_rules())
84+
.unwrap_or_default();
85+
self.disabled_rules.extend(disabled_rules);
7886
}
87+
7988
(self.enabled_rules, self.disabled_rules)
8089
}
8190

@@ -127,3 +136,42 @@ impl RegistryVisitor for LintVisitor<'_, '_> {
127136
self.push_rule::<R>()
128137
}
129138
}
139+
140+
#[cfg(test)]
141+
mod tests {
142+
use pgt_analyse::RuleFilter;
143+
use pgt_configuration::{RuleConfiguration, Rules, analyser::Safety};
144+
145+
use crate::{
146+
settings::{LinterSettings, Settings},
147+
workspace::server::analyser::AnalyserVisitorBuilder,
148+
};
149+
150+
#[test]
151+
fn recognizes_disabled_rules() {
152+
let settings = Settings {
153+
linter: LinterSettings {
154+
rules: Some(Rules {
155+
safety: Some(Safety {
156+
ban_drop_column: Some(RuleConfiguration::Plain(
157+
pgt_configuration::RulePlainConfiguration::Off,
158+
)),
159+
..Default::default()
160+
}),
161+
..Default::default()
162+
}),
163+
..Default::default()
164+
},
165+
..Default::default()
166+
};
167+
168+
let (_, disabled_rules) = AnalyserVisitorBuilder::new(&settings)
169+
.with_linter_rules(&[], &[])
170+
.finish();
171+
172+
assert_eq!(
173+
disabled_rules,
174+
vec![RuleFilter::Rule("safety", "banDropColumn")]
175+
)
176+
}
177+
}

xtask/codegen/src/generate_configuration.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ fn generate_for_groups(
6161
let mut group_idents = Vec::with_capacity(groups.len());
6262
let mut group_strings = Vec::with_capacity(groups.len());
6363
let mut group_as_default_rules = Vec::with_capacity(groups.len());
64+
let mut group_as_disabled_rules = Vec::with_capacity(groups.len());
65+
6466
for (group, rules) in groups {
6567
let group_pascal_ident = quote::format_ident!("{}", &Case::Pascal.convert(group));
6668
let group_ident = quote::format_ident!("{}", group);
@@ -95,6 +97,12 @@ fn generate_for_groups(
9597
}
9698
});
9799

100+
group_as_disabled_rules.push(quote! {
101+
if let Some(group) = self.#group_ident.as_ref() {
102+
disabled_rules.extend(&group.get_disabled_rules());
103+
}
104+
});
105+
98106
group_pascal_idents.push(group_pascal_ident);
99107
group_idents.push(group_ident);
100108
group_strings.push(Literal::string(group));
@@ -246,6 +254,13 @@ fn generate_for_groups(
246254
#( #group_as_default_rules )*
247255
enabled_rules
248256
}
257+
258+
/// It returns the disabled rules by configuration.
259+
pub fn as_disabled_rules(&self) -> FxHashSet<RuleFilter<'static>> {
260+
let mut disabled_rules = FxHashSet::default();
261+
#( #group_as_disabled_rules )*
262+
disabled_rules
263+
}
249264
}
250265

251266
#( #struct_groups )*
@@ -358,6 +373,13 @@ fn generate_for_groups(
358373

359374
enabled_rules.difference(&disabled_rules).copied().collect()
360375
}
376+
377+
/// It returns the disabled rules by configuration.
378+
pub fn as_disabled_rules(&self) -> FxHashSet<RuleFilter<'static>> {
379+
let mut disabled_rules = FxHashSet::default();
380+
#( #group_as_disabled_rules )*
381+
disabled_rules
382+
}
361383
}
362384

363385
#( #struct_groups )*

0 commit comments

Comments
 (0)