Skip to content

Commit 5af66e5

Browse files
bors[bot]matklad
andauthored
Merge #4387
4387: More fluent indent API r=matklad a=matklad bors r+ 🤖 Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
2 parents 25e37e2 + 231fdda commit 5af66e5

File tree

8 files changed

+46
-35
lines changed

8 files changed

+46
-35
lines changed

crates/ra_assists/src/assist_context.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ use crate::{Assist, AssistId, GroupLabel, ResolvedAssist};
4949
/// easier to just compute the edit eagerly :-)
5050
pub(crate) struct AssistContext<'a> {
5151
pub(crate) sema: Semantics<'a, RootDatabase>,
52-
pub(super) db: &'a RootDatabase,
52+
pub(crate) db: &'a RootDatabase,
5353
pub(crate) frange: FileRange,
5454
source_file: SourceFile,
5555
}

crates/ra_assists/src/handlers/add_function.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
use hir::HirDisplay;
22
use ra_db::FileId;
33
use ra_syntax::{
4-
ast::{self, edit::IndentLevel, ArgListOwner, AstNode, ModuleItemOwner},
4+
ast::{
5+
self,
6+
edit::{AstNodeEdit, IndentLevel},
7+
ArgListOwner, AstNode, ModuleItemOwner,
8+
},
59
SyntaxKind, SyntaxNode, TextSize,
610
};
711
use rustc_hash::{FxHashMap, FxHashSet};
@@ -116,17 +120,16 @@ impl FunctionBuilder {
116120
let (fn_def, insert_offset) = match self.target {
117121
GeneratedFunctionTarget::BehindItem(it) => {
118122
let with_leading_blank_line = ast::make::add_leading_newlines(2, fn_def);
119-
let indented = IndentLevel::from_node(&it).increase_indent(with_leading_blank_line);
123+
let indented = with_leading_blank_line.indent(IndentLevel::from_node(&it));
120124
(indented, it.text_range().end())
121125
}
122126
GeneratedFunctionTarget::InEmptyItemList(it) => {
123127
let indent_once = IndentLevel(1);
124128
let indent = IndentLevel::from_node(it.syntax());
125-
126129
let fn_def = ast::make::add_leading_newlines(1, fn_def);
127-
let fn_def = indent_once.increase_indent(fn_def);
130+
let fn_def = fn_def.indent(indent_once);
128131
let fn_def = ast::make::add_trailing_newlines(1, fn_def);
129-
let fn_def = indent.increase_indent(fn_def);
132+
let fn_def = fn_def.indent(indent);
130133
(fn_def, it.syntax().text_range().start() + TextSize::of('{'))
131134
}
132135
};

crates/ra_assists/src/handlers/add_missing_impl_members.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use hir::HasSource;
22
use ra_syntax::{
33
ast::{
44
self,
5-
edit::{self, IndentLevel},
5+
edit::{self, AstNodeEdit, IndentLevel},
66
make, AstNode, NameOwner,
77
},
88
SmolStr,
@@ -176,8 +176,7 @@ fn add_body(fn_def: ast::FnDef) -> ast::FnDef {
176176
if fn_def.body().is_some() {
177177
return fn_def;
178178
}
179-
let body = make::block_expr(None, Some(make::expr_todo()));
180-
let body = IndentLevel(1).increase_indent(body);
179+
let body = make::block_expr(None, Some(make::expr_todo())).indent(IndentLevel(1));
181180
fn_def.with_body(body)
182181
}
183182

crates/ra_assists/src/handlers/early_return.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@ use std::{iter::once, ops::RangeInclusive};
22

33
use ra_syntax::{
44
algo::replace_children,
5-
ast::{self, edit::IndentLevel, make},
5+
ast::{
6+
self,
7+
edit::{AstNodeEdit, IndentLevel},
8+
make,
9+
},
610
AstNode,
711
SyntaxKind::{FN_DEF, LOOP_EXPR, L_CURLY, R_CURLY, WHILE_EXPR, WHITESPACE},
812
SyntaxNode,
@@ -105,8 +109,7 @@ pub(crate) fn convert_to_guarded_return(acc: &mut Assists, ctx: &AssistContext)
105109
let then_branch =
106110
make::block_expr(once(make::expr_stmt(early_expression).into()), None);
107111
let cond = invert_boolean_expression(cond_expr);
108-
let e = make::expr_if(make::condition(cond, None), then_branch);
109-
if_indent_level.increase_indent(e)
112+
make::expr_if(make::condition(cond, None), then_branch).indent(if_indent_level)
110113
};
111114
replace(new_expr.syntax(), &then_block, &parent_block, &if_expr)
112115
}
@@ -140,7 +143,7 @@ pub(crate) fn convert_to_guarded_return(acc: &mut Assists, ctx: &AssistContext)
140143
make::bind_pat(make::name(&bound_ident.syntax().to_string())).into(),
141144
Some(match_expr),
142145
);
143-
let let_stmt = if_indent_level.increase_indent(let_stmt);
146+
let let_stmt = let_stmt.indent(if_indent_level);
144147
replace(let_stmt.syntax(), &then_block, &parent_block, &if_expr)
145148
}
146149
};
@@ -153,7 +156,7 @@ pub(crate) fn convert_to_guarded_return(acc: &mut Assists, ctx: &AssistContext)
153156
parent_block: &ast::BlockExpr,
154157
if_expr: &ast::IfExpr,
155158
) -> SyntaxNode {
156-
let then_block_items = IndentLevel::from(1).decrease_indent(then_block.clone());
159+
let then_block_items = then_block.unindent(IndentLevel::from(1));
157160
let end_of_then = then_block_items.syntax().last_child_or_token().unwrap();
158161
let end_of_then =
159162
if end_of_then.prev_sibling_or_token().map(|n| n.kind()) == Some(WHITESPACE) {

crates/ra_assists/src/handlers/replace_if_let_with_match.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
use ra_fmt::unwrap_trivial_block;
22
use ra_syntax::{
3-
ast::{self, edit::IndentLevel, make},
3+
ast::{
4+
self,
5+
edit::{AstNodeEdit, IndentLevel},
6+
make,
7+
},
48
AstNode,
59
};
610

@@ -61,10 +65,9 @@ pub(crate) fn replace_if_let_with_match(acc: &mut Assists, ctx: &AssistContext)
6165
make::match_arm(vec![pattern], else_expr)
6266
};
6367
make::expr_match(expr, make::match_arm_list(vec![then_arm, else_arm]))
68+
.indent(IndentLevel::from_node(if_expr.syntax()))
6469
};
6570

66-
let match_expr = IndentLevel::from_node(if_expr.syntax()).increase_indent(match_expr);
67-
6871
edit.set_cursor(if_expr.syntax().text_range().start());
6972
edit.replace_ast::<ast::Expr>(if_expr.into(), match_expr);
7073
})

crates/ra_assists/src/handlers/replace_let_with_if_let.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,7 @@ pub(crate) fn replace_let_with_if_let(acc: &mut Assists, ctx: &AssistContext) ->
5353
)
5454
.into(),
5555
};
56-
let block =
57-
IndentLevel::from_node(let_stmt.syntax()).increase_indent(make::block_expr(None, None));
56+
let block = make::block_expr(None, None).indent(IndentLevel::from_node(let_stmt.syntax()));
5857
let if_ = make::expr_if(make::condition(init, Some(with_placeholder)), block);
5958
let stmt = make::expr_stmt(if_);
6059

crates/ra_assists/src/handlers/replace_unwrap_with_match.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
use std::iter;
22

33
use ra_syntax::{
4-
ast::{self, edit::IndentLevel, make},
4+
ast::{
5+
self,
6+
edit::{AstNodeEdit, IndentLevel},
7+
make,
8+
},
59
AstNode,
610
};
711

@@ -51,8 +55,8 @@ pub(crate) fn replace_unwrap_with_match(acc: &mut Assists, ctx: &AssistContext)
5155
let err_arm = make::match_arm(iter::once(make::placeholder_pat().into()), unreachable_call);
5256

5357
let match_arm_list = make::match_arm_list(vec![ok_arm, err_arm]);
54-
let match_expr = make::expr_match(caller.clone(), match_arm_list);
55-
let match_expr = IndentLevel::from_node(method_call.syntax()).increase_indent(match_expr);
58+
let match_expr = make::expr_match(caller.clone(), match_arm_list)
59+
.indent(IndentLevel::from_node(method_call.syntax()));
5660

5761
edit.set_cursor(caller.syntax().text_range().start());
5862
edit.replace_ast::<ast::Expr>(method_call.into(), match_expr);

crates/ra_syntax/src/ast/edit.rs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -453,11 +453,7 @@ impl IndentLevel {
453453
IndentLevel(0)
454454
}
455455

456-
pub fn increase_indent<N: AstNode>(self, node: N) -> N {
457-
N::cast(self._increase_indent(node.syntax().clone())).unwrap()
458-
}
459-
460-
fn _increase_indent(self, node: SyntaxNode) -> SyntaxNode {
456+
fn increase_indent(self, node: SyntaxNode) -> SyntaxNode {
461457
let mut rewriter = SyntaxRewriter::default();
462458
node.descendants_with_tokens()
463459
.filter_map(|el| el.into_token())
@@ -478,11 +474,7 @@ impl IndentLevel {
478474
rewriter.rewrite(&node)
479475
}
480476

481-
pub fn decrease_indent<N: AstNode>(self, node: N) -> N {
482-
N::cast(self._decrease_indent(node.syntax().clone())).unwrap()
483-
}
484-
485-
fn _decrease_indent(self, node: SyntaxNode) -> SyntaxNode {
477+
fn decrease_indent(self, node: SyntaxNode) -> SyntaxNode {
486478
let mut rewriter = SyntaxRewriter::default();
487479
node.descendants_with_tokens()
488480
.filter_map(|el| el.into_token())
@@ -521,7 +513,7 @@ fn prev_tokens(token: SyntaxToken) -> impl Iterator<Item = SyntaxToken> {
521513
iter::successors(Some(token), |token| token.prev_token())
522514
}
523515

524-
pub trait AstNodeEdit: AstNode + Sized {
516+
pub trait AstNodeEdit: AstNode + Clone + Sized {
525517
#[must_use]
526518
fn insert_children(
527519
&self,
@@ -558,9 +550,17 @@ pub trait AstNodeEdit: AstNode + Sized {
558550
}
559551
rewriter.rewrite_ast(self)
560552
}
553+
#[must_use]
554+
fn indent(&self, indent: IndentLevel) -> Self {
555+
Self::cast(indent.increase_indent(self.syntax().clone())).unwrap()
556+
}
557+
#[must_use]
558+
fn unindent(&self, indent: IndentLevel) -> Self {
559+
Self::cast(indent.decrease_indent(self.syntax().clone())).unwrap()
560+
}
561561
}
562562

563-
impl<N: AstNode> AstNodeEdit for N {}
563+
impl<N: AstNode + Clone> AstNodeEdit for N {}
564564

565565
fn single_node(element: impl Into<SyntaxElement>) -> RangeInclusive<SyntaxElement> {
566566
let element = element.into();
@@ -580,7 +580,7 @@ fn test_increase_indent() {
580580
_ => (),
581581
}"
582582
);
583-
let indented = IndentLevel(2).increase_indent(arm_list);
583+
let indented = arm_list.indent(IndentLevel(2));
584584
assert_eq!(
585585
indented.syntax().to_string(),
586586
"{

0 commit comments

Comments
 (0)