rust-clippy icon indicating copy to clipboard operation
rust-clippy copied to clipboard

[`similar_names`]: Configuration option to whitelist specific names

Open Centri3 opened this issue 2 years ago • 3 comments

Description

Currently, similar_names will lint on code like

fn awa(tcx: TyCtxt<'_>) {
	let ocx = { ... };
}

Which is something I ran into on #10891. IMO, tcx and ocx are short enough that you can tell them apart. Despite this, simply setting a minimum length isn't desirable; What about lli and lll? Therefore, I think this lint should have a configuration option that is by default empty that allows specific names.

@rustbot claim

Version

No response

Additional Labels

@rustbot label +C-enhancement

Centri3 avatar Jun 11 '23 09:06 Centri3

Just ran into this as well with msb and lsb.

There is a hardcoded list of "names that are allowed to be similar". This list could be added to, but I can imagine many scenarios where using some similar domain-specific acronyms would make the most sense. I agree this should be configurable

eloc3147 avatar Jul 12 '23 20:07 eloc3147

Maybe an easy refinement rule is to skip this check if the first letters are visually different. That would cover the txc/ocx, msb/lsb, slen/dlen cases, and I think probably a good number of other cases that exist. A list would also be nice, but I think that clippy could probably be a bit smarter here.

A slightly more complex but more general algorithm that could make sense is something like:

fn raise_similar_lint(mut a: &str, mut b: &str) -> bool {
    // comparing identifiers a and b
    
    // commonize similar looking characters, e.g. l->i, 1->i, 5->s
    // from here on out, we are comparing visual difference
    a = replace_similar(a)
    b = replace_similar(b)
    
    // If the first characters are visually different, call it good
    if a[0] != b[0] {
        return false;
    }
   
    let lev = levenshtein(a, b);

    // If the difference is large relative to the string's length, call it OK. 
    // This means that `abb` and `abc` are ok, but `abbbb` and `abbbc` are not
    lev * 4 < a.len()
}

tgross35 avatar Oct 02 '23 09:10 tgross35

I did part of my above suggestion in https://github.com/rust-lang/rust-clippy/pull/12258. Not raising this lint if the first letter is different removes almost all of the cases I run into.

Doing something with replacing and then levenshtein is probably still more accurate yet, but this is a good start.

tgross35 avatar Feb 10 '24 05:02 tgross35

req/res are another example of a common identifier pair when remote calls are involved. They don't differ in the first letter. Having some way to configure the list of exceptions would be helpful.

demurgos avatar Jun 03 '24 14:06 demurgos