]> git.lizzy.rs Git - rust.git/commitdiff
refac Move levenchstein before context dependent check
authorFreyskeyd <simon.paitrault@gmail.com>
Tue, 18 Apr 2017 11:28:05 +0000 (13:28 +0200)
committerFreyskeyd <simon.paitrault@gmail.com>
Fri, 28 Apr 2017 18:40:11 +0000 (20:40 +0200)
Signed-off-by: Freyskeyd <simon.paitrault@gmail.com>
src/librustc_resolve/lib.rs
src/test/ui/resolve/issue-39226.rs [new file with mode: 0644]
src/test/ui/resolve/issue-39226.stderr [new file with mode: 0644]
src/test/ui/resolve/issue-5035.stderr
src/test/ui/resolve/privacy-struct-ctor.stderr
src/test/ui/resolve/suggest-path-instead-of-mod-dot-item.stderr
src/test/ui/resolve/tuple-struct-alias.stderr

index 6ba214f20f98d3b15ad4d603894231f283c40dd8..a4e9a8be49f4516670466e344e1898d62834a5da 100644 (file)
@@ -2312,6 +2312,14 @@ fn smart_resolve_path_fragment(&mut self,
                 }
             }
 
+            let mut levenshtein_worked = false;
+
+            // Try Levenshtein.
+            if let Some(candidate) = this.lookup_typo_candidate(path, ns, is_expected) {
+                err.span_label(ident_span, &format!("did you mean `{}`?", candidate));
+                levenshtein_worked = true;
+            }
+
             // Try context dependent help if relaxed lookup didn't work.
             if let Some(def) = def {
                 match (def, source) {
@@ -2354,14 +2362,10 @@ fn smart_resolve_path_fragment(&mut self,
                 }
             }
 
-            // Try Levenshtein if nothing else worked.
-            if let Some(candidate) = this.lookup_typo_candidate(path, ns, is_expected) {
-                err.span_label(ident_span, &format!("did you mean `{}`?", candidate));
-                return err;
-            }
-
             // Fallback label.
-            err.span_label(base_span, &fallback_label);
+            if !levenshtein_worked {
+                err.span_label(base_span, &fallback_label);
+            }
             err
         };
         let report_errors = |this: &mut Self, def: Option<Def>| {
diff --git a/src/test/ui/resolve/issue-39226.rs b/src/test/ui/resolve/issue-39226.rs
new file mode 100644 (file)
index 0000000..f290a74
--- /dev/null
@@ -0,0 +1,24 @@
+// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+struct Handle {}
+
+struct Something {
+    handle: Handle
+}
+
+fn main() {
+    let handle: Handle = Handle {};
+
+    let s: Something = Something {
+        handle: Handle
+        //~^ ERROR cannot find value `Handle` in this scope
+        //~| NOTE did you mean `handle`?
+    };
+}
diff --git a/src/test/ui/resolve/issue-39226.stderr b/src/test/ui/resolve/issue-39226.stderr
new file mode 100644 (file)
index 0000000..f6ee0b0
--- /dev/null
@@ -0,0 +1,11 @@
+error[E0423]: expected value, found struct `Handle`
+  --> $DIR/issue-39226.rs:20:17
+   |
+20 |         handle: Handle
+   |                 ^^^^^^
+   |                 |
+   |                 did you mean `handle`?
+   |                 did you mean `Handle { /* fields */ }`?
+
+error: aborting due to previous error
+
index 6cb9a28937980ea1055f112fd3fc88e9d707f7ab..19adecc7b4bd2212c9848cf996d70a9af4150316 100644 (file)
@@ -8,7 +8,10 @@ error[E0404]: expected trait, found type alias `K`
   --> $DIR/issue-5035.rs:13:6
    |
 13 | impl K for isize {} //~ ERROR expected trait, found type alias `K`
-   |      ^ type aliases cannot be used for traits
+   |      ^
+   |      |
+   |      type aliases cannot be used for traits
+   |      did you mean `I`?
 
 error: cannot continue compilation due to previous error
 
index 25afb6147e422d49fd6ff5163ce99076d2b0cb62..940e4acabb2c16b8016f45733a08a724e6b033c9 100644 (file)
@@ -5,6 +5,7 @@ error[E0423]: expected value, found struct `Z`
    |         ^
    |         |
    |         did you mean `Z { /* fields */ }`?
+   |         did you mean `S`?
    |         constructor is not visible here due to private fields
    |
    = help: possible better candidate is found in another module, you can import it into scope:
index 85fb1777dea233abf7e71dd53e577a29a7ba84b5..f254ad3d87d86ec8cd7368416c917f88606f1fb3 100644 (file)
@@ -26,8 +26,9 @@ error[E0423]: expected value, found module `a::b`
   --> $DIR/suggest-path-instead-of-mod-dot-item.rs:45:5
    |
 45 |     a::b.J
-   |     ^^^^--
-   |     |
+   |     ^^^---
+   |     |  |
+   |     |  did you mean `I`?
    |     did you mean `a::b::J`?
 
 error[E0423]: expected value, found module `a`
@@ -50,8 +51,9 @@ error[E0423]: expected value, found module `a::b`
   --> $DIR/suggest-path-instead-of-mod-dot-item.rs:61:5
    |
 61 |     a::b.f()
-   |     ^^^^----
-   |     |
+   |     ^^^-----
+   |     |  |
+   |     |  did you mean `I`?
    |     did you mean `a::b::f(...)`?
 
 error[E0423]: expected value, found module `a::b`
index 485c8ebbaeb6b9c4e8dfa8a4da264a2861bc5404..e2ef8f0e568fcf4f47ca1ed331d22eb9fa5b6dbe 100644 (file)
@@ -14,13 +14,19 @@ error[E0423]: expected function, found type alias `A`
   --> $DIR/tuple-struct-alias.rs:24:13
    |
 24 |     let s = A(0, 1);
-   |             ^ did you mean `A { /* fields */ }`?
+   |             ^
+   |             |
+   |             did you mean `S`?
+   |             did you mean `A { /* fields */ }`?
 
 error[E0532]: expected tuple struct/variant, found type alias `A`
   --> $DIR/tuple-struct-alias.rs:26:9
    |
 26 |         A(..) => {}
-   |         ^ did you mean `A { /* fields */ }`?
+   |         ^
+   |         |
+   |         did you mean `S`?
+   |         did you mean `A { /* fields */ }`?
 
 error: aborting due to 4 previous errors