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
use crate::cop::register_node_handler;
use crate::source;
use crate::types;

const MSG: &str = "When defining the %OPT% operator, name its argument `other`.";
const METHODS: [&str; 9] = ["+", "-", "[]", "[]=", "<<", "===", "=~", "eql?", "equal?"];

static COP_NAME: &str = "Naming/BinaryOperatorParameterName";

pub fn init() {
    register_node_handler("def", COP_NAME, on_def);
}

pub fn on_def(node: &types::Node, file: &source::File) {
    if let types::Node::Def(node) = node {
        if METHODS.contains(&node.name.as_str()) {
            if let Some(args) = &node.args {
                if let types::Node::Args(args) = &**args {
                    let args = &args.args;
                    if args.len() == 1 {
                        if let types::Node::Arg(arg) = args.first().unwrap() {
                            if arg.name != "other" {
                                file.add_offense(COP_NAME, arg.expression_l, MSG);
                            }
                        }
                    }
                }
            }
        }
    }
}