harper_core/ignored_lints/
lint_context.rs

1use std::hash::{DefaultHasher, Hash, Hasher};
2
3use serde::{Deserialize, Serialize};
4
5use crate::{
6    Document, FatToken,
7    linting::{Lint, LintKind, Suggestion},
8};
9
10/// A location-agnostic structure that attempts to captures the context and content that a [`Lint`]
11/// occurred.
12#[derive(Debug, Hash, Serialize, Deserialize)]
13pub struct LintContext {
14    pub lint_kind: LintKind,
15    pub suggestions: Vec<Suggestion>,
16    pub message: String,
17    pub priority: u8,
18    pub tokens: Vec<FatToken>,
19}
20
21impl LintContext {
22    pub fn from_lint(lint: &Lint, document: &Document) -> Self {
23        let Lint {
24            lint_kind,
25            suggestions,
26            message,
27            priority,
28            ..
29        } = lint.clone();
30
31        let problem_tokens = document.token_indices_intersecting(lint.span);
32        let prequel_tokens = lint
33            .span
34            .with_len(2)
35            .pulled_by(2)
36            .map(|v| document.token_indices_intersecting(v))
37            .unwrap_or_default();
38        let sequel_tokens = document.token_indices_intersecting(lint.span.with_len(2).pushed_by(2));
39
40        let tokens = prequel_tokens
41            .into_iter()
42            .chain(problem_tokens)
43            .chain(sequel_tokens)
44            .flat_map(|idx| document.get_token(idx))
45            .map(|t| t.to_fat(document.get_source()))
46            .collect();
47
48        Self {
49            lint_kind,
50            suggestions,
51            message,
52            priority,
53            tokens,
54        }
55    }
56
57    pub fn default_hash(&self) -> u64 {
58        let mut hasher = DefaultHasher::default();
59        self.hash(&mut hasher);
60
61        hasher.finish()
62    }
63}