1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
use super::*; use crate::ast_util::range; use std::convert::Infallible; use full_moon::{ ast::{self, Ast}, visitors::Visitor, }; pub struct ParentheseConditionsLint; impl Rule for ParentheseConditionsLint { type Config = (); type Error = Infallible; fn new(_: Self::Config) -> Result<Self, Self::Error> { Ok(ParentheseConditionsLint) } fn pass(&self, ast: &Ast, _: &Context) -> Vec<Diagnostic> { let mut visitor = ParentheseConditionsVisitor { positions: Vec::new(), }; visitor.visit_ast(ast); visitor .positions .iter() .map(|position| { Diagnostic::new( "parenthese_conditions", "lua does not require parentheses around conditions".to_owned(), Label::new(*position), ) }) .collect() } fn severity(&self) -> Severity { Severity::Warning } fn rule_type(&self) -> RuleType { RuleType::Style } } struct ParentheseConditionsVisitor { positions: Vec<(usize, usize)>, } impl ParentheseConditionsVisitor { fn lint_condition(&mut self, condition: &ast::Expression) { let is_parentheses = match condition { ast::Expression::Parentheses { .. } => true, ast::Expression::Value { value, .. } => { matches!(&**value, ast::Value::ParenthesesExpression(_)) } _ => false, }; if is_parentheses { self.positions.push(range(condition)); } } } impl Visitor for ParentheseConditionsVisitor { fn visit_if(&mut self, node: &ast::If) { self.lint_condition(node.condition()); if let Some(else_ifs) = node.else_if() { for else_if in else_ifs { self.lint_condition(else_if.condition()); } } } fn visit_repeat(&mut self, node: &ast::Repeat) { self.lint_condition(node.until()); } fn visit_while(&mut self, node: &ast::While) { self.lint_condition(node.condition()); } } #[cfg(test)] mod tests { use super::{super::test_util::test_lint, *}; #[test] fn test_parenthese_conditions() { test_lint( ParentheseConditionsLint::new(()).unwrap(), "parenthese_conditions", "parenthese_conditions", ); } }