]> git.lizzy.rs Git - rust.git/commitdiff
Merge #9329
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>
Fri, 18 Jun 2021 19:11:13 +0000 (19:11 +0000)
committerGitHub <noreply@github.com>
Fri, 18 Jun 2021 19:11:13 +0000 (19:11 +0000)
9329: internal: add Copy to minicore r=matklad a=matklad

bors r+
🤖

Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
crates/ide/src/hover.rs
crates/ide_assists/src/handlers/extract_function.rs
crates/test_utils/src/minicore.rs

index 409f81ca09f6669f546ef372b73bfaab2d96128f..4705fae08da9044a53eea9b6c058f13a6261c57d 100644 (file)
@@ -3014,8 +3014,8 @@ fn foo() {
                                     file_id: FileId(
                                         1,
                                     ),
-                                    full_range: 248..430,
-                                    focus_range: 287..293,
+                                    full_range: 250..432,
+                                    focus_range: 289..295,
                                     name: "Future",
                                     kind: Trait,
                                     description: "pub trait Future",
index 7085a0c484930f507f238f1006606c36b162c20a..43e83d683d89de0d0abf702d9c68ccca2997f42e 100644 (file)
@@ -831,6 +831,7 @@ fn path_element_of_reference(
     })?;
     stdx::always!(
         matches!(path, ast::Expr::PathExpr(_) | ast::Expr::MacroCall(_)),
+
         "unexpected expression type for variable usage: {:?}",
         path
     );
@@ -1501,7 +1502,8 @@ fn no_args_from_binary_expr() {
             r#"
 fn foo() {
     foo($01 + 1$0);
-}"#,
+}
+"#,
             r#"
 fn foo() {
     foo(fun_name());
@@ -1509,7 +1511,8 @@ fn foo() {
 
 fn $0fun_name() -> i32 {
     1 + 1
-}"#,
+}
+"#,
         );
     }
 
@@ -1522,7 +1525,8 @@ mod bar {
     fn foo() {
         foo($01 + 1$0);
     }
-}"#,
+}
+"#,
             r#"
 mod bar {
     fn foo() {
@@ -1532,7 +1536,8 @@ fn foo() {
     fn $0fun_name() -> i32 {
         1 + 1
     }
-}"#,
+}
+"#,
         );
     }
 
@@ -1543,7 +1548,8 @@ fn no_args_from_binary_expr_indented() {
             r#"
 fn foo() {
     $0{ 1 + 1 }$0;
-}"#,
+}
+"#,
             r#"
 fn foo() {
     fun_name();
@@ -1551,7 +1557,8 @@ fn foo() {
 
 fn $0fun_name() -> i32 {
     1 + 1
-}"#,
+}
+"#,
         );
     }
 
@@ -1564,7 +1571,8 @@ fn foo() -> i32 {
     let k = 1;
     $0let m = 1;
     m + 1$0
-}"#,
+}
+"#,
             r#"
 fn foo() -> i32 {
     let k = 1;
@@ -1574,7 +1582,8 @@ fn foo() -> i32 {
 fn $0fun_name() -> i32 {
     let m = 1;
     m + 1
-}"#,
+}
+"#,
         );
     }
 
@@ -1588,7 +1597,8 @@ fn foo() {
     $0let m = 1;
     let n = m + 1;$0
     let g = 5;
-}"#,
+}
+"#,
             r#"
 fn foo() {
     let k = 3;
@@ -1599,7 +1609,8 @@ fn foo() {
 fn $0fun_name() {
     let m = 1;
     let n = m + 1;
-}"#,
+}
+"#,
         );
     }
 
@@ -1610,7 +1621,8 @@ fn no_args_if() {
             r#"
 fn foo() {
     $0if true { }$0
-}"#,
+}
+"#,
             r#"
 fn foo() {
     fun_name();
@@ -1618,7 +1630,8 @@ fn foo() {
 
 fn $0fun_name() {
     if true { }
-}"#,
+}
+"#,
         );
     }
 
@@ -1629,7 +1642,8 @@ fn no_args_if_else() {
             r#"
 fn foo() -> i32 {
     $0if true { 1 } else { 2 }$0
-}"#,
+}
+"#,
             r#"
 fn foo() -> i32 {
     fun_name()
@@ -1637,7 +1651,8 @@ fn foo() -> i32 {
 
 fn $0fun_name() -> i32 {
     if true { 1 } else { 2 }
-}"#,
+}
+"#,
         );
     }
 
@@ -1648,7 +1663,8 @@ fn no_args_if_let_else() {
             r#"
 fn foo() -> i32 {
     $0if let true = false { 1 } else { 2 }$0
-}"#,
+}
+"#,
             r#"
 fn foo() -> i32 {
     fun_name()
@@ -1656,7 +1672,8 @@ fn foo() -> i32 {
 
 fn $0fun_name() -> i32 {
     if let true = false { 1 } else { 2 }
-}"#,
+}
+"#,
         );
     }
 
@@ -1670,7 +1687,8 @@ fn foo() -> i32 {
         true => 1,
         false => 2,
     }$0
-}"#,
+}
+"#,
             r#"
 fn foo() -> i32 {
     fun_name()
@@ -1681,7 +1699,8 @@ fn $0fun_name() -> i32 {
         true => 1,
         false => 2,
     }
-}"#,
+}
+"#,
         );
     }
 
@@ -1692,7 +1711,8 @@ fn no_args_while() {
             r#"
 fn foo() {
     $0while true { }$0
-}"#,
+}
+"#,
             r#"
 fn foo() {
     fun_name();
@@ -1700,7 +1720,8 @@ fn foo() {
 
 fn $0fun_name() {
     while true { }
-}"#,
+}
+"#,
         );
     }
 
@@ -1711,7 +1732,8 @@ fn no_args_for() {
             r#"
 fn foo() {
     $0for v in &[0, 1] { }$0
-}"#,
+}
+"#,
             r#"
 fn foo() {
     fun_name();
@@ -1719,7 +1741,8 @@ fn foo() {
 
 fn $0fun_name() {
     for v in &[0, 1] { }
-}"#,
+}
+"#,
         );
     }
 
@@ -1732,7 +1755,8 @@ fn foo() {
     $0loop {
         let m = 1;
     }$0
-}"#,
+}
+"#,
             r#"
 fn foo() {
     fun_name()
@@ -1742,7 +1766,8 @@ fn $0fun_name() -> ! {
     loop {
         let m = 1;
     }
-}"#,
+}
+"#,
         );
     }
 
@@ -1756,7 +1781,8 @@ fn foo() {
         let m = 1;
         break m;
     }$0;
-}"#,
+}
+"#,
             r#"
 fn foo() {
     let v = fun_name();
@@ -1767,7 +1793,8 @@ fn $0fun_name() -> i32 {
         let m = 1;
         break m;
     }
-}"#,
+}
+"#,
         );
     }
 
@@ -1781,7 +1808,8 @@ fn foo() {
         Some(x) => x,
         None => 0,
     }$0;
-}"#,
+}
+"#,
             r#"
 fn foo() {
     let v: i32 = fun_name();
@@ -1792,7 +1820,8 @@ fn $0fun_name() -> i32 {
         Some(x) => x,
         None => 0,
     }
-}"#,
+}
+"#,
         );
     }
 
@@ -1805,7 +1834,8 @@ fn foo() {
     let n = 1;
     let mut v = $0n * n;$0
     v += 1;
-}"#,
+}
+"#,
             r#"
 fn foo() {
     let n = 1;
@@ -1816,7 +1846,8 @@ fn foo() {
 fn $0fun_name(n: i32) -> i32 {
     let mut v = n * n;
     v
-}"#,
+}
+"#,
         );
     }
 
@@ -1832,7 +1863,8 @@ fn foo() {
     let mut w = 3;$0
     v += 1;
     w += 1;
-}"#,
+}
+"#,
             r#"
 fn foo() {
     let m = 2;
@@ -1846,7 +1878,8 @@ fn $0fun_name(m: i32, n: i32) -> (i32, i32) {
     let mut v = m * n;
     let mut w = 3;
     (v, w)
-}"#,
+}
+"#,
         );
     }
 
@@ -1854,12 +1887,13 @@ fn $0fun_name(m: i32, n: i32) -> (i32, i32) {
     fn argument_form_expr() {
         check_assist(
             extract_function,
-            r"
+            r#"
 fn foo() -> u32 {
     let n = 2;
     $0n+2$0
-}",
-            r"
+}
+"#,
+            r#"
 fn foo() -> u32 {
     let n = 2;
     fun_name(n)
@@ -1867,7 +1901,8 @@ fn foo() -> u32 {
 
 fn $0fun_name(n: u32) -> u32 {
     n+2
-}",
+}
+"#,
         )
     }
 
@@ -1875,12 +1910,13 @@ fn $0fun_name(n: u32) -> u32 {
     fn argument_used_twice_form_expr() {
         check_assist(
             extract_function,
-            r"
+            r#"
 fn foo() -> u32 {
     let n = 2;
     $0n+n$0
-}",
-            r"
+}
+"#,
+            r#"
 fn foo() -> u32 {
     let n = 2;
     fun_name(n)
@@ -1888,7 +1924,8 @@ fn foo() -> u32 {
 
 fn $0fun_name(n: u32) -> u32 {
     n+n
-}",
+}
+"#,
         )
     }
 
@@ -1896,13 +1933,14 @@ fn $0fun_name(n: u32) -> u32 {
     fn two_arguments_form_expr() {
         check_assist(
             extract_function,
-            r"
+            r#"
 fn foo() -> u32 {
     let n = 2;
     let m = 3;
     $0n+n*m$0
-}",
-            r"
+}
+"#,
+            r#"
 fn foo() -> u32 {
     let n = 2;
     let m = 3;
@@ -1911,7 +1949,8 @@ fn foo() -> u32 {
 
 fn $0fun_name(n: u32, m: u32) -> u32 {
     n+n*m
-}",
+}
+"#,
         )
     }
 
@@ -1919,13 +1958,14 @@ fn $0fun_name(n: u32, m: u32) -> u32 {
     fn argument_and_locals() {
         check_assist(
             extract_function,
-            r"
+            r#"
 fn foo() -> u32 {
     let n = 2;
     $0let m = 1;
     n + m$0
-}",
-            r"
+}
+"#,
+            r#"
 fn foo() -> u32 {
     let n = 2;
     fun_name(n)
@@ -1934,7 +1974,8 @@ fn foo() -> u32 {
 fn $0fun_name(n: u32) -> u32 {
     let m = 1;
     n + m
-}",
+}
+"#,
         )
     }
 
@@ -1948,18 +1989,20 @@ fn in_comment_is_not_applicable() {
     fn part_of_expr_stmt() {
         check_assist(
             extract_function,
-            "
+            r#"
 fn foo() {
     $01$0 + 1;
-}",
-            "
+}
+"#,
+            r#"
 fn foo() {
     fun_name() + 1;
 }
 
 fn $0fun_name() -> i32 {
     1
-}",
+}
+"#,
         );
     }
 
@@ -1970,7 +2013,8 @@ fn function_expr() {
             r#"
 fn foo() {
     $0bar(1 + 1)$0
-}"#,
+}
+"#,
             r#"
 fn foo() {
     fun_name();
@@ -1978,7 +2022,8 @@ fn foo() {
 
 fn $0fun_name() {
     bar(1 + 1)
-}"#,
+}
+"#,
         )
     }
 
@@ -1986,15 +2031,16 @@ fn $0fun_name() {
     fn extract_from_nested() {
         check_assist(
             extract_function,
-            r"
+            r#"
 fn main() {
     let x = true;
     let tuple = match x {
         true => ($02 + 2$0, true)
         _ => (0, false)
     };
-}",
-            r"
+}
+"#,
+            r#"
 fn main() {
     let x = true;
     let tuple = match x {
@@ -2005,7 +2051,8 @@ fn main() {
 
 fn $0fun_name() -> i32 {
     2 + 2
-}",
+}
+"#,
         );
     }
 
@@ -2013,18 +2060,20 @@ fn $0fun_name() -> i32 {
     fn param_from_closure() {
         check_assist(
             extract_function,
-            r"
+            r#"
 fn main() {
     let lambda = |x: u32| $0x * 2$0;
-}",
-            r"
+}
+"#,
+            r#"
 fn main() {
     let lambda = |x: u32| fun_name(x);
 }
 
 fn $0fun_name(x: u32) -> u32 {
     x * 2
-}",
+}
+"#,
         );
     }
 
@@ -2032,18 +2081,20 @@ fn $0fun_name(x: u32) -> u32 {
     fn extract_return_stmt() {
         check_assist(
             extract_function,
-            r"
+            r#"
 fn foo() -> u32 {
     $0return 2 + 2$0;
-}",
-            r"
+}
+"#,
+            r#"
 fn foo() -> u32 {
     return fun_name();
 }
 
 fn $0fun_name() -> u32 {
     2 + 2
-}",
+}
+"#,
         );
     }
 
@@ -2051,13 +2102,14 @@ fn $0fun_name() -> u32 {
     fn does_not_add_extra_whitespace() {
         check_assist(
             extract_function,
-            r"
+            r#"
 fn foo() -> u32 {
 
 
     $0return 2 + 2$0;
-}",
-            r"
+}
+"#,
+            r#"
 fn foo() -> u32 {
 
 
@@ -2066,7 +2118,8 @@ fn foo() -> u32 {
 
 fn $0fun_name() -> u32 {
     2 + 2
-}",
+}
+"#,
         );
     }
 
@@ -2074,13 +2127,14 @@ fn $0fun_name() -> u32 {
     fn break_stmt() {
         check_assist(
             extract_function,
-            r"
+            r#"
 fn main() {
     let result = loop {
         $0break 2 + 2$0;
     };
-}",
-            r"
+}
+"#,
+            r#"
 fn main() {
     let result = loop {
         break fun_name();
@@ -2089,7 +2143,8 @@ fn main() {
 
 fn $0fun_name() -> i32 {
     2 + 2
-}",
+}
+"#,
         );
     }
 
@@ -2097,18 +2152,20 @@ fn $0fun_name() -> i32 {
     fn extract_cast() {
         check_assist(
             extract_function,
-            r"
+            r#"
 fn main() {
     let v = $00f32 as u32$0;
-}",
-            r"
+}
+"#,
+            r#"
 fn main() {
     let v = fun_name();
 }
 
 fn $0fun_name() -> u32 {
     0f32 as u32
-}",
+}
+"#,
         );
     }
 
@@ -2121,15 +2178,16 @@ fn return_not_applicable() {
     fn method_to_freestanding() {
         check_assist(
             extract_function,
-            r"
+            r#"
 struct S;
 
 impl S {
     fn foo(&self) -> i32 {
         $01+1$0
     }
-}",
-            r"
+}
+"#,
+            r#"
 struct S;
 
 impl S {
@@ -2140,7 +2198,8 @@ fn foo(&self) -> i32 {
 
 fn $0fun_name() -> i32 {
     1+1
-}",
+}
+"#,
         );
     }
 
@@ -2148,15 +2207,16 @@ fn $0fun_name() -> i32 {
     fn method_with_reference() {
         check_assist(
             extract_function,
-            r"
+            r#"
 struct S { f: i32 };
 
 impl S {
     fn foo(&self) -> i32 {
         $01+self.f$0
     }
-}",
-            r"
+}
+"#,
+            r#"
 struct S { f: i32 };
 
 impl S {
@@ -2167,7 +2227,8 @@ fn foo(&self) -> i32 {
     fn $0fun_name(&self) -> i32 {
         1+self.f
     }
-}",
+}
+"#,
         );
     }
 
@@ -2175,15 +2236,16 @@ fn $0fun_name(&self) -> i32 {
     fn method_with_mut() {
         check_assist(
             extract_function,
-            r"
+            r#"
 struct S { f: i32 };
 
 impl S {
     fn foo(&mut self) {
         $0self.f += 1;$0
     }
-}",
-            r"
+}
+"#,
+            r#"
 struct S { f: i32 };
 
 impl S {
@@ -2194,7 +2256,8 @@ fn foo(&mut self) {
     fn $0fun_name(&mut self) {
         self.f += 1;
     }
-}",
+}
+"#,
         );
     }
 
@@ -2202,13 +2265,14 @@ fn $0fun_name(&mut self) {
     fn variable_defined_inside_and_used_after_no_ret() {
         check_assist(
             extract_function,
-            r"
+            r#"
 fn foo() {
     let n = 1;
     $0let k = n * n;$0
     let m = k + 1;
-}",
-            r"
+}
+"#,
+            r#"
 fn foo() {
     let n = 1;
     let k = fun_name(n);
@@ -2218,7 +2282,8 @@ fn foo() {
 fn $0fun_name(n: i32) -> i32 {
     let k = n * n;
     k
-}",
+}
+"#,
         );
     }
 
@@ -2226,13 +2291,14 @@ fn $0fun_name(n: i32) -> i32 {
     fn variable_defined_inside_and_used_after_mutably_no_ret() {
         check_assist(
             extract_function,
-            r"
+            r#"
 fn foo() {
     let n = 1;
     $0let mut k = n * n;$0
     k += 1;
-}",
-            r"
+}
+"#,
+            r#"
 fn foo() {
     let n = 1;
     let mut k = fun_name(n);
@@ -2242,7 +2308,8 @@ fn foo() {
 fn $0fun_name(n: i32) -> i32 {
     let mut k = n * n;
     k
-}",
+}
+"#,
         );
     }
 
@@ -2250,14 +2317,15 @@ fn $0fun_name(n: i32) -> i32 {
     fn two_variables_defined_inside_and_used_after_no_ret() {
         check_assist(
             extract_function,
-            r"
+            r#"
 fn foo() {
     let n = 1;
     $0let k = n * n;
     let m = k + 2;$0
     let h = k + m;
-}",
-            r"
+}
+"#,
+            r#"
 fn foo() {
     let n = 1;
     let (k, m) = fun_name(n);
@@ -2268,7 +2336,8 @@ fn $0fun_name(n: i32) -> (i32, i32) {
     let k = n * n;
     let m = k + 2;
     (k, m)
-}",
+}
+"#,
         );
     }
 
@@ -2276,7 +2345,7 @@ fn $0fun_name(n: i32) -> (i32, i32) {
     fn multi_variables_defined_inside_and_used_after_mutably_no_ret() {
         check_assist(
             extract_function,
-            r"
+            r#"
 fn foo() {
     let n = 1;
     $0let mut k = n * n;
@@ -2285,8 +2354,9 @@ fn foo() {
     o += 1;$0
     k += o;
     m = 1;
-}",
-            r"
+}
+"#,
+            r#"
 fn foo() {
     let n = 1;
     let (mut k, mut m, o) = fun_name(n);
@@ -2300,7 +2370,8 @@ fn $0fun_name(n: i32) -> (i32, i32, i32) {
     let mut o = m + 3;
     o += 1;
     (k, m, o)
-}",
+}
+"#,
         );
     }
 
@@ -2308,13 +2379,14 @@ fn $0fun_name(n: i32) -> (i32, i32, i32) {
     fn nontrivial_patterns_define_variables() {
         check_assist(
             extract_function,
-            r"
+            r#"
 struct Counter(i32);
 fn foo() {
     $0let Counter(n) = Counter(0);$0
     let m = n;
-}",
-            r"
+}
+"#,
+            r#"
 struct Counter(i32);
 fn foo() {
     let n = fun_name();
@@ -2324,7 +2396,8 @@ fn foo() {
 fn $0fun_name() -> i32 {
     let Counter(n) = Counter(0);
     n
-}",
+}
+"#,
         );
     }
 
@@ -2332,13 +2405,14 @@ fn $0fun_name() -> i32 {
     fn struct_with_two_fields_pattern_define_variables() {
         check_assist(
             extract_function,
-            r"
+            r#"
 struct Counter { n: i32, m: i32 };
 fn foo() {
     $0let Counter { n, m: k } = Counter { n: 1, m: 2 };$0
     let h = n + k;
-}",
-            r"
+}
+"#,
+            r#"
 struct Counter { n: i32, m: i32 };
 fn foo() {
     let (n, k) = fun_name();
@@ -2348,7 +2422,8 @@ fn foo() {
 fn $0fun_name() -> (i32, i32) {
     let Counter { n, m: k } = Counter { n: 1, m: 2 };
     (n, k)
-}",
+}
+"#,
         );
     }
 
@@ -2356,13 +2431,14 @@ fn $0fun_name() -> (i32, i32) {
     fn mut_var_from_outer_scope() {
         check_assist(
             extract_function,
-            r"
+            r#"
 fn foo() {
     let mut n = 1;
     $0n += 1;$0
     let m = n + 1;
-}",
-            r"
+}
+"#,
+            r#"
 fn foo() {
     let mut n = 1;
     fun_name(&mut n);
@@ -2371,7 +2447,8 @@ fn foo() {
 
 fn $0fun_name(n: &mut i32) {
     *n += 1;
-}",
+}
+"#,
         );
     }
 
@@ -2379,14 +2456,15 @@ fn $0fun_name(n: &mut i32) {
     fn mut_field_from_outer_scope() {
         check_assist(
             extract_function,
-            r"
+            r#"
 struct C { n: i32 }
 fn foo() {
     let mut c = C { n: 0 };
     $0c.n += 1;$0
     let m = c.n + 1;
-}",
-            r"
+}
+"#,
+            r#"
 struct C { n: i32 }
 fn foo() {
     let mut c = C { n: 0 };
@@ -2396,7 +2474,8 @@ fn foo() {
 
 fn $0fun_name(c: &mut C) {
     c.n += 1;
-}",
+}
+"#,
         );
     }
 
@@ -2404,7 +2483,7 @@ fn $0fun_name(c: &mut C) {
     fn mut_nested_field_from_outer_scope() {
         check_assist(
             extract_function,
-            r"
+            r#"
 struct P { n: i32}
 struct C { p: P }
 fn foo() {
@@ -2414,8 +2493,9 @@ fn foo() {
     $0c.p.n += u.p.n;
     let r = &mut v.p.n;$0
     let m = c.p.n + v.p.n + u.p.n;
-}",
-            r"
+}
+"#,
+            r#"
 struct P { n: i32}
 struct C { p: P }
 fn foo() {
@@ -2429,7 +2509,8 @@ fn foo() {
 fn $0fun_name(c: &mut C, u: &C, v: &mut C) {
     c.p.n += u.p.n;
     let r = &mut v.p.n;
-}",
+}
+"#,
         );
     }
 
@@ -2437,7 +2518,7 @@ fn $0fun_name(c: &mut C, u: &C, v: &mut C) {
     fn mut_param_many_usages_stmt() {
         check_assist(
             extract_function,
-            r"
+            r#"
 fn bar(k: i32) {}
 trait I: Copy {
     fn succ(&self) -> Self;
@@ -2458,8 +2539,9 @@ fn foo() {
     *v = v.succ();
     n.succ();$0
     let m = n + 1;
-}",
-            r"
+}
+"#,
+            r#"
 fn bar(k: i32) {}
 trait I: Copy {
     fn succ(&self) -> Self;
@@ -2484,7 +2566,8 @@ fn $0fun_name(n: &mut i32) {
     let v = n;
     *v = v.succ();
     n.succ();
-}",
+}
+"#,
         );
     }
 
@@ -2492,7 +2575,7 @@ fn $0fun_name(n: &mut i32) {
     fn mut_param_many_usages_expr() {
         check_assist(
             extract_function,
-            r"
+            r#"
 fn bar(k: i32) {}
 trait I: Copy {
     fn succ(&self) -> Self;
@@ -2515,8 +2598,9 @@ fn foo() {
         n.succ();
     }$0
     let m = n + 1;
-}",
-            r"
+}
+"#,
+            r#"
 fn bar(k: i32) {}
 trait I: Copy {
     fn succ(&self) -> Self;
@@ -2541,7 +2625,8 @@ fn $0fun_name(n: &mut i32) {
     let v = n;
     *v = v.succ();
     n.succ();
-}",
+}
+"#,
         );
     }
 
@@ -2549,11 +2634,12 @@ fn $0fun_name(n: &mut i32) {
     fn mut_param_by_value() {
         check_assist(
             extract_function,
-            r"
+            r#"
 fn foo() {
     let mut n = 1;
     $0n += 1;$0
-}",
+}
+"#,
             r"
 fn foo() {
     let mut n = 1;
@@ -2562,7 +2648,8 @@ fn foo() {
 
 fn $0fun_name(mut n: i32) {
     n += 1;
-}",
+}
+",
         );
     }
 
@@ -2570,14 +2657,15 @@ fn $0fun_name(mut n: i32) {
     fn mut_param_because_of_mut_ref() {
         check_assist(
             extract_function,
-            r"
+            r#"
 fn foo() {
     let mut n = 1;
     $0let v = &mut n;
     *v += 1;$0
     let k = n;
-}",
-            r"
+}
+"#,
+            r#"
 fn foo() {
     let mut n = 1;
     fun_name(&mut n);
@@ -2587,7 +2675,8 @@ fn foo() {
 fn $0fun_name(n: &mut i32) {
     let v = n;
     *v += 1;
-}",
+}
+"#,
         );
     }
 
@@ -2600,8 +2689,9 @@ fn foo() {
     let mut n = 1;
     $0let v = &mut n;
     *v += 1;$0
-}",
-            r"
+}
+",
+            r#"
 fn foo() {
     let mut n = 1;
     fun_name(n);
@@ -2610,7 +2700,8 @@ fn foo() {
 fn $0fun_name(mut n: i32) {
     let v = &mut n;
     *v += 1;
-}",
+}
+"#,
         );
     }
 
@@ -2618,7 +2709,7 @@ fn $0fun_name(mut n: i32) {
     fn mut_method_call() {
         check_assist(
             extract_function,
-            r"
+            r#"
 trait I {
     fn inc(&mut self);
 }
@@ -2628,8 +2719,9 @@ fn inc(&mut self) { *self += 1 }
 fn foo() {
     let mut n = 1;
     $0n.inc();$0
-}",
-            r"
+}
+"#,
+            r#"
 trait I {
     fn inc(&mut self);
 }
@@ -2643,7 +2735,8 @@ fn foo() {
 
 fn $0fun_name(mut n: i32) {
     n.inc();
-}",
+}
+"#,
         );
     }
 
@@ -2651,7 +2744,7 @@ fn $0fun_name(mut n: i32) {
     fn shared_method_call() {
         check_assist(
             extract_function,
-            r"
+            r#"
 trait I {
     fn succ(&self);
 }
@@ -2661,7 +2754,8 @@ fn succ(&self) { *self + 1 }
 fn foo() {
     let mut n = 1;
     $0n.succ();$0
-}",
+}
+"#,
             r"
 trait I {
     fn succ(&self);
@@ -2676,7 +2770,8 @@ fn foo() {
 
 fn $0fun_name(n: i32) {
     n.succ();
-}",
+}
+",
         );
     }
 
@@ -2684,7 +2779,7 @@ fn $0fun_name(n: i32) {
     fn mut_method_call_with_other_receiver() {
         check_assist(
             extract_function,
-            r"
+            r#"
 trait I {
     fn inc(&mut self, n: i32);
 }
@@ -2695,7 +2790,8 @@ fn foo() {
     let mut n = 1;
     $0let mut m = 2;
     m.inc(n);$0
-}",
+}
+"#,
             r"
 trait I {
     fn inc(&mut self, n: i32);
@@ -2711,7 +2807,8 @@ fn foo() {
 fn $0fun_name(n: i32) {
     let mut m = 2;
     m.inc(n);
-}",
+}
+",
         );
     }
 
@@ -2719,12 +2816,13 @@ fn $0fun_name(n: i32) {
     fn non_copy_without_usages_after() {
         check_assist(
             extract_function,
-            r"
+            r#"
 struct Counter(i32);
 fn foo() {
     let c = Counter(0);
     $0let n = c.0;$0
-}",
+}
+"#,
             r"
 struct Counter(i32);
 fn foo() {
@@ -2734,7 +2832,8 @@ fn foo() {
 
 fn $0fun_name(c: Counter) {
     let n = c.0;
-}",
+}
+",
         );
     }
 
@@ -2748,8 +2847,9 @@ fn foo() {
     let c = Counter(0);
     $0let n = c.0;$0
     let m = c.0;
-}",
-            r"
+}
+",
+            r#"
 struct Counter(i32);
 fn foo() {
     let c = Counter(0);
@@ -2759,7 +2859,8 @@ fn foo() {
 
 fn $0fun_name(c: &Counter) {
     let n = c.0;
-}",
+}
+"#,
         );
     }
 
@@ -2767,19 +2868,15 @@ fn $0fun_name(c: &Counter) {
     fn copy_used_after() {
         check_assist(
             extract_function,
-            r##"
-#[lang = "copy"]
-pub trait Copy {}
-impl Copy for i32 {}
+            r#"
+//- minicore: copy
 fn foo() {
     let n = 0;
     $0let m = n;$0
     let k = n;
-}"##,
-            r##"
-#[lang = "copy"]
-pub trait Copy {}
-impl Copy for i32 {}
+}
+"#,
+            r#"
 fn foo() {
     let n = 0;
     fun_name(n);
@@ -2788,7 +2885,8 @@ fn foo() {
 
 fn $0fun_name(n: i32) {
     let m = n;
-}"##,
+}
+"#,
         )
     }
 
@@ -2796,21 +2894,19 @@ fn $0fun_name(n: i32) {
     fn copy_custom_used_after() {
         check_assist(
             extract_function,
-            r##"
-#[lang = "copy"]
-pub trait Copy {}
+            r#"
+//- minicore: copy, derive
+#[derive(Clone, Copy)]
 struct Counter(i32);
-impl Copy for Counter {}
 fn foo() {
     let c = Counter(0);
     $0let n = c.0;$0
     let m = c.0;
-}"##,
-            r##"
-#[lang = "copy"]
-pub trait Copy {}
+}
+"#,
+            r#"
+#[derive(Clone, Copy)]
 struct Counter(i32);
-impl Copy for Counter {}
 fn foo() {
     let c = Counter(0);
     fun_name(c);
@@ -2819,7 +2915,8 @@ fn foo() {
 
 fn $0fun_name(c: Counter) {
     let n = c.0;
-}"##,
+}
+"#,
         );
     }
 
@@ -2827,7 +2924,7 @@ fn $0fun_name(c: Counter) {
     fn indented_stmts() {
         check_assist(
             extract_function,
-            r"
+            r#"
 fn foo() {
     if true {
         loop {
@@ -2835,8 +2932,9 @@ fn foo() {
             let m = 2;$0
         }
     }
-}",
-            r"
+}
+"#,
+            r#"
 fn foo() {
     if true {
         loop {
@@ -2848,7 +2946,8 @@ fn foo() {
 fn $0fun_name() {
     let n = 1;
     let m = 2;
-}",
+}
+"#,
         );
     }
 
@@ -2856,7 +2955,7 @@ fn $0fun_name() {
     fn indented_stmts_inside_mod() {
         check_assist(
             extract_function,
-            r"
+            r#"
 mod bar {
     fn foo() {
         if true {
@@ -2866,8 +2965,9 @@ fn foo() {
             }
         }
     }
-}",
-            r"
+}
+"#,
+            r#"
 mod bar {
     fn foo() {
         if true {
@@ -2881,7 +2981,8 @@ fn $0fun_name() {
         let n = 1;
         let m = 2;
     }
-}",
+}
+"#,
         );
     }
 
@@ -2889,7 +2990,7 @@ fn $0fun_name() {
     fn break_loop() {
         check_assist(
             extract_function,
-            r##"
+            r#"
 enum Option<T> {
     #[lang = "None"] None,
     #[lang = "Some"] Some(T),
@@ -2903,8 +3004,9 @@ fn foo() {
         let k = 2;$0
         let h = 1 + k;
     }
-}"##,
-            r##"
+}
+"#,
+            r#"
 enum Option<T> {
     #[lang = "None"] None,
     #[lang = "Some"] Some(T),
@@ -2926,7 +3028,8 @@ fn $0fun_name(n: i32) -> Option<i32> {
     return None;
     let k = 2;
     Some(k)
-}"##,
+}
+"#,
         );
     }
 
@@ -2934,31 +3037,17 @@ fn $0fun_name(n: i32) -> Option<i32> {
     fn return_to_parent() {
         check_assist(
             extract_function,
-            r##"
-#[lang = "copy"]
-pub trait Copy {}
-impl Copy for i32 {}
-enum Result<T, E> {
-    #[lang = "Ok"] Ok(T),
-    #[lang = "Err"] Err(E),
-}
-use Result::*;
+            r#"
+//- minicore: copy, result
 fn foo() -> i64 {
     let n = 1;
     $0let m = n + 1;
     return 1;
     let k = 2;$0
     (n + k) as i64
-}"##,
-            r##"
-#[lang = "copy"]
-pub trait Copy {}
-impl Copy for i32 {}
-enum Result<T, E> {
-    #[lang = "Ok"] Ok(T),
-    #[lang = "Err"] Err(E),
-}
-use Result::*;
+}
+"#,
+            r#"
 fn foo() -> i64 {
     let n = 1;
     let k = match fun_name(n) {
@@ -2973,7 +3062,8 @@ fn $0fun_name(n: i32) -> Result<i32, i64> {
     return Err(1);
     let k = 2;
     Ok(k)
-}"##,
+}
+"#,
         );
     }
 
@@ -2982,7 +3072,7 @@ fn break_and_continue() {
         cov_mark::check!(external_control_flow_break_and_continue);
         check_assist_not_applicable(
             extract_function,
-            r##"
+            r#"
 fn foo() {
     loop {
         let n = 1;
@@ -2993,7 +3083,8 @@ fn foo() {
         let k = k + 1;$0
         let r = n + k;
     }
-}"##,
+}
+"#,
         );
     }
 
@@ -3002,7 +3093,7 @@ fn return_and_break() {
         cov_mark::check!(external_control_flow_return_and_bc);
         check_assist_not_applicable(
             extract_function,
-            r##"
+            r#"
 fn foo() {
     loop {
         let n = 1;
@@ -3013,7 +3104,8 @@ fn foo() {
         let k = k + 1;$0
         let r = n + k;
     }
-}"##,
+}
+"#,
         );
     }
 
@@ -3021,7 +3113,7 @@ fn foo() {
     fn break_loop_with_if() {
         check_assist(
             extract_function,
-            r##"
+            r#"
 fn foo() {
     loop {
         let mut n = 1;
@@ -3030,8 +3122,9 @@ fn foo() {
         n += m;$0
         let h = 1 + n;
     }
-}"##,
-            r##"
+}
+"#,
+            r#"
 fn foo() {
     loop {
         let mut n = 1;
@@ -3047,7 +3140,8 @@ fn $0fun_name(n: &mut i32) -> bool {
     return true;
     *n += m;
     false
-}"##,
+}
+"#,
         );
     }
 
@@ -3055,7 +3149,7 @@ fn $0fun_name(n: &mut i32) -> bool {
     fn break_loop_nested() {
         check_assist(
             extract_function,
-            r##"
+            r#"
 fn foo() {
     loop {
         let mut n = 1;
@@ -3065,8 +3159,9 @@ fn foo() {
         }$0
         let h = 1;
     }
-}"##,
-            r##"
+}
+"#,
+            r#"
 fn foo() {
     loop {
         let mut n = 1;
@@ -3083,7 +3178,8 @@ fn $0fun_name(n: i32) -> bool {
         return true;
     }
     false
-}"##,
+}
+"#,
         );
     }
 
@@ -3091,7 +3187,7 @@ fn $0fun_name(n: i32) -> bool {
     fn return_from_nested_loop() {
         check_assist(
             extract_function,
-            r##"
+            r#"
 fn foo() {
     loop {
         let n = 1;
@@ -3103,8 +3199,9 @@ fn foo() {
         let m = k + 1;$0
         let h = 1 + m;
     }
-}"##,
-            r##"
+}
+"#,
+            r#"
 fn foo() {
     loop {
         let n = 1;
@@ -3123,7 +3220,8 @@ fn $0fun_name() -> Option<i32> {
     }
     let m = k + 1;
     Some(m)
-}"##,
+}
+"#,
         );
     }
 
@@ -3131,7 +3229,7 @@ fn $0fun_name() -> Option<i32> {
     fn break_from_nested_loop() {
         check_assist(
             extract_function,
-            r##"
+            r#"
 fn foo() {
     loop {
         let n = 1;
@@ -3142,8 +3240,9 @@ fn foo() {
         let m = k + 1;$0
         let h = 1 + m;
     }
-}"##,
-            r##"
+}
+"#,
+            r#"
 fn foo() {
     loop {
         let n = 1;
@@ -3159,7 +3258,8 @@ fn $0fun_name() -> i32 {
     }
     let m = k + 1;
     m
-}"##,
+}
+"#,
         );
     }
 
@@ -3167,7 +3267,7 @@ fn $0fun_name() -> i32 {
     fn break_from_nested_and_outer_loops() {
         check_assist(
             extract_function,
-            r##"
+            r#"
 fn foo() {
     loop {
         let n = 1;
@@ -3181,8 +3281,9 @@ fn foo() {
         let m = k + 1;$0
         let h = 1 + m;
     }
-}"##,
-            r##"
+}
+"#,
+            r#"
 fn foo() {
     loop {
         let n = 1;
@@ -3204,7 +3305,8 @@ fn $0fun_name() -> Option<i32> {
     }
     let m = k + 1;
     Some(m)
-}"##,
+}
+"#,
         );
     }
 
@@ -3212,7 +3314,7 @@ fn $0fun_name() -> Option<i32> {
     fn return_from_nested_fn() {
         check_assist(
             extract_function,
-            r##"
+            r#"
 fn foo() {
     loop {
         let n = 1;
@@ -3223,8 +3325,9 @@ fn test() {
         let m = k + 1;$0
         let h = 1 + m;
     }
-}"##,
-            r##"
+}
+"#,
+            r#"
 fn foo() {
     loop {
         let n = 1;
@@ -3240,7 +3343,8 @@ fn test() {
     }
     let m = k + 1;
     m
-}"##,
+}
+"#,
         );
     }
 
@@ -3248,7 +3352,7 @@ fn test() {
     fn break_with_value() {
         check_assist(
             extract_function,
-            r##"
+            r#"
 fn foo() -> i32 {
     loop {
         let n = 1;
@@ -3259,8 +3363,9 @@ fn foo() -> i32 {
         let m = k + 1;$0
         let h = 1;
     }
-}"##,
-            r##"
+}
+"#,
+            r#"
 fn foo() -> i32 {
     loop {
         let n = 1;
@@ -3278,7 +3383,8 @@ fn $0fun_name() -> Option<i32> {
     }
     let m = k + 1;
     None
-}"##,
+}
+"#,
         );
     }
 
@@ -3286,7 +3392,7 @@ fn $0fun_name() -> Option<i32> {
     fn break_with_value_and_return() {
         check_assist(
             extract_function,
-            r##"
+            r#"
 fn foo() -> i64 {
     loop {
         let n = 1;
@@ -3298,8 +3404,9 @@ fn foo() -> i64 {
         let m = k + 1;$0
         let h = 1 + m;
     }
-}"##,
-            r##"
+}
+"#,
+            r#"
 fn foo() -> i64 {
     loop {
         let n = 1;
@@ -3318,7 +3425,8 @@ fn $0fun_name() -> Result<i32, i64> {
     }
     let m = k + 1;
     Ok(m)
-}"##,
+}
+"#,
         );
     }
 
@@ -3326,9 +3434,8 @@ fn $0fun_name() -> Result<i32, i64> {
     fn try_option() {
         check_assist(
             extract_function,
-            r##"
-enum Option<T> { None, Some(T), }
-use Option::*;
+            r#"
+//- minicore: option
 fn bar() -> Option<i32> { None }
 fn foo() -> Option<()> {
     let n = bar()?;
@@ -3336,10 +3443,9 @@ fn foo() -> Option<()> {
     let m = k + 1;$0
     let h = 1 + m;
     Some(())
-}"##,
-            r##"
-enum Option<T> { None, Some(T), }
-use Option::*;
+}
+"#,
+            r#"
 fn bar() -> Option<i32> { None }
 fn foo() -> Option<()> {
     let n = bar()?;
@@ -3352,7 +3458,8 @@ fn $0fun_name() -> Option<i32> {
     let k = foo()?;
     let m = k + 1;
     Some(m)
-}"##,
+}
+"#,
         );
     }
 
@@ -3360,19 +3467,17 @@ fn $0fun_name() -> Option<i32> {
     fn try_option_unit() {
         check_assist(
             extract_function,
-            r##"
-enum Option<T> { None, Some(T), }
-use Option::*;
+            r#"
+//- minicore: option
 fn foo() -> Option<()> {
     let n = 1;
     $0let k = foo()?;
     let m = k + 1;$0
     let h = 1 + n;
     Some(())
-}"##,
-            r##"
-enum Option<T> { None, Some(T), }
-use Option::*;
+}
+"#,
+            r#"
 fn foo() -> Option<()> {
     let n = 1;
     fun_name()?;
@@ -3384,7 +3489,8 @@ fn $0fun_name() -> Option<()> {
     let k = foo()?;
     let m = k + 1;
     Some(())
-}"##,
+}
+"#,
         );
     }
 
@@ -3392,19 +3498,17 @@ fn $0fun_name() -> Option<()> {
     fn try_result() {
         check_assist(
             extract_function,
-            r##"
-enum Result<T, E> { Ok(T), Err(E), }
-use Result::*;
+            r#"
+//- minicore: result
 fn foo() -> Result<(), i64> {
     let n = 1;
     $0let k = foo()?;
     let m = k + 1;$0
     let h = 1 + m;
     Ok(())
-}"##,
-            r##"
-enum Result<T, E> { Ok(T), Err(E), }
-use Result::*;
+}
+"#,
+            r#"
 fn foo() -> Result<(), i64> {
     let n = 1;
     let m = fun_name()?;
@@ -3416,7 +3520,8 @@ fn $0fun_name() -> Result<i32, i64> {
     let k = foo()?;
     let m = k + 1;
     Ok(m)
-}"##,
+}
+"#,
         );
     }
 
@@ -3424,9 +3529,8 @@ fn $0fun_name() -> Result<i32, i64> {
     fn try_option_with_return() {
         check_assist(
             extract_function,
-            r##"
-enum Option<T> { None, Some(T) }
-use Option::*;
+            r#"
+//- minicore: option
 fn foo() -> Option<()> {
     let n = 1;
     $0let k = foo()?;
@@ -3436,10 +3540,9 @@ fn foo() -> Option<()> {
     let m = k + 1;$0
     let h = 1 + m;
     Some(())
-}"##,
-            r##"
-enum Option<T> { None, Some(T) }
-use Option::*;
+}
+"#,
+            r#"
 fn foo() -> Option<()> {
     let n = 1;
     let m = fun_name()?;
@@ -3454,7 +3557,8 @@ fn $0fun_name() -> Option<i32> {
     }
     let m = k + 1;
     Some(m)
-}"##,
+}
+"#,
         );
     }
 
@@ -3462,9 +3566,8 @@ fn $0fun_name() -> Option<i32> {
     fn try_result_with_return() {
         check_assist(
             extract_function,
-            r##"
-enum Result<T, E> { Ok(T), Err(E), }
-use Result::*;
+            r#"
+//- minicore: result
 fn foo() -> Result<(), i64> {
     let n = 1;
     $0let k = foo()?;
@@ -3474,10 +3577,9 @@ fn foo() -> Result<(), i64> {
     let m = k + 1;$0
     let h = 1 + m;
     Ok(())
-}"##,
-            r##"
-enum Result<T, E> { Ok(T), Err(E), }
-use Result::*;
+}
+"#,
+            r#"
 fn foo() -> Result<(), i64> {
     let n = 1;
     let m = fun_name()?;
@@ -3492,7 +3594,8 @@ fn $0fun_name() -> Result<i32, i64> {
     }
     let m = k + 1;
     Ok(m)
-}"##,
+}
+"#,
         );
     }
 
@@ -3501,9 +3604,8 @@ fn try_and_break() {
         cov_mark::check!(external_control_flow_try_and_bc);
         check_assist_not_applicable(
             extract_function,
-            r##"
-enum Option<T> { None, Some(T) }
-use Option::*;
+            r#"
+//- minicore: option
 fn foo() -> Option<()> {
     loop {
         let n = Some(1);
@@ -3514,7 +3616,8 @@ fn foo() -> Option<()> {
         let r = n + k;
     }
     Some(())
-}"##,
+}
+"#,
         );
     }
 
@@ -3523,9 +3626,8 @@ fn try_and_return_ok() {
         cov_mark::check!(external_control_flow_try_and_return_non_err);
         check_assist_not_applicable(
             extract_function,
-            r##"
-enum Result<T, E> { Ok(T), Err(E), }
-use Result::*;
+            r#"
+//- minicore: result
 fn foo() -> Result<(), i64> {
     let n = 1;
     $0let k = foo()?;
@@ -3535,7 +3637,8 @@ fn foo() -> Result<(), i64> {
     let m = k + 1;$0
     let h = 1 + m;
     Ok(())
-}"##,
+}
+"#,
         );
     }
 
@@ -3543,7 +3646,7 @@ fn foo() -> Result<(), i64> {
     fn param_usage_in_macro() {
         check_assist(
             extract_function,
-            r"
+            r#"
 macro_rules! m {
     ($val:expr) => { $val };
 }
@@ -3552,8 +3655,9 @@ fn foo() {
     let n = 1;
     $0let k = n * m!(n);$0
     let m = k + 1;
-}",
-            r"
+}
+"#,
+            r#"
 macro_rules! m {
     ($val:expr) => { $val };
 }
@@ -3567,7 +3671,8 @@ fn foo() {
 fn $0fun_name(n: i32) -> i32 {
     let k = n * m!(n);
     k
-}",
+}
+"#,
         );
     }
 
@@ -3575,7 +3680,8 @@ fn $0fun_name(n: i32) -> i32 {
     fn extract_with_await() {
         check_assist(
             extract_function,
-            r#"fn main() {
+            r#"
+fn main() {
     $0some_function().await;$0
 }
 
@@ -3603,7 +3709,8 @@ async fn some_function() {
     fn extract_with_await_in_args() {
         check_assist(
             extract_function,
-            r#"fn main() {
+            r#"
+fn main() {
     $0function_call("a", some_function().await);$0
 }
 
index 9ec541c573e0e2db89b72a8f8aea326fc6093fcf..76902858088a05e036e99770f99146b15dde56a2 100644 (file)
@@ -23,6 +23,8 @@
 //!     iterator: option
 //!     iterators: iterator
 //!     default: sized
+//!     clone: sized
+//!     copy: clone
 //!     from: sized
 //!     eq: sized
 //!     ord: eq, option
@@ -40,6 +42,38 @@ pub trait Sized {}
     #[lang = "unsize"]
     pub trait Unsize<T: ?Sized> {}
     // endregion:unsize
+
+    // region:copy
+    #[lang = "copy"]
+    pub trait Copy: Clone {}
+    // region:derive
+    #[rustc_builtin_macro]
+    pub macro Copy($item:item) {}
+    // endregion:derive
+
+    mod copy_impls {
+        use super::Copy;
+
+        macro_rules! impl_copy {
+            ($($t:ty)*) => {
+                $(
+                    impl Copy for $t {}
+                )*
+            }
+        }
+
+        impl_copy! {
+            usize u8 u16 u32 u64 u128
+            isize i8 i16 i32 i64 i128
+            f32 f64
+            bool char
+        }
+
+        impl<T: ?Sized> Copy for *const T {}
+        impl<T: ?Sized> Copy for *mut T {}
+        impl<T: ?Sized> Copy for &T {}
+    }
+    // endregion:copy
 }
 
 // region:default
@@ -50,6 +84,19 @@ pub trait Default: Sized {
 }
 // endregion:default
 
+// region:clone
+pub mod clone {
+    #[lang = "clone"]
+    pub trait Clone: Sized {
+        fn clone(&self) -> Self;
+    }
+    // region:derive
+    #[rustc_builtin_macro]
+    pub macro Clone($item:item) {}
+    // endregion:derive
+}
+// endregion:clone
+
 // region:from
 pub mod convert {
     pub trait From<T>: Sized {
@@ -114,9 +161,11 @@ pub trait DerefMut: Deref {
         }
         // endregion:deref_mut
     }
-    pub use self::deref::Deref;
-    pub use self::deref::DerefMut; //:deref_mut
-                                   // endregion:deref
+    pub use self::deref::{
+        Deref,
+        DerefMut, // :deref_mut
+    };
+    // endregion:deref
 
     // region:range
     mod range {
@@ -402,12 +451,14 @@ pub(crate) mod builtin {
 pub mod prelude {
     pub mod v1 {
         pub use crate::{
+            clone::Clone,                       // :clone
             cmp::{Eq, PartialEq},               // :eq
             cmp::{Ord, PartialOrd},             // :ord
             convert::{From, Into},              // :from
             default::Default,                   // :default
             iter::{IntoIterator, Iterator},     // :iterator
             macros::builtin::derive,            // :derive
+            marker::Copy,                       // :copy
             marker::Sized,                      // :sized
             ops::{Fn, FnMut, FnOnce},           // :fn
             option::Option::{self, None, Some}, // :option