Properly format unsafe blocks
This commit is contained in:
parent
7214008f60
commit
0f640b06dd
4 changed files with 66 additions and 4 deletions
31
src/expr.rs
31
src/expr.rs
|
@ -15,6 +15,7 @@ use StructLitStyle;
|
||||||
use utils::{span_after, make_indent};
|
use utils::{span_after, make_indent};
|
||||||
use visitor::FmtVisitor;
|
use visitor::FmtVisitor;
|
||||||
use config::BlockIndentStyle;
|
use config::BlockIndentStyle;
|
||||||
|
use comment::{FindUncommented, rewrite_comment};
|
||||||
|
|
||||||
use syntax::{ast, ptr};
|
use syntax::{ast, ptr};
|
||||||
use syntax::codemap::{Pos, Span, BytePos, mk_sp};
|
use syntax::codemap::{Pos, Span, BytePos, mk_sp};
|
||||||
|
@ -104,11 +105,35 @@ impl Rewrite for ast::Expr {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Rewrite for ast::Block {
|
impl Rewrite for ast::Block {
|
||||||
fn rewrite(&self, context: &RewriteContext, _: usize, _: usize) -> Option<String> {
|
fn rewrite(&self, context: &RewriteContext, width: usize, offset: usize) -> Option<String> {
|
||||||
let mut visitor = FmtVisitor::from_codemap(context.codemap, context.config);
|
let mut visitor = FmtVisitor::from_codemap(context.codemap, context.config);
|
||||||
visitor.last_pos = self.span.lo;
|
|
||||||
visitor.block_indent = context.block_indent;
|
visitor.block_indent = context.block_indent;
|
||||||
|
|
||||||
|
let prefix = match self.rules {
|
||||||
|
ast::BlockCheckMode::PushUnsafeBlock(..) |
|
||||||
|
ast::BlockCheckMode::UnsafeBlock(..) => {
|
||||||
|
let snippet = try_opt!(context.codemap.span_to_snippet(self.span).ok());
|
||||||
|
let open_pos = try_opt!(snippet.find_uncommented("{"));
|
||||||
|
visitor.last_pos = self.span.lo + BytePos(open_pos as u32);
|
||||||
|
|
||||||
|
// Extract comment between unsafe and block start.
|
||||||
|
let trimmed = &snippet[6..open_pos].trim();
|
||||||
|
|
||||||
|
if trimmed.len() > 0 {
|
||||||
|
// 9 = "unsafe {".len(), 7 = "unsafe ".len()
|
||||||
|
format!("unsafe {} ", rewrite_comment(trimmed, true, width - 9, offset + 7))
|
||||||
|
} else {
|
||||||
|
"unsafe ".to_owned()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ast::BlockCheckMode::PopUnsafeBlock(..) |
|
||||||
|
ast::BlockCheckMode::DefaultBlock => {
|
||||||
|
visitor.last_pos = self.span.lo;
|
||||||
|
|
||||||
|
String::new()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
visitor.visit_block(self);
|
visitor.visit_block(self);
|
||||||
|
|
||||||
// Push text between last block item and end of block
|
// Push text between last block item and end of block
|
||||||
|
@ -119,7 +144,7 @@ impl Rewrite for ast::Block {
|
||||||
let file_name = context.codemap.span_to_filename(self.span);
|
let file_name = context.codemap.span_to_filename(self.span);
|
||||||
let string_buffer = visitor.changes.get(&file_name);
|
let string_buffer = visitor.changes.get(&file_name);
|
||||||
|
|
||||||
Some(string_buffer.to_string())
|
Some(format!("{}{}", prefix, string_buffer))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -73,7 +73,6 @@ impl<'a, 'v> visit::Visitor<'v> for FmtVisitor<'a> {
|
||||||
debug!("visit_block: {:?} {:?}",
|
debug!("visit_block: {:?} {:?}",
|
||||||
self.codemap.lookup_char_pos(b.span.lo),
|
self.codemap.lookup_char_pos(b.span.lo),
|
||||||
self.codemap.lookup_char_pos(b.span.hi));
|
self.codemap.lookup_char_pos(b.span.hi));
|
||||||
self.format_missing(b.span.lo);
|
|
||||||
|
|
||||||
self.changes.push_str_span(b.span, "{");
|
self.changes.push_str_span(b.span, "{");
|
||||||
self.last_pos = self.last_pos + BytePos(1);
|
self.last_pos = self.last_pos + BytePos(1);
|
||||||
|
@ -82,6 +81,7 @@ impl<'a, 'v> visit::Visitor<'v> for FmtVisitor<'a> {
|
||||||
for stmt in &b.stmts {
|
for stmt in &b.stmts {
|
||||||
self.visit_stmt(&stmt)
|
self.visit_stmt(&stmt)
|
||||||
}
|
}
|
||||||
|
|
||||||
match b.expr {
|
match b.expr {
|
||||||
Some(ref e) => {
|
Some(ref e) => {
|
||||||
self.format_missing_with_indent(e.span.lo);
|
self.format_missing_with_indent(e.span.lo);
|
||||||
|
|
|
@ -73,3 +73,21 @@ fn bar() {
|
||||||
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,
|
||||||
a);
|
a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn baz() {
|
||||||
|
unsafe /* {}{}{}{{{{}} */ {
|
||||||
|
let foo = 1u32;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe /* very looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong comment */ {}
|
||||||
|
|
||||||
|
unsafe // So this is a very long comment.
|
||||||
|
// Multi-line, too.
|
||||||
|
// Will it still format correctly?
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe {
|
||||||
|
// Regular unsafe block
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -102,3 +102,22 @@ fn bar() {
|
||||||
let x = (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,
|
let x = (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,
|
||||||
a);
|
a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn baz() {
|
||||||
|
unsafe /* {}{}{}{{{{}} */ {
|
||||||
|
let foo = 1u32;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe /* very looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong
|
||||||
|
* comment */ {
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe /* So this is a very long comment.
|
||||||
|
* Multi-line, too.
|
||||||
|
* Will it still format correctly? */ {
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe {
|
||||||
|
// Regular unsafe block
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue