Change:
Each time I switch from programming in (TypeScript, rust) to programming in (C, C++, C#) or vice versa, I end up inevitably writing function parameters backwards. To me, the following message is obviously more than enough: as it brings to my attention the inverted signature parameters. However, it occurs to me that this might be an easy (albeit extremely low priority) win to make the compiler emit friendlier error messages for newcomers to rust. Perhaps this can be detected an a message along the lines of "did you mean instead?" could be emitted here.

Discussion:
require_name); let pat = self.parse_pat()?; <del> self.expect(&token::Colon)?; </del> <ins> if let Err(mut err) = self.expect(&token::Colon) { // If we find a pattern followed by an identifier, it could be an (incorrect) // C-style parameter declaration. if self.check_ident() && self.look_ahead(1, |t| { *t == token::Comma || *t == token::CloseDelim(token::Paren) }) { let ident = self.parse_ident().unwrap(); let span = pat.span.with_hi(ident.span.hi()); err.span_suggestion_with_applicability( span, "declare the type after the parameter binding", String::from("<identifier>: <type>"), Applicability::HasPlaceholders, ); } return Err(err); } </ins> (pat, self.parse_ty()?) } else { debug!("parse_arg_general ident_to_pat");

<ins> // Copyright 2018 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 S; impl S { fn foo(&self, &str bar) {} //~^ ERROR expected one of `:` or `@` //~| HELP declare the type after the parameter binding //~| SUGGESTION <identifier>: <type> } fn baz(S quux, xyzzy: i32) {} //~^ ERROR expected one of `:` or `@` //~| HELP declare the type after the parameter binding //~| SUGGESTION <identifier>: <type> fn one(i32 a b) {} //~^ ERROR expected one of `:` or `@` fn pattern((i32, i32) (a, b)) {} //~^ ERROR expected `:` fn fizz(i32) {} //~^ ERROR expected one of `:` or `@` fn missing_colon(quux S) {} //~^ ERROR expected one of `:` or `@` //~| HELP declare the type after the parameter binding //~| SUGGESTION <identifier>: <type> fn main() {} </ins>

<ins> error: expected one of `:` or `@`, found `bar` --> $DIR/inverted-parameters.rs:14:24 | LL |     fn foo(&self, &str bar) {} |                   -----^^^ |                   |    | |                   |    expected one of `:` or `@` here |                   help: declare the type after the parameter binding: `<identifier>: <type>` error: expected one of `:` or `@`, found `quux` --> $DIR/inverted-parameters.rs:20:10 | LL | fn baz(S quux, xyzzy: i32) {} |        --^^^^ |        | | |        | expected one of `:` or `@` here |        help: declare the type after the parameter binding: `<identifier>: <type>` error: expected one of `:` or `@`, found `a` --> $DIR/inverted-parameters.rs:25:12 | LL | fn one(i32 a b) {} |            ^ expected one of `:` or `@` here error: expected `:`, found `(` --> $DIR/inverted-parameters.rs:28:23 | LL | fn pattern((i32, i32) (a, b)) {} |                       ^ expected `:` error: expected one of `:` or `@`, found `)` --> $DIR/inverted-parameters.rs:31:12 | LL | fn fizz(i32) {} |            ^ expected one of `:` or `@` here error: expected one of `:` or `@`, found `S` --> $DIR/inverted-parameters.rs:34:23 | LL | fn missing_colon(quux S) {} |                  -----^ |                  |    | |                  |    expected one of `:` or `@` here |                  help: declare the type after the parameter binding: `<identifier>: <type>` error: aborting due to 6 previous errors </ins>