Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 57 additions & 0 deletions src/config/config_type.rs
Original file line number Diff line number Diff line change
Expand Up @@ -423,6 +423,63 @@ macro_rules! create_config {
)+
}

/// Reduces the maximum width of the configuration.
///
/// This method is intended to be used when creating a forked
/// configuration for a particular formatting context in which the
/// total available width needs to be reduced. This reduces the
/// size of max_width, and all other properties affected by small
/// heuristics, without treating those adjustments as overrides.
///
/// As an example use case, this method is used when formatting
/// arms within a declarative macro.
#[allow(unreachable_pub)]
pub fn reduce_max_width(&mut self, delta: usize) {
self.adjust_max_width(-1 * delta as isize);
}

/// Increases the maximum width of the configuration.
///
/// This method is intended to be used when creating a forked
/// configuration for a particular formatting context in which the
/// total available width needs to be reduced. This reduces the
/// size of max_width, and all other properties affected by small
/// heuristics, without treating those adjustments as overrides.
///
/// As an example use case, this method is used when formatting
/// arms within a declarative macro.
#[allow(unreachable_pub)]
pub fn increase_max_width(&mut self, delta: usize) {
self.adjust_max_width(delta as isize);
}

/// Adjusts the maximum width of the configuration.
///
/// This method is intended to be used when creating a forked
/// configuration for a particular formatting context in which the
/// total available width needs to be reduced. This reduces the
/// size of max_width, and all other properties affected by small
/// heuristics, without treating those adjustments as overrides.
///
/// As an example use case, this method is used when formatting
/// arms within a declarative macro.
fn adjust_max_width(&mut self, delta: isize) {
let adjust = |value: usize| (value as isize + delta) as usize;

self.array_width.2 = adjust(self.array_width.2);
self.attr_fn_like_width.2 = adjust(self.attr_fn_like_width.2);
self.chain_width.2 = adjust(self.chain_width.2);
self.fn_call_width.2 = adjust(self.fn_call_width.2);
self.single_line_if_else_max_width.2 = adjust(self.single_line_if_else_max_width.2);
self.single_line_let_else_max_width.2 =
adjust(self.single_line_let_else_max_width.2);
self.struct_lit_width.2 = adjust(self.struct_lit_width.2);
self.struct_variant_width.2 = adjust(self.struct_variant_width.2);

self.max_width.2 = adjust(self.max_width.2);
self.set_heuristics();
}

fn set_width_heuristics(&mut self, heuristics: WidthHeuristics) {
let max_width = self.max_width.2;
let get_width_value = |
Expand Down
6 changes: 2 additions & 4 deletions src/macros.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1321,15 +1321,13 @@ impl MacroBranch {
} else {
shape.indent.block_indent(&config)
};
let new_width = config.max_width() - body_indent.width();
config.set().max_width(new_width);
config.reduce_max_width(body_indent.width());

// First try to format as items, then as statements.
let new_body_snippet = match crate::format_snippet(&body_str, &config, true) {
Some(new_body) => new_body,
None => {
let new_width = new_width + config.tab_spaces();
config.set().max_width(new_width);
config.increase_max_width(config.tab_spaces());
match crate::format_code_block(&body_str, &config, true) {
Some(new_body) => new_body,
None => {
Expand Down
Loading