harper_core/ignored_lints/
lint_context.rs1use std::hash::{DefaultHasher, Hash, Hasher};
2
3use serde::{Deserialize, Serialize};
4
5use crate::{
6 Document, FatToken,
7 linting::{Lint, LintKind, Suggestion},
8};
9
10#[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}