if receiver.ends_with(&method_call) {
None // do not suggest code that is already there (#53348)
} else {
- Some(format!("{}{}", receiver, method_call))
+ // methods defined will be overwrite `.clone()`
+ // if suggesion is present in `method_call_list` (#53692)
+ let method_call_list = [".to_vec()", ".to_string()"];
+ if receiver.ends_with("clone()")
+ && method_call_list.contains(&method_call.as_str()){
+ // needed to clone receiver, because we don't want other
+ // suggestion to get affect because of that
+ let mut new_receiver = receiver.clone();
+ let max_len = new_receiver.rfind(".").unwrap();
+ new_receiver.truncate(max_len);
+ Some(format!("{}{}", new_receiver, method_call))
+ }
+ else {
+ Some(format!("{}{}", receiver, method_call))
+ }
}
}) .collect::<Vec<_>>();
if !suggestions.is_empty() {
--- /dev/null
+// 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.
+fn main() {
+ let items = vec![1, 2, 3];
+ let ref_items: &[i32] = &items;
+ let items_clone: Vec<i32> = ref_items.clone();
+
+ let s = "hi";
+ let string: String = s.clone();
+}
--- /dev/null
+error[E0308]: mismatched types
+ --> $DIR/issue-53692.rs:13:37
+ |
+LL | let items_clone: Vec<i32> = ref_items.clone();
+ | ^^^^^^^^^^^^^^^^^
+ | |
+ | expected struct `std::vec::Vec`, found &[i32]
+ | help: try using a conversion method: `ref_items.to_vec()`
+ |
+ = note: expected type `std::vec::Vec<i32>`
+ found type `&[i32]`
+
+error[E0308]: mismatched types
+ --> $DIR/issue-53692.rs:16:30
+ |
+LL | let string: String = s.clone();
+ | ^^^^^^^^^
+ | |
+ | expected struct `std::string::String`, found &str
+ | help: try using a conversion method: `s.to_string()`
+ |
+ = note: expected type `std::string::String`
+ found type `&str`
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0308`.