Skip to content

Commit

Permalink
Auto merge of #64739 - guanqun:remove-as-str, r=estebank
Browse files Browse the repository at this point in the history
Remove as_str if the type is already &str

Fix #62642

r? @estebank

do you think the suggestion tip is good enough?
  • Loading branch information
bors committed Oct 7, 2019
2 parents 4ac4809 + 11c2d43 commit f92f3c4
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 1 deletion.
4 changes: 4 additions & 0 deletions src/librustc/ty/sty.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1775,6 +1775,10 @@ impl<'tcx> TyS<'tcx> {
#[inline]
pub fn is_bool(&self) -> bool { self.kind == Bool }

/// Returns `true` if this type is a `str`.
#[inline]
pub fn is_str(&self) -> bool { self.kind == Str }

#[inline]
pub fn is_param(&self, index: u32) -> bool {
match self.kind {
Expand Down
9 changes: 8 additions & 1 deletion src/librustc_typeck/check/method/suggest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -518,7 +518,14 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
}
}

if let Some(lev_candidate) = lev_candidate {
if item_name.as_str() == "as_str" && actual.peel_refs().is_str() {
// FIXME: the span is not quite correct, it should point to ".as_str()" instead
// of just "as_str".
err.span_label(
span,
"try removing `as_str`"
);
} else if let Some(lev_candidate) = lev_candidate {
let def_kind = lev_candidate.def_kind();
err.span_suggestion(
span,
Expand Down
21 changes: 21 additions & 0 deletions src/test/ui/suggestions/remove-as_str.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
fn foo1(s: &str) {
s.as_str();
//~^ ERROR no method named `as_str` found for type `&str` in the current scope
}

fn foo2<'a>(s: &'a str) {
s.as_str();
//~^ ERROR no method named `as_str` found for type `&'a str` in the current scope
}

fn foo3(s: &mut str) {
s.as_str();
//~^ ERROR no method named `as_str` found for type `&mut str` in the current scope
}

fn foo4(s: &&str) {
s.as_str();
//~^ ERROR no method named `as_str` found for type `&&str` in the current scope
}

fn main() {}
27 changes: 27 additions & 0 deletions src/test/ui/suggestions/remove-as_str.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
error[E0599]: no method named `as_str` found for type `&str` in the current scope
--> $DIR/remove-as_str.rs:2:7
|
LL | s.as_str();
| ^^^^^^ try removing `as_str`

error[E0599]: no method named `as_str` found for type `&'a str` in the current scope
--> $DIR/remove-as_str.rs:7:7
|
LL | s.as_str();
| ^^^^^^ try removing `as_str`

error[E0599]: no method named `as_str` found for type `&mut str` in the current scope
--> $DIR/remove-as_str.rs:12:7
|
LL | s.as_str();
| ^^^^^^ try removing `as_str`

error[E0599]: no method named `as_str` found for type `&&str` in the current scope
--> $DIR/remove-as_str.rs:17:7
|
LL | s.as_str();
| ^^^^^^ try removing `as_str`

error: aborting due to 4 previous errors

For more information about this error, try `rustc --explain E0599`.

0 comments on commit f92f3c4

Please sign in to comment.