harper_core/linting/
somewhat_something.rs

1use crate::{
2    Token,
3    patterns::{Pattern, SequencePattern},
4};
5
6use super::{Lint, LintKind, PatternLinter, Suggestion};
7
8pub struct SomewhatSomething {
9    pattern: Box<dyn Pattern>,
10}
11
12impl Default for SomewhatSomething {
13    fn default() -> Self {
14        let pattern = SequencePattern::aco("somewhat")
15            .then_whitespace()
16            .t_aco("of")
17            .then_whitespace()
18            .t_aco("a");
19
20        Self {
21            pattern: Box::new(pattern),
22        }
23    }
24}
25
26impl PatternLinter for SomewhatSomething {
27    fn pattern(&self) -> &dyn Pattern {
28        self.pattern.as_ref()
29    }
30
31    fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option<Lint> {
32        let span = matched_tokens.first()?.span;
33        let og = span.get_content(source);
34
35        Some(Lint {
36            span,
37            lint_kind: LintKind::Style,
38            suggestions: vec![Suggestion::replace_with_match_case_str("something", og)],
39            message: "Use the traditional form.".to_owned(),
40            priority: 63,
41        })
42    }
43
44    fn description(&self) -> &'static str {
45        "When describing a single instance of a noun, use `something` rather than `somewhat`."
46    }
47}
48
49#[cfg(test)]
50mod tests {
51    use crate::linting::tests::assert_suggestion_result;
52
53    use super::SomewhatSomething;
54
55    #[test]
56    fn issue_414() {
57        assert_suggestion_result(
58            "This may be somewhat of a surprise.",
59            SomewhatSomething::default(),
60            "This may be something of a surprise.",
61        );
62    }
63}