diff --git a/src/expr.rs b/src/expr.rs index 6dc7af32ea1..6a63e1733d9 100644 --- a/src/expr.rs +++ b/src/expr.rs @@ -988,8 +988,11 @@ impl<'a> Rewrite for ControlFlow<'a> { if let Some(else_block) = self.else_block { // Since this is an else block, we should not indent for the assignment preceding - // the original if, so set shape.offset to 0. - let shape = Shape { offset: 0, ..shape }; + // the original if, so set shape.offset to shape.indent.alignment. + let shape = Shape { + offset: shape.indent.alignment, + ..shape + }; let mut last_in_chain = false; let rewrite = match else_block.node { // If the else expression is another if-else expression, prevent it @@ -1494,6 +1497,7 @@ fn rewrite_pat_expr(context: &RewriteContext, shape: Shape) -> Option<String> { debug!("rewrite_pat_expr {:?} {:?} {:?}", shape, pat, expr); + let mut pat_string = String::new(); let mut result = match pat { Some(pat) => { let matcher = if matcher.is_empty() { @@ -1503,7 +1507,7 @@ fn rewrite_pat_expr(context: &RewriteContext, }; let pat_shape = try_opt!(try_opt!(shape.shrink_left(matcher.len())) .sub_width(connector.len())); - let pat_string = try_opt!(pat.rewrite(context, pat_shape)); + pat_string = try_opt!(pat.rewrite(context, pat_shape)); format!("{}{}{}", matcher, pat_string, connector) } None => String::new(), @@ -1516,19 +1520,11 @@ fn rewrite_pat_expr(context: &RewriteContext, if shape.width > extra_offset + 1 { let spacer = if pat.is_some() { " " } else { "" }; - let expr_shape = try_opt!(shape.sub_width(extra_offset + spacer.len())) - .add_offset(extra_offset + spacer.len()); + let expr_shape = try_opt!(shape.offset_left(extra_offset + spacer.len())); let expr_rewrite = expr.rewrite(context, expr_shape); if let Some(expr_string) = expr_rewrite { - let pat_simple = pat.and_then(|p| { - p.rewrite(context, - Shape::legacy(context.config.max_width, - Indent::empty())) - }) - .map(|s| pat_is_simple(&s)); - - if pat.is_none() || pat_simple.unwrap_or(false) || !expr_string.contains('\n') { + if pat.is_none() || pat_is_simple(&pat_string) || !expr_string.contains('\n') { result.push_str(spacer); result.push_str(&expr_string); return Some(result); @@ -1542,11 +1538,7 @@ fn rewrite_pat_expr(context: &RewriteContext, result.push('\n'); result.push_str(&nested_indent.to_string(context.config)); - let expr_rewrite = expr.rewrite(&context, - Shape::legacy(try_opt!(context.config - .max_width - .checked_sub(nested_indent.width())), - nested_indent)); + let expr_rewrite = expr.rewrite(&context, Shape::indented(nested_indent, context.config)); result.push_str(&try_opt!(expr_rewrite)); Some(result) diff --git a/tests/source/issue-1468.rs b/tests/source/issue-1468.rs new file mode 100644 index 00000000000..1b45aa5d616 --- /dev/null +++ b/tests/source/issue-1468.rs @@ -0,0 +1,27 @@ +fn issue1468() { +euc_jp_decoder_functions!({ +let trail_minus_offset = byte.wrapping_sub(0xA1); +// Fast-track Hiragana (60% according to Lunde) +// and Katakana (10% acconding to Lunde). +if jis0208_lead_minus_offset == 0x03 && +trail_minus_offset < 0x53 { +// Hiragana +handle.write_upper_bmp(0x3041 + trail_minus_offset as u16) +} else if jis0208_lead_minus_offset == 0x04 && +trail_minus_offset < 0x56 { +// Katakana +handle.write_upper_bmp(0x30A1 + trail_minus_offset as u16) +} else if trail_minus_offset > (0xFE - 0xA1) { +if byte < 0x80 { +return (DecoderResult::Malformed(1, 0), +unread_handle_trail.unread(), +handle.written()); +} +return (DecoderResult::Malformed(2, 0), +unread_handle_trail.consumed(), +handle.written()); +} else { +unreachable!(); +} +}); +} diff --git a/tests/target/issue-1468.rs b/tests/target/issue-1468.rs new file mode 100644 index 00000000000..518c31b625c --- /dev/null +++ b/tests/target/issue-1468.rs @@ -0,0 +1,27 @@ +fn issue1468() { + euc_jp_decoder_functions!({ + let trail_minus_offset = byte.wrapping_sub(0xA1); + // Fast-track Hiragana (60% according to Lunde) + // and Katakana (10% acconding to Lunde). + if jis0208_lead_minus_offset == 0x03 && + trail_minus_offset < 0x53 { + // Hiragana + handle.write_upper_bmp(0x3041 + trail_minus_offset as u16) + } else if jis0208_lead_minus_offset == 0x04 && + trail_minus_offset < 0x56 { + // Katakana + handle.write_upper_bmp(0x30A1 + trail_minus_offset as u16) + } else if trail_minus_offset > (0xFE - 0xA1) { + if byte < 0x80 { + return (DecoderResult::Malformed(1, 0), + unread_handle_trail.unread(), + handle.written()); + } + return (DecoderResult::Malformed(2, 0), + unread_handle_trail.consumed(), + handle.written()); + } else { + unreachable!(); + } + }); +}