// see also https://github.com/rust-lang/rust/issues/22692 type Alias = Vec; mod foo { fn bar() {} } fn main() { let _ = String.new(); //~^ ERROR expected value, found struct `String` //~| HELP use the path separator let _ = String.default; //~^ ERROR expected value, found struct `String` //~| HELP use the path separator let _ = Vec::<()>.with_capacity(1); //~^ ERROR expected value, found struct `Vec` //~| HELP use the path separator let _ = Alias.new(); //~^ ERROR expected value, found type alias `Alias` //~| HELP use the path separator let _ = Alias.default; //~^ ERROR expected value, found type alias `Alias` //~| HELP use the path separator let _ = foo.bar; //~^ ERROR expected value, found module `foo` //~| HELP use the path separator } macro_rules! Type { () => { ::std::cell::Cell //~^ ERROR expected value, found struct `std::cell::Cell` //~| ERROR expected value, found struct `std::cell::Cell` //~| ERROR expected value, found struct `std::cell::Cell` }; (alias) => { Alias //~^ ERROR expected value, found type alias `Alias` //~| ERROR expected value, found type alias `Alias` //~| ERROR expected value, found type alias `Alias` }; } macro_rules! create { (type method) => { Vec.new() //~^ ERROR expected value, found struct `Vec` //~| HELP use the path separator }; (type field) => { Vec.new //~^ ERROR expected value, found struct `Vec` //~| HELP use the path separator }; (macro method) => { Type!().new(0) //~^ HELP use the path separator }; (macro method alias) => { Type!(alias).new(0) //~^ HELP use the path separator }; } macro_rules! check_ty { ($Ty:ident) => { $Ty.foo //~^ ERROR expected value, found type alias `Alias` //~| HELP use the path separator }; } macro_rules! check_ident { ($Ident:ident) => { Alias.$Ident //~^ ERROR expected value, found type alias `Alias` //~| HELP use the path separator }; } macro_rules! check_ty_ident { ($Ty:ident, $Ident:ident) => { $Ty.$Ident //~^ ERROR expected value, found type alias `Alias` //~| HELP use the path separator }; } fn interaction_with_macros() { // // Verify that we do not only suggest to replace `.` with `::` if the receiver is a // macro call but that we also correctly suggest to surround it with angle brackets. // Type!().get(); //~^ HELP use the path separator Type! {}.get; //~^ HELP use the path separator Type!(alias).get(); //~^ HELP use the path separator Type! {alias}.get; //~^ HELP use the path separator // // Ensure that the suggestion is shown for expressions inside of macro definitions. // let _ = create!(type method); let _ = create!(type field); let _ = create!(macro method); let _ = create!(macro method alias); let _ = check_ty!(Alias); let _ = check_ident!(foo); let _ = check_ty_ident!(Alias, foo); }