Only suggest paths that exist.
In order to output a path that could actually be imported (valid and visible), we need to handle re-exports correctly. For example, take `std::os::unix::process::CommandExt`, this trait is actually defined at `std::sys::unix::ext::process::CommandExt` (at time of writing). `std::os::unix` rexports the contents of `std::sys::unix::ext`. `std::sys` is private so the "true" path to `CommandExt` isn't accessible. In this case, the visible parent map will look something like this: (child) -> (parent) `std::sys::unix::ext::process::CommandExt` -> `std::sys::unix::ext::process` `std::sys::unix::ext::process` -> `std::sys::unix::ext` `std::sys::unix::ext` -> `std::os` This is correct, as the visible parent of `std::sys::unix::ext` is in fact `std::os`. When printing the path to `CommandExt` and looking at the current segment that corresponds to `std::sys::unix::ext`, we would normally print `ext` and then go to the parent - resulting in a mangled path like `std::os::ext::process::CommandExt`. Instead, we must detect that there was a re-export and instead print `unix` (which is the name `std::sys::unix::ext` was re-exported as in `std::os`).
This commit is contained in:
parent
b8b4150c04
commit
4334aaacf1
3 changed files with 104 additions and 10 deletions
25
src/test/ui/issues/issue-39175.rs
Normal file
25
src/test/ui/issues/issue-39175.rs
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
// 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.
|
||||
|
||||
// This test ignores some platforms as the particular extension trait used
|
||||
// to demonstrate the issue is only available on unix. This is fine as
|
||||
// the fix to suggested paths is not platform-dependent and will apply on
|
||||
// these platforms also.
|
||||
|
||||
// ignore-windows
|
||||
// ignore-cloudabi
|
||||
// ignore-emscripten
|
||||
|
||||
use std::process::Command;
|
||||
// use std::os::unix::process::CommandExt;
|
||||
|
||||
fn main() {
|
||||
Command::new("echo").arg("hello").exec();
|
||||
}
|
||||
15
src/test/ui/issues/issue-39175.stderr
Normal file
15
src/test/ui/issues/issue-39175.stderr
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
error[E0599]: no method named `exec` found for type `&mut std::process::Command` in the current scope
|
||||
--> $DIR/issue-39175.rs:24:39
|
||||
|
|
||||
LL | Command::new("echo").arg("hello").exec();
|
||||
| ^^^^
|
||||
|
|
||||
= help: items from traits can only be used if the trait is in scope
|
||||
help: the following trait is implemented but not in scope, perhaps add a `use` for it:
|
||||
|
|
||||
LL | use std::os::unix::process::CommandExt;
|
||||
|
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0599`.
|
||||
Loading…
Add table
Add a link
Reference in a new issue