Repository: rust
Issue: Build errors with edition=2018 after clean `cargo fix --edition`
Labels: C-bug,F-rust_2018_preview,S-needs-repro,A-edition-2018

With `nightly-2018-11-01` in Servo, after finally getting `cargo fix --edition` to complete without warnings. (Which was not easy: https://github.com/rust-lang-nursery/rustfix/issues/149, https://github.com/rust-lang-nursery/rustfix/issues/150), I added `edition = "2018"` to (almost) all `Cargo.toml` files.

At this point, the theory is that `cargo check` should Just Work, but it doesn’t. I’ve hit multiple issues, let me know if they should be filed separately.

## Dependencies not known to Cargo

```rust
error[E0658]: use of extern prelude names introduced with `extern crate` items is unstable (see issue #54658)          
  --> components/dom_struct/lib.rs:11:5                                                                                
   |                                                                                                                   
11 | use proc_macro::TokenStream;                                                                                      
   |     ^^^^^^^^^^                                                                                                    
   |                                                                                                                   
   = help: add #![feature(extern_crate_item_prelude)] to the crate attributes to enable  
```

The "extern prelude" is one way to fix this, but another is to is a crate-local path `crate::proc_macro::TokenStream` to the name that is introduced by `extern crate`.

This feature is also missing a tracking issue, the error message points to the implementation PR: https://github.com/rust-lang/rust/pull/54658#issuecomment-435156630

## Ambiguous imports

```rust
error: `time` import is ambiguous                                                                                      
  --> components/compositing/compositor.rs:41:5                                                                        
   |                                                                                                                   
23 | use profile_traits::time::{self, ProfilerCategory, profile};                                                      
   |                            ---- may refer to `self::time` in the future                                           
...                                                                                                                    
41 | use time::{now, precise_time_ns, precise_time_s};                                                                 
   |     ^^^^ can refer to external crate `::time`                                                                     
   |                                                                                                                   
   = help: write `::time` or `self::time` explicitly instead                                                           
   = note: in the future, `#![feature(uniform_paths)]` may become the default                                          
                                                                                                                       
error: aborting due to previous error  
```

## Migrating generated code

`cargo fix` did fix similar cases in "normal" source files, but generated code needs to be fixed in the code generator.

These were the remaining ones after I’d already taken care of the absolute paths.

```rust
error: expected expression, found reserved keyword `try`                                                               
   --> /home/simon/servo2/target/debug/build/script-b336041ffdaa5d29/out/Bindings/AnalyserNodeBinding.rs:291:23        
    |                                                                                                                  
291 |                 match try!(crate::dom::bindings::codegen::Bindings::AudioNodeBinding::AudioNodeOptions::new(cx, val)) {
    |                       ^^^ expected expression                                                                    
       
```

```rust
error: expected pattern, found reserved keyword `async`                                                                
    --> /home/simon/servo2/target/debug/build/script-b336041ffdaa5d29/out/Bindings/XMLHttpRequestBinding.rs:1766:57    
     |                                                                                                                 
1766 |     fn Open_(&self, method: ByteString, url: USVString, async: bool, username: Option<USVString>, password: Option<USVString>) -> Fallible<()>;
     |                                                         ^^^^^ expected pattern                                  
                                                                                                                       
error: aborting due to previous error    
```

## New warnings

Not as much of an issue than build errors, but slightly unexpected: switching editions uncovered new `unused_mut` warnings that were not present before. Maybe this is because 2018 currently implies NLL / MIR-borrowck?