use crate::{make, Metadata, Report, Rule, Suggestion}; use if_chain::if_chain; use macros::lint; use rnix::{ types::{Ident, KeyValue, TokenWrapper, TypedNode}, NodeOrToken, SyntaxElement, SyntaxKind, }; #[lint( name = "manual inherit", note = "Assignment instead of inherit", code = 3, match_with = SyntaxKind::NODE_KEY_VALUE )] struct ManualInherit; impl Rule for ManualInherit { fn validate(&self, node: &SyntaxElement) -> Option { if_chain! { if let NodeOrToken::Node(node) = node; if let Some(key_value_stmt) = KeyValue::cast(node.clone()); if let mut key_path = key_value_stmt.key()?.path(); if let Some(key_node) = key_path.next(); // ensure that path has exactly one component if key_path.next().is_none(); if let Some(key) = Ident::cast(key_node); if let Some(value_node) = key_value_stmt.value(); if let Some(value) = Ident::cast(value_node); if key.as_str() == value.as_str(); then { let at = node.text_range(); let replacement = make::inherit_stmt(&[key]).node().clone(); let message = "This assignment is better written with `inherit`"; Some(self.report().suggest(at, message, Suggestion::new(at, replacement))) } else { None } } } }