feat: auto-indent use tree lists
This commit is contained in:
parent
17038756ba
commit
e718c6b3e8
@ -54,6 +54,14 @@ pub(crate) fn on_enter(db: &RootDatabase, position: FilePosition) -> Option<Text
|
|||||||
cov_mark::hit!(indent_block_contents);
|
cov_mark::hit!(indent_block_contents);
|
||||||
return Some(edit);
|
return Some(edit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Typing enter after the `{` of a use tree list.
|
||||||
|
if let Some(edit) = find_node_at_offset(file.syntax(), position.offset - TextSize::of('{'))
|
||||||
|
.and_then(|list| on_enter_in_use_tree_list(list, position))
|
||||||
|
{
|
||||||
|
cov_mark::hit!(indent_block_contents);
|
||||||
|
return Some(edit);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
None
|
None
|
||||||
@ -111,6 +119,21 @@ fn on_enter_in_block(block: ast::BlockExpr, position: FilePosition) -> Option<Te
|
|||||||
Some(edit)
|
Some(edit)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn on_enter_in_use_tree_list(list: ast::UseTreeList, position: FilePosition) -> Option<TextEdit> {
|
||||||
|
if list.syntax().text().contains_char('\n') {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
let indent = IndentLevel::from_node(list.syntax());
|
||||||
|
let mut edit = TextEdit::insert(position.offset, format!("\n{}$0", indent + 1));
|
||||||
|
edit.union(TextEdit::insert(
|
||||||
|
list.r_curly_token()?.text_range().start(),
|
||||||
|
format!("\n{}", indent),
|
||||||
|
))
|
||||||
|
.ok()?;
|
||||||
|
Some(edit)
|
||||||
|
}
|
||||||
|
|
||||||
fn block_contents(block: &ast::BlockExpr) -> Option<SyntaxNode> {
|
fn block_contents(block: &ast::BlockExpr) -> Option<SyntaxNode> {
|
||||||
let mut node = block.tail_expr().map(|e| e.syntax().clone());
|
let mut node = block.tail_expr().map(|e| e.syntax().clone());
|
||||||
|
|
||||||
@ -484,4 +507,96 @@ fn f() {$0
|
|||||||
"#,
|
"#,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn indents_use_tree_list() {
|
||||||
|
do_check(
|
||||||
|
r#"
|
||||||
|
use crate::{$0};
|
||||||
|
"#,
|
||||||
|
r#"
|
||||||
|
use crate::{
|
||||||
|
$0
|
||||||
|
};
|
||||||
|
"#,
|
||||||
|
);
|
||||||
|
do_check(
|
||||||
|
r#"
|
||||||
|
use crate::{$0Object, path::to::OtherThing};
|
||||||
|
"#,
|
||||||
|
r#"
|
||||||
|
use crate::{
|
||||||
|
$0Object, path::to::OtherThing
|
||||||
|
};
|
||||||
|
"#,
|
||||||
|
);
|
||||||
|
do_check(
|
||||||
|
r#"
|
||||||
|
use {crate::{$0Object, path::to::OtherThing}};
|
||||||
|
"#,
|
||||||
|
r#"
|
||||||
|
use {crate::{
|
||||||
|
$0Object, path::to::OtherThing
|
||||||
|
}};
|
||||||
|
"#,
|
||||||
|
);
|
||||||
|
do_check(
|
||||||
|
r#"
|
||||||
|
use {
|
||||||
|
crate::{$0Object, path::to::OtherThing}
|
||||||
|
};
|
||||||
|
"#,
|
||||||
|
r#"
|
||||||
|
use {
|
||||||
|
crate::{
|
||||||
|
$0Object, path::to::OtherThing
|
||||||
|
}
|
||||||
|
};
|
||||||
|
"#,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn does_not_indent_use_tree_list_when_not_at_curly_brace() {
|
||||||
|
do_check_noop(
|
||||||
|
r#"
|
||||||
|
use path::{Thing$0};
|
||||||
|
"#,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn does_not_indent_use_tree_list_without_curly_braces() {
|
||||||
|
do_check_noop(
|
||||||
|
r#"
|
||||||
|
use path::Thing$0;
|
||||||
|
"#,
|
||||||
|
);
|
||||||
|
do_check_noop(
|
||||||
|
r#"
|
||||||
|
use path::$0Thing;
|
||||||
|
"#,
|
||||||
|
);
|
||||||
|
do_check_noop(
|
||||||
|
r#"
|
||||||
|
use path::Thing$0};
|
||||||
|
"#,
|
||||||
|
);
|
||||||
|
do_check_noop(
|
||||||
|
r#"
|
||||||
|
use path::{$0Thing;
|
||||||
|
"#,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn does_not_indent_multiline_use_tree_list() {
|
||||||
|
do_check_noop(
|
||||||
|
r#"
|
||||||
|
use path::{$0
|
||||||
|
Thing
|
||||||
|
};
|
||||||
|
"#,
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user