blob: 0cc7c7fef6fed54419ac514c3b2525f6cbeaa42d [file] [edit]
use crate::expr::{lit_ends_in_dot, rewrite_unary_prefix, rewrite_unary_suffix};
use crate::pairs::{PairParts, rewrite_pair};
use crate::rewrite::{RewriteContext, RewriteResult};
use crate::shape::Shape;
use rustc_ast::ast;
fn needs_space_before_range(context: &RewriteContext<'_>, lhs: &ast::Expr) -> bool {
match lhs.kind {
ast::ExprKind::Lit(token_lit) => lit_ends_in_dot(&token_lit, context),
ast::ExprKind::Unary(_, ref expr) => needs_space_before_range(context, expr),
ast::ExprKind::Binary(_, _, ref rhs_expr) => needs_space_before_range(context, rhs_expr),
_ => false,
}
}
fn needs_space_after_range(rhs: &ast::Expr) -> bool {
// Don't format `.. ..` into `....`, which is invalid.
//
// This check is unnecessary for `lhs`, because a range
// starting from another range needs parentheses as `(x ..) ..`
// (`x .. ..` is a range from `x` to `..`).
matches!(rhs.kind, ast::ExprKind::Range(None, _, _))
}
pub(crate) fn rewrite_range(
context: &RewriteContext<'_>,
shape: Shape,
lhs: Option<&ast::Expr>,
rhs: Option<&ast::Expr>,
delim: &str,
) -> RewriteResult {
let default_sp_delim = |lhs: Option<&ast::Expr>, rhs: Option<&ast::Expr>| {
let space_if = |b: bool| if b { " " } else { "" };
format!(
"{}{}{}",
lhs.map_or("", |lhs| space_if(needs_space_before_range(context, lhs))),
delim,
rhs.map_or("", |rhs| space_if(needs_space_after_range(rhs))),
)
};
match (lhs, rhs) {
(Some(lhs), Some(rhs)) => {
let sp_delim = if context.config.spaces_around_ranges() {
format!(" {delim} ")
} else {
default_sp_delim(Some(lhs), Some(rhs))
};
rewrite_pair(
lhs,
rhs,
PairParts::infix(&sp_delim),
context,
shape,
context.config.binop_separator(),
)
}
(None, Some(rhs)) => {
let sp_delim = if context.config.spaces_around_ranges() {
format!("{delim} ")
} else {
default_sp_delim(None, Some(rhs))
};
rewrite_unary_prefix(context, &sp_delim, rhs, shape)
}
(Some(lhs), None) => {
let sp_delim = if context.config.spaces_around_ranges() {
format!(" {delim}")
} else {
default_sp_delim(Some(lhs), None)
};
rewrite_unary_suffix(context, &sp_delim, lhs, shape)
}
(None, None) => Ok(delim.to_owned()),
}
}