Skip to content

Commit

Permalink
Fixed comment dropped between & and type issue (#4482)
Browse files Browse the repository at this point in the history
* Fixed comment dropped between & and type issue

* Reduced nesting levels and avoided duplications

* Removed extra allocations
  • Loading branch information
whizsid authored Nov 3, 2020
1 parent f3ce2ce commit 4abdda1
Show file tree
Hide file tree
Showing 3 changed files with 122 additions and 27 deletions.
89 changes: 62 additions & 27 deletions src/formatting/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use std::iter::ExactSizeIterator;
use std::ops::Deref;

use rustc_ast::ast::{self, FnRetTy, Mutability};
use rustc_span::{symbol::kw, BytePos, Span};
use rustc_span::{symbol::kw, BytePos, Pos, Span};

use crate::config::{lists::*, IndentStyle, TypeDensity};
use crate::formatting::{
Expand Down Expand Up @@ -653,37 +653,72 @@ impl Rewrite for ast::Ty {
ast::TyKind::Rptr(ref lifetime, ref mt) => {
let mut_str = format_mutability(mt.mutbl);
let mut_len = mut_str.len();
Some(match *lifetime {
Some(ref lifetime) => {
let lt_budget = shape.width.checked_sub(2 + mut_len)?;
let lt_str = lifetime.rewrite(
let mut result = String::with_capacity(128);
result.push_str("&");
let ref_hi = context.snippet_provider.span_after(self.span(), "&");
let mut cmnt_lo = ref_hi;

if let Some(ref lifetime) = *lifetime {
let lt_budget = shape.width.checked_sub(2 + mut_len)?;
let lt_str = lifetime.rewrite(
context,
Shape::legacy(lt_budget, shape.indent + 2 + mut_len),
)?;
let before_lt_span = mk_sp(cmnt_lo, lifetime.ident.span.lo());
if contains_comment(context.snippet(before_lt_span)) {
result = combine_strs_with_missing_comments(
context,
Shape::legacy(lt_budget, shape.indent + 2 + mut_len),
&result,
&lt_str,
before_lt_span,
shape,
true,
)?;
let lt_len = lt_str.len();
let budget = shape.width.checked_sub(2 + mut_len + lt_len)?;
format!(
"&{} {}{}",
lt_str,
mut_str,
mt.ty.rewrite(
context,
Shape::legacy(budget, shape.indent + 2 + mut_len + lt_len)
)?
)
} else {
result.push_str(&lt_str);
}
None => {
let budget = shape.width.checked_sub(1 + mut_len)?;
format!(
"&{}{}",
result.push_str(" ");
cmnt_lo = lifetime.ident.span.hi();
}

if ast::Mutability::Mut == mt.mutbl {
let mut_hi = context.snippet_provider.span_after(self.span(), "mut");
let before_mut_span = mk_sp(cmnt_lo, mut_hi - BytePos::from_usize(3));
if contains_comment(context.snippet(before_mut_span)) {
result = combine_strs_with_missing_comments(
context,
result.trim_end(),
mut_str,
mt.ty.rewrite(
context,
Shape::legacy(budget, shape.indent + 1 + mut_len)
)?
)
before_mut_span,
shape,
true,
)?;
} else {
result.push_str(mut_str);
}
})
cmnt_lo = mut_hi;
}

let before_ty_span = mk_sp(cmnt_lo, mt.ty.span.lo());
if contains_comment(context.snippet(before_ty_span)) {
result = combine_strs_with_missing_comments(
context,
result.trim_end(),
&mt.ty.rewrite(&context, shape)?,
before_ty_span,
shape,
true,
)?;
} else {
let used_width = last_line_width(&result);
let budget = shape.width.checked_sub(used_width)?;
let ty_str = mt
.ty
.rewrite(&context, Shape::legacy(budget, shape.indent + used_width))?;
result.push_str(&ty_str);
}

Some(result)
}
// FIXME: we drop any comments here, even though it's a silly place to put
// comments.
Expand Down
26 changes: 26 additions & 0 deletions tests/source/issue-4245.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@


fn a(a: & // Comment
// Another comment
'a File) {}

fn b(b: & /* Another Comment */'a File) {}

fn c(c: &'a /*Comment */ mut /*Comment */ File){}

fn d(c: & // Comment
'b // Multi Line
// Comment
mut // Multi Line
// Comment
File
) {}

fn e(c: &// Comment
File) {}

fn d(c: &// Comment
mut // Multi Line
// Comment
File
) {}
34 changes: 34 additions & 0 deletions tests/target/issue-4245.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
fn a(
a: & // Comment
// Another comment
'a File,
) {
}

fn b(b: & /* Another Comment */ 'a File) {}

fn c(c: &'a /*Comment */ mut /*Comment */ File) {}

fn d(
c: & // Comment
'b // Multi Line
// Comment
mut // Multi Line
// Comment
File,
) {
}

fn e(
c: & // Comment
File,
) {
}

fn d(
c: & // Comment
mut // Multi Line
// Comment
File,
) {
}

0 comments on commit 4abdda1

Please sign in to comment.