fix indent caclulation

This commit is contained in:
Aleksey Kladov 2019-01-13 18:21:23 +03:00
parent c46e0300e6
commit 884ce4a420
3 changed files with 51 additions and 11 deletions

View file

@ -2,15 +2,23 @@ use ra_syntax::{
AstNode,
SyntaxNode, SyntaxKind::*,
ast::{self, AstToken},
algo::generate,
};
/// If the node is on the begining of the line, calculate indent.
pub(crate) fn leading_indent(node: &SyntaxNode) -> Option<&str> {
let prev = node.prev_sibling()?;
let prev = prev_leaf(node)?;
let ws_text = ast::Whitespace::cast(prev)?.text();
ws_text.rfind('\n').map(|pos| &ws_text[pos + 1..])
}
fn prev_leaf(node: &SyntaxNode) -> Option<&SyntaxNode> {
generate(node.ancestors().find_map(SyntaxNode::prev_sibling), |it| {
it.last_child()
})
.last()
}
pub(crate) fn extract_trivial_expression(block: &ast::Block) -> Option<&ast::Expr> {
let expr = block.expr()?;
if expr.syntax().text().contains('\n') {

View file

@ -227,6 +227,38 @@ fn foo() {
)
}
#[test]
fn indents_new_chain_call_with_semi() {
type_dot(
r"
pub fn child(&self, db: &impl HirDatabase, name: &Name) -> Cancelable<Option<Module>> {
self.child_impl(db, name)
<|>;
}
",
r"
pub fn child(&self, db: &impl HirDatabase, name: &Name) -> Cancelable<Option<Module>> {
self.child_impl(db, name)
.;
}
",
);
type_dot(
r"
pub fn child(&self, db: &impl HirDatabase, name: &Name) -> Cancelable<Option<Module>> {
self.child_impl(db, name)
<|>;
}
",
r"
pub fn child(&self, db: &impl HirDatabase, name: &Name) -> Cancelable<Option<Module>> {
self.child_impl(db, name)
.;
}
",
)
}
#[test]
fn indents_continued_chain_call() {
type_dot(

View file

@ -12,18 +12,18 @@ pub const CURSOR_MARKER: &str = "<|>";
#[macro_export]
macro_rules! assert_eq_text {
($expected:expr, $actual:expr) => {
assert_eq_text!($expected, $actual,)
($left:expr, $right:expr) => {
assert_eq_text!($left, $right,)
};
($expected:expr, $actual:expr, $($tt:tt)*) => {{
let expected = $expected;
let actual = $actual;
if expected != actual {
if expected.trim() == actual.trim() {
eprintln!("Expected:\n{:?}\n\nActual:\n{:?}\n\nWhitespace difference\n", expected, actual);
($left:expr, $right:expr, $($tt:tt)*) => {{
let left = $left;
let right = $right;
if left != right {
if left.trim() == right.trim() {
eprintln!("Left:\n{:?}\n\nRight:\n{:?}\n\nWhitespace difference\n", left, right);
} else {
let changeset = $crate::__Changeset::new(actual, expected, "\n");
eprintln!("Expected:\n{}\n\nActual:\n{}\n\nDiff:\n{}\n", expected, actual, changeset);
let changeset = $crate::__Changeset::new(right, left, "\n");
eprintln!("Left:\n{}\n\nRight:\n{}\n\nDiff:\n{}\n", left, right, changeset);
}
eprintln!($($tt)*);
panic!("text differs");