ast::Lit_::LitStr(ref is, ast::StrStyle::CookedStr) => {
rewrite_string_lit(context, &is, l.span, width, offset)
}
- _ => context.codemap.span_to_snippet(self.span).ok(),
+ _ => Some(context.snippet(self.span)),
}
}
ast::Expr_::ExprCall(ref callee, ref args) => {
_ => {
// We do not format these expressions yet, but they should still
// satisfy our width restrictions.
- let snippet = context.codemap.span_to_snippet(self.span).unwrap();
+ let snippet = context.snippet(self.span);
{
let mut lines = snippet.lines();
impl Rewrite for ast::Block {
fn rewrite(&self, context: &RewriteContext, width: usize, offset: usize) -> Option<String> {
- let user_str = context.codemap.span_to_snippet(self.span).unwrap();
+ let user_str = context.snippet(self.span);
if user_str == "{}" && width >= 2 {
return Some(user_str);
}
let prefix = match self.rules {
ast::BlockCheckMode::PushUnsafeBlock(..) |
ast::BlockCheckMode::UnsafeBlock(..) => {
- let snippet = try_opt!(context.codemap.span_to_snippet(self.span).ok());
+ let snippet = context.snippet(self.span);
let open_pos = try_opt!(snippet.find_uncommented("{"));
visitor.last_pos = self.span.lo + BytePos(open_pos as u32);
// FIXME(#18): implement pattern formatting
impl Rewrite for ast::Pat {
fn rewrite(&self, context: &RewriteContext, _: usize, _: usize) -> Option<String> {
- context.codemap.span_to_snippet(self.span).ok()
+ Some(context.snippet(self.span))
}
}
for (i, arm) in arms.iter().enumerate() {
// Make sure we get the stuff between arms.
let missed_str = if i == 0 {
- context.codemap.span_to_snippet(mk_sp(open_brace_pos + BytePos(1),
- arm_start_pos(arm))).unwrap()
+ context.snippet(mk_sp(open_brace_pos + BytePos(1), arm_start_pos(arm)))
} else {
- context.codemap.span_to_snippet(mk_sp(arm_end_pos(&arms[i-1]),
- arm_start_pos(arm))).unwrap()
+ context.snippet(mk_sp(arm_end_pos(&arms[i-1]), arm_start_pos(arm)))
};
let missed_str = match missed_str.find_uncommented(",") {
Some(n) => &missed_str[n+1..],
result.push_str(arm_str);
} else {
// We couldn't format the arm, just reproduce the source.
- let snippet = context.codemap.span_to_snippet(mk_sp(arm_start_pos(arm),
- arm_end_pos(arm))).unwrap();
+ let snippet = context.snippet(mk_sp(arm_start_pos(arm), arm_end_pos(arm)));
result.push_str(&snippet);
}
}
attr_visitor.last_pos = attrs[0].span.lo;
if attr_visitor.visit_attrs(attrs) {
// Attributes included a skip instruction.
- let snippet = context.codemap.span_to_snippet(mk_sp(attrs[0].span.lo,
- body.span.hi)).unwrap();
+ let snippet = context.snippet(mk_sp(attrs[0].span.lo, body.span.hi));
return Some(snippet);
}
attr_visitor.format_missing(pats[0].span.lo);
// If the patterns were previously stacked, keep them stacked.
// FIXME should be an option.
let pat_span = mk_sp(pats[0].span.lo, pats[pats.len() - 1].span.hi);
- let pat_str = context.codemap.span_to_snippet(pat_span).unwrap();
+ let pat_str = context.snippet(pat_span);
vertical = pat_str.find('\n').is_some();
}
let l_loc = context.codemap.lookup_char_pos(span.lo);
let r_loc = context.codemap.lookup_char_pos(span.hi);
if l_loc.line == r_loc.line && r_loc.col.to_usize() <= context.config.max_width {
- return context.codemap.span_to_snippet(span).ok();
+ return Some(context.snippet(span));
}
let fmt = StringFormat {
opener: "\"",
// Take old span when rewrite fails.
|item| {
item.rewrite(inner_context, remaining_width, offset)
- .unwrap_or(context.codemap.span_to_snippet(item.span).unwrap())
+ .unwrap_or(context.snippet(item.span))
},
callee.span.hi + BytePos(1),
span.hi);
|item| {
match *item {
StructLitField::Regular(ref field) => field.span.lo,
- // 2 = ..
- StructLitField::Base(ref expr) => expr.span.lo - BytePos(2),
+ StructLitField::Base(ref expr) => {
+ let last_field_hi =
+ fields.last().map_or(span.lo, |field| field.span.hi);
+ let snippet =
+ context.snippet(mk_sp(last_field_hi, expr.span.lo));
+ let pos = snippet.find_uncommented("..").unwrap();
+ last_field_hi + BytePos(pos as u32)
+ }
}
},
|item| {
match *item {
StructLitField::Regular(ref field) => {
rewrite_field(inner_context, &field, h_budget, indent)
- .unwrap_or(context.codemap.span_to_snippet(field.span)
- .unwrap())
+ .unwrap_or(context.snippet(field.span))
}
StructLitField::Base(ref expr) => {
// 2 = ..
expr.rewrite(inner_context, h_budget - 2, indent + 2)
.map(|s| format!("..{}", s))
- .unwrap_or(context.codemap.span_to_snippet(expr.span)
- .unwrap())
+ .unwrap_or(context.snippet(expr.span))
}
}
},
|item| {
let inner_width = context.config.max_width - indent - 1;
item.rewrite(context, inner_width, indent)
- .unwrap_or(context.codemap.span_to_snippet(item.span).unwrap())
+ .unwrap_or(context.snippet(item.span))
},
span.lo + BytePos(1), // Remove parens
span.hi - BytePos(1));
-> Option<String> {
// FIXME: format comments between operands and operator
- let operator_str = context.codemap.span_to_snippet(op.span).unwrap();
+ let operator_str = context.snippet(op.span);
// Get "full width" rhs and see if it fits on the current line. This
// usually works fairly well since it tends to place operands of
offset: usize)
-> Option<String> {
let operator_str = match op {
- Some(op) => context.codemap.span_to_snippet(op.span).unwrap(),
+ Some(op) => context.snippet(op.span),
None => "=".to_owned(),
};
use utils;
use config::Config;
use rewrite::{Rewrite, RewriteContext};
+use comment::rewrite_comment;
pub struct FmtVisitor<'a> {
pub codemap: &'a CodeMap,
if utils::contains_skip(attrs) {
true
} else {
- let rewrite = self.rewrite_attrs(attrs, self.block_indent);
+ let rewrite = attrs.rewrite(&self.get_context(),
+ self.config.max_width - self.block_indent,
+ self.block_indent)
+ .unwrap();
self.buffer.push_str(&rewrite);
let last = attrs.last().unwrap();
self.last_pos = last.span.hi;
}
}
- pub fn rewrite_attrs(&self, attrs: &[ast::Attribute], indent: usize) -> String {
- let mut result = String::new();
- let indent = utils::make_indent(indent);
-
- for (i, a) in attrs.iter().enumerate() {
- let a_str = self.snippet(a.span);
-
- if i > 0 {
- let comment = self.snippet(codemap::mk_sp(attrs[i-1].span.hi, a.span.lo));
- // This particular horror show is to preserve line breaks in between doc
- // comments. An alternative would be to force such line breaks to start
- // with the usual doc comment token.
- let multi_line = a_str.starts_with("//") && comment.matches('\n').count() > 1;
- let comment = comment.trim();
- if !comment.is_empty() {
- result.push_str(&indent);
- result.push_str(comment);
- result.push('\n');
- } else if multi_line {
- result.push('\n');
- }
- result.push_str(&indent);
- }
-
- result.push_str(&a_str);
-
- if i < attrs.len() - 1 {
- result.push('\n');
- }
- }
-
- result
- }
-
fn format_mod(&mut self, m: &ast::Mod, s: Span, ident: ast::Ident) {
debug!("FmtVisitor::format_mod: ident: {:?}, span: {:?}", ident, s);
}
}
}
+
+impl<'a> Rewrite for [ast::Attribute] {
+ fn rewrite(&self, context: &RewriteContext, _: usize, offset: usize) -> Option<String> {
+ let mut result = String::new();
+ if self.is_empty() {
+ return Some(result);
+ }
+ let indent = utils::make_indent(offset);
+
+ for (i, a) in self.iter().enumerate() {
+ let a_str = context.snippet(a.span);
+
+ if i > 0 {
+ let comment = context.snippet(codemap::mk_sp(self[i-1].span.hi, a.span.lo));
+ // This particular horror show is to preserve line breaks in between doc
+ // comments. An alternative would be to force such line breaks to start
+ // with the usual doc comment token.
+ let multi_line = a_str.starts_with("//") && comment.matches('\n').count() > 1;
+ let comment = comment.trim();
+ if !comment.is_empty() {
+ let comment = rewrite_comment(comment,
+ false,
+ context.config.max_width - offset,
+ offset);
+ result.push_str(&indent);
+ result.push_str(&comment);
+ result.push('\n');
+ } else if multi_line {
+ result.push('\n');
+ }
+ result.push_str(&indent);
+ }
+
+ result.push_str(&a_str);
+
+ if i < self.len() - 1 {
+ result.push('\n');
+ }
+ }
+
+ Some(result)
+ }
+}