about summary refs log tree commit diff
path: root/src/test/compile-fail/numeric-fields.rs
diff options
context:
space:
mode:
authorZack M. Davis <code@zackmdavis.net>2017-07-23 13:46:09 -0700
committerZack M. Davis <code@zackmdavis.net>2017-07-23 14:38:09 -0700
commitbf7e91f61da8a5ca74c7d97f6f2bc978c0366256 (patch)
treee9a3b982e3e658e607a2f033b605749c8c43ccca /src/test/compile-fail/numeric-fields.rs
parent6270257f4ef6e65213631d6b5a2a85807b8b2364 (diff)
downloadrust-bf7e91f61da8a5ca74c7d97f6f2bc978c0366256.tar.gz
rust-bf7e91f61da8a5ca74c7d97f6f2bc978c0366256.zip
field does not exist error: note fields if Levenshtein suggestion fails
When trying to access or initialize a nonexistent field, if we can't infer what
field was meant (by virtue of the purported field in the source being a small
Levenshtein distance away from an actual field, suggestive of a typo), issue a
note listing all the available fields. To reduce terminal clutter, we don't
issue the note when we have a `find_best_match_for_name` Levenshtein
suggestion: the suggestion is probably right.

The third argument of the call to `find_best_match_for_name` is changed to
`None`, accepting the default maximum Levenshtein distance of one-third of the
identifier supplied for correction. The previous value of `Some(name.len())`
was overzealous, inappropriately very Levenshtein-distant suggestions when the
attempted field access could not plausibly be a mere typo. For example, if a
struct has fields `mule` and `phone`, but I type `.donkey`, I'd rather the
error have a note listing that the available fields are, in fact, `mule` and
`phone` (which is the behavior induced by this patch) rather than the error
asking "did you mean `phone`?" (which is the behavior on master). The "only
find fits with at least one matching letter" comment was accurate when it was
first introduced in 09d992471 (January 2015), but is a vicious lie in its
present context before a call to `find_best_match_for_name` and must be
destroyed (replacing every letter is a Levenshtein distance of name.len()).

The present author claims that this suffices to resolve #42599.
Diffstat (limited to 'src/test/compile-fail/numeric-fields.rs')
-rw-r--r--src/test/compile-fail/numeric-fields.rs3
1 files changed, 2 insertions, 1 deletions
diff --git a/src/test/compile-fail/numeric-fields.rs b/src/test/compile-fail/numeric-fields.rs
index 00fde3025a6..242c3a3a33d 100644
--- a/src/test/compile-fail/numeric-fields.rs
+++ b/src/test/compile-fail/numeric-fields.rs
@@ -13,7 +13,8 @@ struct S(u8, u16);
 fn main() {
     let s = S{0b1: 10, 0: 11};
     //~^ ERROR struct `S` has no field named `0b1`
-    //~| NOTE field does not exist - did you mean `1`?
+    //~| NOTE `S` does not have this field
+    //~| NOTE available fields are: 0, 1
     match s {
         S{0: a, 0x1: b, ..} => {}
         //~^ ERROR does not have a field named `0x1`