]> git.lizzy.rs Git - rust.git/commitdiff
WIP: don't suggest placing `use` statements into expanded code
authorOliver Schneider <git-spam-no-reply9815368754983@oli-obk.de>
Thu, 31 Aug 2017 13:45:16 +0000 (15:45 +0200)
committerOliver Schneider <git-spam-no-reply9815368754983@oli-obk.de>
Thu, 31 Aug 2017 13:45:16 +0000 (15:45 +0200)
src/librustc_resolve/lib.rs
src/test/ui/resolve/privacy-struct-ctor.stderr
src/test/ui/resolve/use_suggestion_placement.stderr
src/test/ui/span/issue-35987.stderr

index 2183c9124e7f4367d9390f7651d63dda95b48332..88e092a1684ae83fd56937226a77e3e6d4db0635 100644 (file)
@@ -605,7 +605,7 @@ fn visit_mod(
                 ItemKind::Use(..) => {
                     // don't suggest placing a use before the prelude
                     // import or other generated ones
-                    if item.span == DUMMY_SP {
+                    if item.span.ctxt().outer().expn_info().is_none() {
                         self.span = Some(item.span.with_hi(item.span.lo()));
                         self.found_use = true;
                         return;
@@ -615,7 +615,19 @@ fn visit_mod(
                 ItemKind::ExternCrate(_) => {}
                 // but place them before the first other item
                 _ => if self.span.map_or(true, |span| item.span < span ) {
-                    self.span = Some(item.span.with_hi(item.span.lo()));
+                    if item.span.ctxt().outer().expn_info().is_none() {
+                        // don't insert between attributes and an item
+                        if item.attrs.is_empty() {
+                            self.span = Some(item.span.with_hi(item.span.lo()));
+                        } else {
+                            // find the first attribute on the item
+                            for attr in &item.attrs {
+                                if self.span.map_or(true, |span| attr.span < span) {
+                                    self.span = Some(attr.span.with_hi(attr.span.lo()));
+                                }
+                            }
+                        }
+                    }
                 },
             }
         }
index ee1481ec6f2b0087d4964dac21d037bfbf26950b..f7e5c602644cfa0a8bb5c431309fba9d2b55ffe7 100644 (file)
@@ -10,7 +10,7 @@ error[E0423]: expected value, found struct `Z`
    |
 help: possible better candidate is found in another module, you can import it into scope
    |
-16 |     use m::n::Z;
+22 |     use m::n::Z;
    |
 
 error[E0423]: expected value, found struct `S`
@@ -24,7 +24,7 @@ error[E0423]: expected value, found struct `S`
    |
 help: possible better candidate is found in another module, you can import it into scope
    |
-15 | use m::S;
+32 | use m::S;
    |
 
 error[E0423]: expected value, found struct `xcrate::S`
@@ -38,7 +38,7 @@ error[E0423]: expected value, found struct `xcrate::S`
    |
 help: possible better candidate is found in another module, you can import it into scope
    |
-15 | use m::S;
+32 | use m::S;
    |
 
 error[E0603]: tuple struct `Z` is private
index d9c0528addb5ebbf94219942551584995f84e1ea..8a4dfdc80276af7537806d0a483c933ff3768ff1 100644 (file)
@@ -6,7 +6,7 @@ error[E0412]: cannot find type `Path` in this scope
    |
 help: possible candidate is found in another module, you can import it into scope
    |
-20 |     #[derive(use std::path::Path;
+21 |     use std::path::Path;
    |
 
 error[E0425]: cannot find value `A` in this scope
index 0cd7e1046f6ccc3010f997457b33c52b220a1b25..b57b58e3d2a6da52efbb5841837075457ed5602f 100644 (file)
@@ -6,7 +6,7 @@ error[E0404]: expected trait, found type parameter `Add`
    |
 help: possible better candidate is found in another module, you can import it into scope
    |
-11 | use std::ops::Add;
+13 | use std::ops::Add;
    |
 
 error[E0601]: main function not found