use crate::{
Lint, Token, TokenStringExt,
expr::{Expr, SequenceExpr},
linting::{ExprLinter, LintKind, Suggestion, debug::format_lint_match, expr_linter::Chunk},
};
pub struct ExprLinterSkeleton {
expr: SequenceExpr,
}
impl Default for ExprLinterSkeleton {
fn default() -> Self {
Self {
expr: SequenceExpr::any_capitalization_of("erorr"),
}
}
}
impl ExprLinter for ExprLinterSkeleton {
type Unit = Chunk;
fn match_to_lint_with_context(
&self,
matched_tokens: &[Token],
source: &[char],
context: Option<(&[Token], &[Token])>,
) -> Option<Lint> {
eprintln!("🚨 {}", format_lint_match(matched_tokens, context, source));
let span = matched_tokens.span()?;
let lint_kind = LintKind::Miscellaneous;
let suggestions = vec![Suggestion::replace_with_match_case_str(
"correction",
span.get_content(source),
)];
let message = "Fix this erorr".to_string();
Some(Lint {
span,
lint_kind,
suggestions,
message,
..Default::default()
})
}
fn expr(&self) -> &dyn Expr {
&self.expr
}
fn description(&self) -> &str {
"A linter skeleton for contributors to copy into `harper_core/src/linting/` and rename."
}
}
#[cfg(test)]
mod tests {
use crate::linting::tests::assert_suggestion_result;
use super::ExprLinterSkeleton;
#[test]
fn test_skeleton() {
assert_suggestion_result("erorr", ExprLinterSkeleton::default(), "correction");
}
}