harper_core/linting/
somewhat_something.rs1use 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}