internal: add Copy to minicore

This commit is contained in:
Aleksey Kladov
2021-06-18 22:10:29 +03:00
parent a08339e421
commit 15c4b3fa7f
3 changed files with 464 additions and 306 deletions
+2 -2
View 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",
@@ -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
}
+54 -3
View 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