mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-28 05:53:45 +00:00
Merge #4540
4540: More snippets r=matklad a=matklad
bors r+
🤖
Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
This commit is contained in:
commit
4677cea719
10 changed files with 135 additions and 174 deletions
|
@ -97,7 +97,6 @@ pub(crate) fn convert_to_guarded_return(acc: &mut Assists, ctx: &AssistContext)
|
||||||
}
|
}
|
||||||
|
|
||||||
then_block.syntax().last_child_or_token().filter(|t| t.kind() == R_CURLY)?;
|
then_block.syntax().last_child_or_token().filter(|t| t.kind() == R_CURLY)?;
|
||||||
let cursor_position = ctx.offset();
|
|
||||||
|
|
||||||
let target = if_expr.syntax().text_range();
|
let target = if_expr.syntax().text_range();
|
||||||
acc.add(AssistId("convert_to_guarded_return"), "Convert to guarded return", target, |edit| {
|
acc.add(AssistId("convert_to_guarded_return"), "Convert to guarded return", target, |edit| {
|
||||||
|
@ -148,7 +147,6 @@ pub(crate) fn convert_to_guarded_return(acc: &mut Assists, ctx: &AssistContext)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
edit.replace_ast(parent_block, ast::BlockExpr::cast(new_block).unwrap());
|
edit.replace_ast(parent_block, ast::BlockExpr::cast(new_block).unwrap());
|
||||||
edit.set_cursor(cursor_position);
|
|
||||||
|
|
||||||
fn replace(
|
fn replace(
|
||||||
new_expr: &SyntaxNode,
|
new_expr: &SyntaxNode,
|
||||||
|
@ -207,7 +205,7 @@ mod tests {
|
||||||
r#"
|
r#"
|
||||||
fn main() {
|
fn main() {
|
||||||
bar();
|
bar();
|
||||||
if<|> !true {
|
if !true {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
foo();
|
foo();
|
||||||
|
@ -237,7 +235,7 @@ mod tests {
|
||||||
r#"
|
r#"
|
||||||
fn main(n: Option<String>) {
|
fn main(n: Option<String>) {
|
||||||
bar();
|
bar();
|
||||||
le<|>t n = match n {
|
let n = match n {
|
||||||
Some(it) => it,
|
Some(it) => it,
|
||||||
_ => return,
|
_ => return,
|
||||||
};
|
};
|
||||||
|
@ -263,7 +261,7 @@ mod tests {
|
||||||
"#,
|
"#,
|
||||||
r#"
|
r#"
|
||||||
fn main() {
|
fn main() {
|
||||||
le<|>t x = match Err(92) {
|
let x = match Err(92) {
|
||||||
Ok(it) => it,
|
Ok(it) => it,
|
||||||
_ => return,
|
_ => return,
|
||||||
};
|
};
|
||||||
|
@ -291,7 +289,7 @@ mod tests {
|
||||||
r#"
|
r#"
|
||||||
fn main(n: Option<String>) {
|
fn main(n: Option<String>) {
|
||||||
bar();
|
bar();
|
||||||
le<|>t n = match n {
|
let n = match n {
|
||||||
Ok(it) => it,
|
Ok(it) => it,
|
||||||
_ => return,
|
_ => return,
|
||||||
};
|
};
|
||||||
|
@ -321,7 +319,7 @@ mod tests {
|
||||||
r#"
|
r#"
|
||||||
fn main() {
|
fn main() {
|
||||||
while true {
|
while true {
|
||||||
if<|> !true {
|
if !true {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
foo();
|
foo();
|
||||||
|
@ -349,7 +347,7 @@ mod tests {
|
||||||
r#"
|
r#"
|
||||||
fn main() {
|
fn main() {
|
||||||
while true {
|
while true {
|
||||||
le<|>t n = match n {
|
let n = match n {
|
||||||
Some(it) => it,
|
Some(it) => it,
|
||||||
_ => continue,
|
_ => continue,
|
||||||
};
|
};
|
||||||
|
@ -378,7 +376,7 @@ mod tests {
|
||||||
r#"
|
r#"
|
||||||
fn main() {
|
fn main() {
|
||||||
loop {
|
loop {
|
||||||
if<|> !true {
|
if !true {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
foo();
|
foo();
|
||||||
|
@ -406,7 +404,7 @@ mod tests {
|
||||||
r#"
|
r#"
|
||||||
fn main() {
|
fn main() {
|
||||||
loop {
|
loop {
|
||||||
le<|>t n = match n {
|
let n = match n {
|
||||||
Some(it) => it,
|
Some(it) => it,
|
||||||
_ => continue,
|
_ => continue,
|
||||||
};
|
};
|
||||||
|
|
|
@ -116,7 +116,6 @@ pub(crate) fn inline_local_variable(acc: &mut Assists, ctx: &AssistContext) -> O
|
||||||
let replacement = if should_wrap { init_in_paren.clone() } else { init_str.clone() };
|
let replacement = if should_wrap { init_in_paren.clone() } else { init_str.clone() };
|
||||||
builder.replace(desc.file_range.range, replacement)
|
builder.replace(desc.file_range.range, replacement)
|
||||||
}
|
}
|
||||||
builder.set_cursor(delete_range.start())
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -149,7 +148,7 @@ fn foo() {
|
||||||
r"
|
r"
|
||||||
fn bar(a: usize) {}
|
fn bar(a: usize) {}
|
||||||
fn foo() {
|
fn foo() {
|
||||||
<|>1 + 1;
|
1 + 1;
|
||||||
if 1 > 10 {
|
if 1 > 10 {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -183,7 +182,7 @@ fn foo() {
|
||||||
r"
|
r"
|
||||||
fn bar(a: usize) {}
|
fn bar(a: usize) {}
|
||||||
fn foo() {
|
fn foo() {
|
||||||
<|>(1 + 1) + 1;
|
(1 + 1) + 1;
|
||||||
if (1 + 1) > 10 {
|
if (1 + 1) > 10 {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -217,7 +216,7 @@ fn foo() {
|
||||||
r"
|
r"
|
||||||
fn bar(a: usize) {}
|
fn bar(a: usize) {}
|
||||||
fn foo() {
|
fn foo() {
|
||||||
<|>bar(1) + 1;
|
bar(1) + 1;
|
||||||
if bar(1) > 10 {
|
if bar(1) > 10 {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -251,7 +250,7 @@ fn foo() {
|
||||||
r"
|
r"
|
||||||
fn bar(a: usize): usize { a }
|
fn bar(a: usize): usize { a }
|
||||||
fn foo() {
|
fn foo() {
|
||||||
<|>(bar(1) as u64) + 1;
|
(bar(1) as u64) + 1;
|
||||||
if (bar(1) as u64) > 10 {
|
if (bar(1) as u64) > 10 {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -283,7 +282,7 @@ fn foo() {
|
||||||
}",
|
}",
|
||||||
r"
|
r"
|
||||||
fn foo() {
|
fn foo() {
|
||||||
<|>{ 10 + 1 } + 1;
|
{ 10 + 1 } + 1;
|
||||||
if { 10 + 1 } > 10 {
|
if { 10 + 1 } > 10 {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -315,7 +314,7 @@ fn foo() {
|
||||||
}",
|
}",
|
||||||
r"
|
r"
|
||||||
fn foo() {
|
fn foo() {
|
||||||
<|>( 10 + 1 ) + 1;
|
( 10 + 1 ) + 1;
|
||||||
if ( 10 + 1 ) > 10 {
|
if ( 10 + 1 ) > 10 {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -353,7 +352,7 @@ fn foo() {
|
||||||
}",
|
}",
|
||||||
r"
|
r"
|
||||||
fn foo() {
|
fn foo() {
|
||||||
<|>let b = bar(10 + 1) * 10;
|
let b = bar(10 + 1) * 10;
|
||||||
let c = bar(10 + 1) as usize;
|
let c = bar(10 + 1) as usize;
|
||||||
}",
|
}",
|
||||||
);
|
);
|
||||||
|
@ -373,7 +372,7 @@ fn foo() {
|
||||||
r"
|
r"
|
||||||
fn foo() {
|
fn foo() {
|
||||||
let x = vec![1, 2, 3];
|
let x = vec![1, 2, 3];
|
||||||
<|>let b = x[0] * 10;
|
let b = x[0] * 10;
|
||||||
let c = x[0] as usize;
|
let c = x[0] as usize;
|
||||||
}",
|
}",
|
||||||
);
|
);
|
||||||
|
@ -393,7 +392,7 @@ fn foo() {
|
||||||
r"
|
r"
|
||||||
fn foo() {
|
fn foo() {
|
||||||
let bar = vec![1];
|
let bar = vec![1];
|
||||||
<|>let b = bar.len() * 10;
|
let b = bar.len() * 10;
|
||||||
let c = bar.len() as usize;
|
let c = bar.len() as usize;
|
||||||
}",
|
}",
|
||||||
);
|
);
|
||||||
|
@ -421,7 +420,7 @@ struct Bar {
|
||||||
|
|
||||||
fn foo() {
|
fn foo() {
|
||||||
let bar = Bar { foo: 1 };
|
let bar = Bar { foo: 1 };
|
||||||
<|>let b = bar.foo * 10;
|
let b = bar.foo * 10;
|
||||||
let c = bar.foo as usize;
|
let c = bar.foo as usize;
|
||||||
}",
|
}",
|
||||||
);
|
);
|
||||||
|
@ -442,7 +441,7 @@ fn foo() -> Option<usize> {
|
||||||
r"
|
r"
|
||||||
fn foo() -> Option<usize> {
|
fn foo() -> Option<usize> {
|
||||||
let bar = Some(1);
|
let bar = Some(1);
|
||||||
<|>let b = bar? * 10;
|
let b = bar? * 10;
|
||||||
let c = bar? as usize;
|
let c = bar? as usize;
|
||||||
None
|
None
|
||||||
}",
|
}",
|
||||||
|
@ -462,7 +461,7 @@ fn foo() {
|
||||||
r"
|
r"
|
||||||
fn foo() {
|
fn foo() {
|
||||||
let bar = 10;
|
let bar = 10;
|
||||||
<|>let b = &bar * 10;
|
let b = &bar * 10;
|
||||||
}",
|
}",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -478,7 +477,7 @@ fn foo() {
|
||||||
}",
|
}",
|
||||||
r"
|
r"
|
||||||
fn foo() {
|
fn foo() {
|
||||||
<|>let b = (10, 20)[0];
|
let b = (10, 20)[0];
|
||||||
}",
|
}",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -494,7 +493,7 @@ fn foo() {
|
||||||
}",
|
}",
|
||||||
r"
|
r"
|
||||||
fn foo() {
|
fn foo() {
|
||||||
<|>let b = [1, 2, 3].len();
|
let b = [1, 2, 3].len();
|
||||||
}",
|
}",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -511,7 +510,7 @@ fn foo() {
|
||||||
}",
|
}",
|
||||||
r"
|
r"
|
||||||
fn foo() {
|
fn foo() {
|
||||||
<|>let b = (10 + 20) * 10;
|
let b = (10 + 20) * 10;
|
||||||
let c = (10 + 20) as usize;
|
let c = (10 + 20) as usize;
|
||||||
}",
|
}",
|
||||||
);
|
);
|
||||||
|
@ -531,7 +530,7 @@ fn foo() {
|
||||||
r"
|
r"
|
||||||
fn foo() {
|
fn foo() {
|
||||||
let d = 10;
|
let d = 10;
|
||||||
<|>let b = d * 10;
|
let b = d * 10;
|
||||||
let c = d as usize;
|
let c = d as usize;
|
||||||
}",
|
}",
|
||||||
);
|
);
|
||||||
|
@ -549,7 +548,7 @@ fn foo() {
|
||||||
}",
|
}",
|
||||||
r"
|
r"
|
||||||
fn foo() {
|
fn foo() {
|
||||||
<|>let b = { 10 } * 10;
|
let b = { 10 } * 10;
|
||||||
let c = { 10 } as usize;
|
let c = { 10 } as usize;
|
||||||
}",
|
}",
|
||||||
);
|
);
|
||||||
|
@ -569,7 +568,7 @@ fn foo() {
|
||||||
}",
|
}",
|
||||||
r"
|
r"
|
||||||
fn foo() {
|
fn foo() {
|
||||||
<|>let b = (10 + 20) * 10;
|
let b = (10 + 20) * 10;
|
||||||
let c = (10 + 20, 20);
|
let c = (10 + 20, 20);
|
||||||
let d = [10 + 20, 10];
|
let d = [10 + 20, 10];
|
||||||
let e = (10 + 20);
|
let e = (10 + 20);
|
||||||
|
@ -588,7 +587,7 @@ fn foo() {
|
||||||
}",
|
}",
|
||||||
r"
|
r"
|
||||||
fn foo() {
|
fn foo() {
|
||||||
<|>for i in vec![10, 20] {}
|
for i in vec![10, 20] {}
|
||||||
}",
|
}",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -604,7 +603,7 @@ fn foo() {
|
||||||
}",
|
}",
|
||||||
r"
|
r"
|
||||||
fn foo() {
|
fn foo() {
|
||||||
<|>while 1 > 0 {}
|
while 1 > 0 {}
|
||||||
}",
|
}",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -622,7 +621,7 @@ fn foo() {
|
||||||
}",
|
}",
|
||||||
r"
|
r"
|
||||||
fn foo() {
|
fn foo() {
|
||||||
<|>loop {
|
loop {
|
||||||
break 1 + 1;
|
break 1 + 1;
|
||||||
}
|
}
|
||||||
}",
|
}",
|
||||||
|
@ -640,7 +639,7 @@ fn foo() {
|
||||||
}",
|
}",
|
||||||
r"
|
r"
|
||||||
fn foo() {
|
fn foo() {
|
||||||
<|>return 1 > 0;
|
return 1 > 0;
|
||||||
}",
|
}",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -656,7 +655,7 @@ fn foo() {
|
||||||
}",
|
}",
|
||||||
r"
|
r"
|
||||||
fn foo() {
|
fn foo() {
|
||||||
<|>match 1 > 0 {}
|
match 1 > 0 {}
|
||||||
}",
|
}",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@ use ra_syntax::{
|
||||||
BLOCK_EXPR, BREAK_EXPR, COMMENT, LAMBDA_EXPR, LOOP_EXPR, MATCH_ARM, PATH_EXPR, RETURN_EXPR,
|
BLOCK_EXPR, BREAK_EXPR, COMMENT, LAMBDA_EXPR, LOOP_EXPR, MATCH_ARM, PATH_EXPR, RETURN_EXPR,
|
||||||
WHITESPACE,
|
WHITESPACE,
|
||||||
},
|
},
|
||||||
SyntaxNode, TextSize,
|
SyntaxNode,
|
||||||
};
|
};
|
||||||
use stdx::format_to;
|
use stdx::format_to;
|
||||||
use test_utils::mark;
|
use test_utils::mark;
|
||||||
|
@ -23,7 +23,7 @@ use crate::{AssistContext, AssistId, Assists};
|
||||||
// ->
|
// ->
|
||||||
// ```
|
// ```
|
||||||
// fn main() {
|
// fn main() {
|
||||||
// let var_name = (1 + 2);
|
// let $0var_name = (1 + 2);
|
||||||
// var_name * 4;
|
// var_name * 4;
|
||||||
// }
|
// }
|
||||||
// ```
|
// ```
|
||||||
|
@ -46,14 +46,13 @@ pub(crate) fn introduce_variable(acc: &mut Assists, ctx: &AssistContext) -> Opti
|
||||||
acc.add(AssistId("introduce_variable"), "Extract into variable", target, move |edit| {
|
acc.add(AssistId("introduce_variable"), "Extract into variable", target, move |edit| {
|
||||||
let mut buf = String::new();
|
let mut buf = String::new();
|
||||||
|
|
||||||
let cursor_offset = if wrap_in_block {
|
if wrap_in_block {
|
||||||
buf.push_str("{ let var_name = ");
|
buf.push_str("{ let var_name = ");
|
||||||
TextSize::of("{ let ")
|
|
||||||
} else {
|
} else {
|
||||||
buf.push_str("let var_name = ");
|
buf.push_str("let var_name = ");
|
||||||
TextSize::of("let ")
|
|
||||||
};
|
};
|
||||||
format_to!(buf, "{}", expr.syntax());
|
format_to!(buf, "{}", expr.syntax());
|
||||||
|
|
||||||
let full_stmt = ast::ExprStmt::cast(anchor_stmt.clone());
|
let full_stmt = ast::ExprStmt::cast(anchor_stmt.clone());
|
||||||
let is_full_stmt = if let Some(expr_stmt) = &full_stmt {
|
let is_full_stmt = if let Some(expr_stmt) = &full_stmt {
|
||||||
Some(expr.syntax().clone()) == expr_stmt.expr().map(|e| e.syntax().clone())
|
Some(expr.syntax().clone()) == expr_stmt.expr().map(|e| e.syntax().clone())
|
||||||
|
@ -65,8 +64,17 @@ pub(crate) fn introduce_variable(acc: &mut Assists, ctx: &AssistContext) -> Opti
|
||||||
if full_stmt.unwrap().semicolon_token().is_none() {
|
if full_stmt.unwrap().semicolon_token().is_none() {
|
||||||
buf.push_str(";");
|
buf.push_str(";");
|
||||||
}
|
}
|
||||||
edit.replace(expr.syntax().text_range(), buf);
|
let offset = expr.syntax().text_range();
|
||||||
} else {
|
match ctx.config.snippet_cap {
|
||||||
|
Some(cap) => {
|
||||||
|
let snip = buf.replace("let var_name", "let $0var_name");
|
||||||
|
edit.replace_snippet(cap, offset, snip)
|
||||||
|
}
|
||||||
|
None => edit.replace(offset, buf),
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
buf.push_str(";");
|
buf.push_str(";");
|
||||||
|
|
||||||
// We want to maintain the indent level,
|
// We want to maintain the indent level,
|
||||||
|
@ -81,12 +89,18 @@ pub(crate) fn introduce_variable(acc: &mut Assists, ctx: &AssistContext) -> Opti
|
||||||
}
|
}
|
||||||
|
|
||||||
edit.replace(expr.syntax().text_range(), "var_name".to_string());
|
edit.replace(expr.syntax().text_range(), "var_name".to_string());
|
||||||
edit.insert(anchor_stmt.text_range().start(), buf);
|
let offset = anchor_stmt.text_range().start();
|
||||||
|
match ctx.config.snippet_cap {
|
||||||
|
Some(cap) => {
|
||||||
|
let snip = buf.replace("let var_name", "let $0var_name");
|
||||||
|
edit.insert_snippet(cap, offset, snip)
|
||||||
|
}
|
||||||
|
None => edit.insert(offset, buf),
|
||||||
|
}
|
||||||
|
|
||||||
if wrap_in_block {
|
if wrap_in_block {
|
||||||
edit.insert(anchor_stmt.text_range().end(), " }");
|
edit.insert(anchor_stmt.text_range().end(), " }");
|
||||||
}
|
}
|
||||||
}
|
|
||||||
edit.set_cursor(anchor_stmt.text_range().start() + cursor_offset);
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -144,15 +158,15 @@ mod tests {
|
||||||
fn test_introduce_var_simple() {
|
fn test_introduce_var_simple() {
|
||||||
check_assist(
|
check_assist(
|
||||||
introduce_variable,
|
introduce_variable,
|
||||||
"
|
r#"
|
||||||
fn foo() {
|
fn foo() {
|
||||||
foo(<|>1 + 1<|>);
|
foo(<|>1 + 1<|>);
|
||||||
}",
|
}"#,
|
||||||
"
|
r#"
|
||||||
fn foo() {
|
fn foo() {
|
||||||
let <|>var_name = 1 + 1;
|
let $0var_name = 1 + 1;
|
||||||
foo(var_name);
|
foo(var_name);
|
||||||
}",
|
}"#,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -167,14 +181,14 @@ fn foo() {
|
||||||
mark::check!(test_introduce_var_expr_stmt);
|
mark::check!(test_introduce_var_expr_stmt);
|
||||||
check_assist(
|
check_assist(
|
||||||
introduce_variable,
|
introduce_variable,
|
||||||
"
|
r#"
|
||||||
fn foo() {
|
fn foo() {
|
||||||
<|>1 + 1<|>;
|
<|>1 + 1<|>;
|
||||||
}",
|
}"#,
|
||||||
"
|
r#"
|
||||||
fn foo() {
|
fn foo() {
|
||||||
let <|>var_name = 1 + 1;
|
let $0var_name = 1 + 1;
|
||||||
}",
|
}"#,
|
||||||
);
|
);
|
||||||
check_assist(
|
check_assist(
|
||||||
introduce_variable,
|
introduce_variable,
|
||||||
|
@ -185,7 +199,7 @@ fn foo() {
|
||||||
}",
|
}",
|
||||||
"
|
"
|
||||||
fn foo() {
|
fn foo() {
|
||||||
let <|>var_name = { let x = 0; x };
|
let $0var_name = { let x = 0; x };
|
||||||
something_else();
|
something_else();
|
||||||
}",
|
}",
|
||||||
);
|
);
|
||||||
|
@ -201,7 +215,7 @@ fn foo() {
|
||||||
}",
|
}",
|
||||||
"
|
"
|
||||||
fn foo() {
|
fn foo() {
|
||||||
let <|>var_name = 1;
|
let $0var_name = 1;
|
||||||
var_name + 1;
|
var_name + 1;
|
||||||
}",
|
}",
|
||||||
);
|
);
|
||||||
|
@ -218,7 +232,7 @@ fn foo() {
|
||||||
}",
|
}",
|
||||||
"
|
"
|
||||||
fn foo() {
|
fn foo() {
|
||||||
let <|>var_name = 1 + 1;
|
let $0var_name = 1 + 1;
|
||||||
bar(var_name)
|
bar(var_name)
|
||||||
}",
|
}",
|
||||||
);
|
);
|
||||||
|
@ -230,7 +244,7 @@ fn foo() {
|
||||||
}",
|
}",
|
||||||
"
|
"
|
||||||
fn foo() {
|
fn foo() {
|
||||||
let <|>var_name = bar(1 + 1);
|
let $0var_name = bar(1 + 1);
|
||||||
var_name
|
var_name
|
||||||
}",
|
}",
|
||||||
)
|
)
|
||||||
|
@ -253,7 +267,7 @@ fn main() {
|
||||||
fn main() {
|
fn main() {
|
||||||
let x = true;
|
let x = true;
|
||||||
let tuple = match x {
|
let tuple = match x {
|
||||||
true => { let <|>var_name = 2 + 2; (var_name, true) }
|
true => { let $0var_name = 2 + 2; (var_name, true) }
|
||||||
_ => (0, false)
|
_ => (0, false)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -283,7 +297,7 @@ fn main() {
|
||||||
let tuple = match x {
|
let tuple = match x {
|
||||||
true => {
|
true => {
|
||||||
let y = 1;
|
let y = 1;
|
||||||
let <|>var_name = 2 + y;
|
let $0var_name = 2 + y;
|
||||||
(var_name, true)
|
(var_name, true)
|
||||||
}
|
}
|
||||||
_ => (0, false)
|
_ => (0, false)
|
||||||
|
@ -304,7 +318,7 @@ fn main() {
|
||||||
",
|
",
|
||||||
"
|
"
|
||||||
fn main() {
|
fn main() {
|
||||||
let lambda = |x: u32| { let <|>var_name = x * 2; var_name };
|
let lambda = |x: u32| { let $0var_name = x * 2; var_name };
|
||||||
}
|
}
|
||||||
",
|
",
|
||||||
);
|
);
|
||||||
|
@ -321,7 +335,7 @@ fn main() {
|
||||||
",
|
",
|
||||||
"
|
"
|
||||||
fn main() {
|
fn main() {
|
||||||
let lambda = |x: u32| { let <|>var_name = x * 2; var_name };
|
let lambda = |x: u32| { let $0var_name = x * 2; var_name };
|
||||||
}
|
}
|
||||||
",
|
",
|
||||||
);
|
);
|
||||||
|
@ -338,7 +352,7 @@ fn main() {
|
||||||
",
|
",
|
||||||
"
|
"
|
||||||
fn main() {
|
fn main() {
|
||||||
let <|>var_name = Some(true);
|
let $0var_name = Some(true);
|
||||||
let o = var_name;
|
let o = var_name;
|
||||||
}
|
}
|
||||||
",
|
",
|
||||||
|
@ -356,7 +370,7 @@ fn main() {
|
||||||
",
|
",
|
||||||
"
|
"
|
||||||
fn main() {
|
fn main() {
|
||||||
let <|>var_name = bar.foo();
|
let $0var_name = bar.foo();
|
||||||
let v = var_name;
|
let v = var_name;
|
||||||
}
|
}
|
||||||
",
|
",
|
||||||
|
@ -374,7 +388,7 @@ fn foo() -> u32 {
|
||||||
",
|
",
|
||||||
"
|
"
|
||||||
fn foo() -> u32 {
|
fn foo() -> u32 {
|
||||||
let <|>var_name = 2 + 2;
|
let $0var_name = 2 + 2;
|
||||||
return var_name;
|
return var_name;
|
||||||
}
|
}
|
||||||
",
|
",
|
||||||
|
@ -396,7 +410,7 @@ fn foo() -> u32 {
|
||||||
fn foo() -> u32 {
|
fn foo() -> u32 {
|
||||||
|
|
||||||
|
|
||||||
let <|>var_name = 2 + 2;
|
let $0var_name = 2 + 2;
|
||||||
return var_name;
|
return var_name;
|
||||||
}
|
}
|
||||||
",
|
",
|
||||||
|
@ -413,7 +427,7 @@ fn foo() -> u32 {
|
||||||
"
|
"
|
||||||
fn foo() -> u32 {
|
fn foo() -> u32 {
|
||||||
|
|
||||||
let <|>var_name = 2 + 2;
|
let $0var_name = 2 + 2;
|
||||||
return var_name;
|
return var_name;
|
||||||
}
|
}
|
||||||
",
|
",
|
||||||
|
@ -438,7 +452,7 @@ fn foo() -> u32 {
|
||||||
// bar
|
// bar
|
||||||
|
|
||||||
|
|
||||||
let <|>var_name = 2 + 2;
|
let $0var_name = 2 + 2;
|
||||||
return var_name;
|
return var_name;
|
||||||
}
|
}
|
||||||
",
|
",
|
||||||
|
@ -459,7 +473,7 @@ fn main() {
|
||||||
"
|
"
|
||||||
fn main() {
|
fn main() {
|
||||||
let result = loop {
|
let result = loop {
|
||||||
let <|>var_name = 2 + 2;
|
let $0var_name = 2 + 2;
|
||||||
break var_name;
|
break var_name;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -478,7 +492,7 @@ fn main() {
|
||||||
",
|
",
|
||||||
"
|
"
|
||||||
fn main() {
|
fn main() {
|
||||||
let <|>var_name = 0f32 as u32;
|
let $0var_name = 0f32 as u32;
|
||||||
let v = var_name;
|
let v = var_name;
|
||||||
}
|
}
|
||||||
",
|
",
|
||||||
|
|
|
@ -58,8 +58,6 @@ pub(crate) fn merge_imports(acc: &mut Assists, ctx: &AssistContext) -> Option<()
|
||||||
let target = tree.syntax().text_range();
|
let target = tree.syntax().text_range();
|
||||||
acc.add(AssistId("merge_imports"), "Merge imports", target, |builder| {
|
acc.add(AssistId("merge_imports"), "Merge imports", target, |builder| {
|
||||||
builder.rewrite(rewriter);
|
builder.rewrite(rewriter);
|
||||||
// FIXME: we only need because our diff is imprecise
|
|
||||||
builder.set_cursor(offset);
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -142,7 +140,7 @@ use std::fmt<|>::Debug;
|
||||||
use std::fmt::Display;
|
use std::fmt::Display;
|
||||||
",
|
",
|
||||||
r"
|
r"
|
||||||
use std::fmt<|>::{Debug, Display};
|
use std::fmt::{Debug, Display};
|
||||||
",
|
",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -156,7 +154,7 @@ use std::fmt::Debug;
|
||||||
use std::fmt<|>::Display;
|
use std::fmt<|>::Display;
|
||||||
",
|
",
|
||||||
r"
|
r"
|
||||||
use std::fmt:<|>:{Display, Debug};
|
use std::fmt::{Display, Debug};
|
||||||
",
|
",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -169,7 +167,7 @@ use std::fmt:<|>:{Display, Debug};
|
||||||
use std::{fmt<|>::Debug, fmt::Display};
|
use std::{fmt<|>::Debug, fmt::Display};
|
||||||
",
|
",
|
||||||
r"
|
r"
|
||||||
use std::{fmt<|>::{Debug, Display}};
|
use std::{fmt::{Debug, Display}};
|
||||||
",
|
",
|
||||||
);
|
);
|
||||||
check_assist(
|
check_assist(
|
||||||
|
@ -178,7 +176,7 @@ use std::{fmt<|>::{Debug, Display}};
|
||||||
use std::{fmt::Debug, fmt<|>::Display};
|
use std::{fmt::Debug, fmt<|>::Display};
|
||||||
",
|
",
|
||||||
r"
|
r"
|
||||||
use std::{fmt::<|>{Display, Debug}};
|
use std::{fmt::{Display, Debug}};
|
||||||
",
|
",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -192,7 +190,7 @@ use std<|>::cell::*;
|
||||||
use std::str;
|
use std::str;
|
||||||
",
|
",
|
||||||
r"
|
r"
|
||||||
use std<|>::{cell::*, str};
|
use std::{cell::*, str};
|
||||||
",
|
",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -206,7 +204,7 @@ use std<|>::cell::*;
|
||||||
use std::str::*;
|
use std::str::*;
|
||||||
",
|
",
|
||||||
r"
|
r"
|
||||||
use std<|>::{cell::*, str::*};
|
use std::{cell::*, str::*};
|
||||||
",
|
",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -222,7 +220,7 @@ use foo::baz;
|
||||||
/// Doc comment
|
/// Doc comment
|
||||||
",
|
",
|
||||||
r"
|
r"
|
||||||
use foo<|>::{bar, baz};
|
use foo::{bar, baz};
|
||||||
|
|
||||||
/// Doc comment
|
/// Doc comment
|
||||||
",
|
",
|
||||||
|
@ -241,7 +239,7 @@ use {
|
||||||
",
|
",
|
||||||
r"
|
r"
|
||||||
use {
|
use {
|
||||||
foo<|>::{bar, baz},
|
foo::{bar, baz},
|
||||||
};
|
};
|
||||||
",
|
",
|
||||||
);
|
);
|
||||||
|
@ -255,7 +253,7 @@ use {
|
||||||
",
|
",
|
||||||
r"
|
r"
|
||||||
use {
|
use {
|
||||||
foo::{bar<|>, baz},
|
foo::{bar, baz},
|
||||||
};
|
};
|
||||||
",
|
",
|
||||||
);
|
);
|
||||||
|
@ -272,7 +270,7 @@ use foo::<|>{
|
||||||
};
|
};
|
||||||
",
|
",
|
||||||
r"
|
r"
|
||||||
use foo::{<|>
|
use foo::{
|
||||||
FooBar,
|
FooBar,
|
||||||
bar::baz};
|
bar::baz};
|
||||||
",
|
",
|
||||||
|
|
|
@ -3,7 +3,7 @@ use std::iter::successors;
|
||||||
use ra_syntax::{
|
use ra_syntax::{
|
||||||
algo::neighbor,
|
algo::neighbor,
|
||||||
ast::{self, AstNode},
|
ast::{self, AstNode},
|
||||||
Direction, TextSize,
|
Direction,
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::{AssistContext, AssistId, Assists, TextRange};
|
use crate::{AssistContext, AssistId, Assists, TextRange};
|
||||||
|
@ -41,17 +41,6 @@ pub(crate) fn merge_match_arms(acc: &mut Assists, ctx: &AssistContext) -> Option
|
||||||
let current_expr = current_arm.expr()?;
|
let current_expr = current_arm.expr()?;
|
||||||
let current_text_range = current_arm.syntax().text_range();
|
let current_text_range = current_arm.syntax().text_range();
|
||||||
|
|
||||||
enum CursorPos {
|
|
||||||
InExpr(TextSize),
|
|
||||||
InPat(TextSize),
|
|
||||||
}
|
|
||||||
let cursor_pos = ctx.offset();
|
|
||||||
let cursor_pos = if current_expr.syntax().text_range().contains(cursor_pos) {
|
|
||||||
CursorPos::InExpr(current_text_range.end() - cursor_pos)
|
|
||||||
} else {
|
|
||||||
CursorPos::InPat(cursor_pos)
|
|
||||||
};
|
|
||||||
|
|
||||||
// We check if the following match arms match this one. We could, but don't,
|
// We check if the following match arms match this one. We could, but don't,
|
||||||
// compare to the previous match arm as well.
|
// compare to the previous match arm as well.
|
||||||
let arms_to_merge = successors(Some(current_arm), |it| neighbor(it, Direction::Next))
|
let arms_to_merge = successors(Some(current_arm), |it| neighbor(it, Direction::Next))
|
||||||
|
@ -87,10 +76,6 @@ pub(crate) fn merge_match_arms(acc: &mut Assists, ctx: &AssistContext) -> Option
|
||||||
let start = arms_to_merge.first().unwrap().syntax().text_range().start();
|
let start = arms_to_merge.first().unwrap().syntax().text_range().start();
|
||||||
let end = arms_to_merge.last().unwrap().syntax().text_range().end();
|
let end = arms_to_merge.last().unwrap().syntax().text_range().end();
|
||||||
|
|
||||||
edit.set_cursor(match cursor_pos {
|
|
||||||
CursorPos::InExpr(back_offset) => start + TextSize::of(&arm) - back_offset,
|
|
||||||
CursorPos::InPat(offset) => offset,
|
|
||||||
});
|
|
||||||
edit.replace(TextRange::new(start, end), arm);
|
edit.replace(TextRange::new(start, end), arm);
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -132,7 +117,7 @@ mod tests {
|
||||||
fn main() {
|
fn main() {
|
||||||
let x = X::A;
|
let x = X::A;
|
||||||
let y = match x {
|
let y = match x {
|
||||||
X::A | X::B => { 1i32<|> }
|
X::A | X::B => { 1i32 }
|
||||||
X::C => { 2i32 }
|
X::C => { 2i32 }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -164,7 +149,7 @@ mod tests {
|
||||||
fn main() {
|
fn main() {
|
||||||
let x = X::A;
|
let x = X::A;
|
||||||
let y = match x {
|
let y = match x {
|
||||||
X::A | X::B | X::C | X::D => {<|> 1i32 },
|
X::A | X::B | X::C | X::D => { 1i32 },
|
||||||
X::E => { 2i32 },
|
X::E => { 2i32 },
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -197,7 +182,7 @@ mod tests {
|
||||||
let x = X::A;
|
let x = X::A;
|
||||||
let y = match x {
|
let y = match x {
|
||||||
X::A => { 1i32 },
|
X::A => { 1i32 },
|
||||||
_ => { 2i<|>32 }
|
_ => { 2i32 }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
"#,
|
"#,
|
||||||
|
@ -226,7 +211,7 @@ mod tests {
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
match X::A {
|
match X::A {
|
||||||
X::A<|> | X::B | X::C => 92,
|
X::A | X::B | X::C => 92,
|
||||||
X::D => 62,
|
X::D => 62,
|
||||||
_ => panic!(),
|
_ => panic!(),
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
use ra_syntax::{
|
use ra_syntax::{
|
||||||
ast,
|
ast::{AstNode, IfExpr, MatchArm},
|
||||||
ast::{AstNode, AstToken, IfExpr, MatchArm},
|
SyntaxKind::WHITESPACE,
|
||||||
TextSize,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::{AssistContext, AssistId, Assists};
|
use crate::{AssistContext, AssistId, Assists};
|
||||||
|
@ -42,24 +41,15 @@ pub(crate) fn move_guard_to_arm_body(acc: &mut Assists, ctx: &AssistContext) ->
|
||||||
|
|
||||||
let target = guard.syntax().text_range();
|
let target = guard.syntax().text_range();
|
||||||
acc.add(AssistId("move_guard_to_arm_body"), "Move guard to arm body", target, |edit| {
|
acc.add(AssistId("move_guard_to_arm_body"), "Move guard to arm body", target, |edit| {
|
||||||
let offseting_amount = match space_before_guard.and_then(|it| it.into_token()) {
|
match space_before_guard {
|
||||||
Some(tok) => {
|
Some(element) if element.kind() == WHITESPACE => {
|
||||||
if ast::Whitespace::cast(tok.clone()).is_some() {
|
edit.delete(element.text_range());
|
||||||
let ele = tok.text_range();
|
|
||||||
edit.delete(ele);
|
|
||||||
ele.len()
|
|
||||||
} else {
|
|
||||||
TextSize::from(0)
|
|
||||||
}
|
}
|
||||||
}
|
_ => (),
|
||||||
_ => TextSize::from(0),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
edit.delete(guard.syntax().text_range());
|
edit.delete(guard.syntax().text_range());
|
||||||
edit.replace_node_and_indent(arm_expr.syntax(), buf);
|
edit.replace_node_and_indent(arm_expr.syntax(), buf);
|
||||||
edit.set_cursor(
|
|
||||||
arm_expr.syntax().text_range().start() + TextSize::from(3) - offseting_amount,
|
|
||||||
);
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -124,7 +114,6 @@ pub(crate) fn move_arm_cond_to_match_guard(acc: &mut Assists, ctx: &AssistContex
|
||||||
}
|
}
|
||||||
|
|
||||||
edit.insert(match_pat.syntax().text_range().end(), buf);
|
edit.insert(match_pat.syntax().text_range().end(), buf);
|
||||||
edit.set_cursor(match_pat.syntax().text_range().end() + TextSize::from(1));
|
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -172,7 +161,7 @@ mod tests {
|
||||||
let t = 'a';
|
let t = 'a';
|
||||||
let chars = "abcd";
|
let chars = "abcd";
|
||||||
match t {
|
match t {
|
||||||
'\r' => if chars.clone().next() == Some('\n') { <|>false },
|
'\r' => if chars.clone().next() == Some('\n') { false },
|
||||||
_ => true
|
_ => true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -195,7 +184,7 @@ mod tests {
|
||||||
r#"
|
r#"
|
||||||
fn f() {
|
fn f() {
|
||||||
match x {
|
match x {
|
||||||
y @ 4 | y @ 5 => if y > 5 { <|>true },
|
y @ 4 | y @ 5 => if y > 5 { true },
|
||||||
_ => false
|
_ => false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -222,7 +211,7 @@ mod tests {
|
||||||
let t = 'a';
|
let t = 'a';
|
||||||
let chars = "abcd";
|
let chars = "abcd";
|
||||||
match t {
|
match t {
|
||||||
'\r' <|>if chars.clone().next() == Some('\n') => false,
|
'\r' if chars.clone().next() == Some('\n') => false,
|
||||||
_ => true
|
_ => true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -266,7 +255,7 @@ mod tests {
|
||||||
let t = 'a';
|
let t = 'a';
|
||||||
let chars = "abcd";
|
let chars = "abcd";
|
||||||
match t {
|
match t {
|
||||||
'\r' <|>if chars.clone().next().is_some() => { },
|
'\r' if chars.clone().next().is_some() => { },
|
||||||
_ => true
|
_ => true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -296,7 +285,7 @@ mod tests {
|
||||||
let mut t = 'a';
|
let mut t = 'a';
|
||||||
let chars = "abcd";
|
let chars = "abcd";
|
||||||
match t {
|
match t {
|
||||||
'\r' <|>if chars.clone().next().is_some() => {
|
'\r' if chars.clone().next().is_some() => {
|
||||||
t = 'e';
|
t = 'e';
|
||||||
false
|
false
|
||||||
},
|
},
|
||||||
|
|
|
@ -29,26 +29,6 @@ pub(crate) fn remove_dbg(acc: &mut Assists, ctx: &AssistContext) -> Option<()> {
|
||||||
|
|
||||||
let macro_range = macro_call.syntax().text_range();
|
let macro_range = macro_call.syntax().text_range();
|
||||||
|
|
||||||
// If the cursor is inside the macro call, we'll try to maintain the cursor
|
|
||||||
// position by subtracting the length of dbg!( from the start of the file
|
|
||||||
// range, otherwise we'll default to using the start of the macro call
|
|
||||||
let cursor_pos = {
|
|
||||||
let file_range = ctx.frange.range;
|
|
||||||
|
|
||||||
let offset_start = file_range
|
|
||||||
.start()
|
|
||||||
.checked_sub(macro_range.start())
|
|
||||||
.unwrap_or_else(|| TextSize::from(0));
|
|
||||||
|
|
||||||
let dbg_size = TextSize::of("dbg!(");
|
|
||||||
|
|
||||||
if offset_start > dbg_size {
|
|
||||||
file_range.start() - dbg_size
|
|
||||||
} else {
|
|
||||||
macro_range.start()
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
let macro_content = {
|
let macro_content = {
|
||||||
let macro_args = macro_call.token_tree()?.syntax().clone();
|
let macro_args = macro_call.token_tree()?.syntax().clone();
|
||||||
|
|
||||||
|
@ -58,9 +38,8 @@ pub(crate) fn remove_dbg(acc: &mut Assists, ctx: &AssistContext) -> Option<()> {
|
||||||
};
|
};
|
||||||
|
|
||||||
let target = macro_call.syntax().text_range();
|
let target = macro_call.syntax().text_range();
|
||||||
acc.add(AssistId("remove_dbg"), "Remove dbg!()", target, |edit| {
|
acc.add(AssistId("remove_dbg"), "Remove dbg!()", target, |builder| {
|
||||||
edit.replace(macro_range, macro_content);
|
builder.replace(macro_range, macro_content);
|
||||||
edit.set_cursor(cursor_pos);
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,13 +73,13 @@ mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_remove_dbg() {
|
fn test_remove_dbg() {
|
||||||
check_assist(remove_dbg, "<|>dbg!(1 + 1)", "<|>1 + 1");
|
check_assist(remove_dbg, "<|>dbg!(1 + 1)", "1 + 1");
|
||||||
|
|
||||||
check_assist(remove_dbg, "dbg!<|>((1 + 1))", "<|>(1 + 1)");
|
check_assist(remove_dbg, "dbg!<|>((1 + 1))", "(1 + 1)");
|
||||||
|
|
||||||
check_assist(remove_dbg, "dbg!(1 <|>+ 1)", "1 <|>+ 1");
|
check_assist(remove_dbg, "dbg!(1 <|>+ 1)", "1 + 1");
|
||||||
|
|
||||||
check_assist(remove_dbg, "let _ = <|>dbg!(1 + 1)", "let _ = <|>1 + 1");
|
check_assist(remove_dbg, "let _ = <|>dbg!(1 + 1)", "let _ = 1 + 1");
|
||||||
|
|
||||||
check_assist(
|
check_assist(
|
||||||
remove_dbg,
|
remove_dbg,
|
||||||
|
@ -113,7 +92,7 @@ fn foo(n: usize) {
|
||||||
",
|
",
|
||||||
"
|
"
|
||||||
fn foo(n: usize) {
|
fn foo(n: usize) {
|
||||||
if let Some(_) = n.<|>checked_sub(4) {
|
if let Some(_) = n.checked_sub(4) {
|
||||||
// ...
|
// ...
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -122,8 +101,8 @@ fn foo(n: usize) {
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn test_remove_dbg_with_brackets_and_braces() {
|
fn test_remove_dbg_with_brackets_and_braces() {
|
||||||
check_assist(remove_dbg, "dbg![<|>1 + 1]", "<|>1 + 1");
|
check_assist(remove_dbg, "dbg![<|>1 + 1]", "1 + 1");
|
||||||
check_assist(remove_dbg, "dbg!{<|>1 + 1}", "<|>1 + 1");
|
check_assist(remove_dbg, "dbg!{<|>1 + 1}", "1 + 1");
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
|
@ -26,8 +26,7 @@ pub(crate) fn remove_mut(acc: &mut Assists, ctx: &AssistContext) -> Option<()> {
|
||||||
};
|
};
|
||||||
|
|
||||||
let target = mut_token.text_range();
|
let target = mut_token.text_range();
|
||||||
acc.add(AssistId("remove_mut"), "Remove `mut` keyword", target, |edit| {
|
acc.add(AssistId("remove_mut"), "Remove `mut` keyword", target, |builder| {
|
||||||
edit.set_cursor(delete_from);
|
builder.delete(TextRange::new(delete_from, delete_to));
|
||||||
edit.delete(TextRange::new(delete_from, delete_to));
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -443,7 +443,7 @@ fn main() {
|
||||||
"#####,
|
"#####,
|
||||||
r#####"
|
r#####"
|
||||||
fn main() {
|
fn main() {
|
||||||
let var_name = (1 + 2);
|
let $0var_name = (1 + 2);
|
||||||
var_name * 4;
|
var_name * 4;
|
||||||
}
|
}
|
||||||
"#####,
|
"#####,
|
||||||
|
|
|
@ -426,7 +426,7 @@ fn main() {
|
||||||
|
|
||||||
// AFTER
|
// AFTER
|
||||||
fn main() {
|
fn main() {
|
||||||
let var_name = (1 + 2);
|
let $0var_name = (1 + 2);
|
||||||
var_name * 4;
|
var_name * 4;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
Loading…
Reference in a new issue