Skip to content

Suggest importable type that differs only in capitalization #72641

Open
@dtolnay

Description

@dtolnay
Member
struct S {
    m: Hashmap<String, ()>,
}
error[E0412]: cannot find type `Hashmap` in this scope
 --> src/main.rs:2:8
  |
2 |     m: Hashmap<String, ()>,
  |        ^^^^^^^ not found in this scope

If the code had been written with HashMap instead of Hashmap, we would get the following extremely likely correct suggestion:

error[E0412]: cannot find type `HashMap` in this scope
 --> src/main.rs:2:8
  |
2 |     m: HashMap<String, ()>,
  |        ^^^^^^^ not found in this scope
  |
help: consider importing one of these items
  |
1 | use std::collections::HashMap;
  |
1 | use std::collections::hash_map::HashMap;
  |

Hashmap is a fairly common capitalization in other languages (https://grep.app/search?q=Hashmap&case=true) so it would be good to provide an appropriate suggestion in this case.

(For whatever reason this doesn't trigger #72640.)

Activity

added
C-enhancementCategory: An issue proposing an enhancement or a PR with one.
A-diagnosticsArea: Messages for errors, warnings, and lints
T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.
on May 27, 2020
added
A-suggestion-diagnosticsArea: Suggestions generated by the compiler applied by `cargo fix`
D-papercutDiagnostics: An error or lint that needs small tweaks.
on May 28, 2020
chrissimpkins

chrissimpkins commented on May 30, 2020

@chrissimpkins
Member

@rustbot claim

chrissimpkins

chrissimpkins commented on May 30, 2020

@chrissimpkins
Member

Here is where I am with the error message and suggestion in a case-insensitive match:

error[E0412]: cannot find type `Hashmap` in this scope
 --> src/lib.rs:2:8
  |
2 |     m: Hashmap<String, ()>,
  |        ^^^^^^^ not found in this scope
  |
help: did you mean `std::collections::HashMap`?
  |
2 |     m: std::collections::HashMap<String, ()>,
  |        ^^^^^^^^^^^^^^^^^^^^^^^^^

error: aborting due to previous error

Thoughts about broadening to more libstd types? IIUC, under the conditions: (1) not explicitly brought into scope; (2) not defined in the Rust prelude; (3) not a primitive type, misspelled std lib types result in the "not found in this scope" message with no suggestion.

chrissimpkins

chrissimpkins commented on Jun 4, 2020

@chrissimpkins
Member
estebank

estebank commented on Jun 13, 2020

@estebank
Contributor

For whatever reason this doesn't trigger #72640.

We explicitly keep track of whether we are looking at a path's generics in field currently_processing_generics and only suggest adding a new type param then that is the case. I believe my original thinking was that the likelihood of it being a reasonable suggestion increased in that case. Also, looking at the diff for the original PR introducing this there are cases like type Output = Option<Foo>;, where if we triggered for type Output = Foo; we would be suggesting type Output<Foo> = Foo; which is nonsensical. If by experience you feel we should suggest in the case of struct S(Foo);, then I can change this.

I think I've addressed this aside in a reasonable way in #73320:

Screen Shot 2020-06-13 at 11 25 24 AM

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-diagnosticsArea: Messages for errors, warnings, and lintsA-suggestion-diagnosticsArea: Suggestions generated by the compiler applied by `cargo fix`C-enhancementCategory: An issue proposing an enhancement or a PR with one.D-papercutDiagnostics: An error or lint that needs small tweaks.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      Participants

      @estebank@dtolnay@chrissimpkins

      Issue actions

        Suggest importable type that differs only in capitalization · Issue #72641 · rust-lang/rust