X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fvisitor.rs;h=63e2c6bdcac57c88c8128682b20880aaa8975a67;hb=6fb188bd43840f4a99c6a4b4cdbdb21ccf3304e7;hp=7f557747778dc467bc53414c7b0420bb16f19c43;hpb=f009252a6a89e6e2ff1cc02984c260f61b8d5c16;p=rust.git diff --git a/src/visitor.rs b/src/visitor.rs index 7f557747778..63e2c6bdcac 100644 --- a/src/visitor.rs +++ b/src/visitor.rs @@ -60,6 +60,7 @@ pub fn new(start_pos: BytePos, big_snippet: &'a str) -> Self { } pub struct FmtVisitor<'a> { + parent_context: Option<&'a RewriteContext<'a>>, pub parse_session: &'a ParseSess, pub source_map: &'a SourceMap, pub buffer: String, @@ -75,7 +76,21 @@ pub struct FmtVisitor<'a> { pub(crate) report: FormatReport, } +impl<'a> Drop for FmtVisitor<'a> { + fn drop(&mut self) { + if let Some(ctx) = self.parent_context { + if self.macro_rewrite_failure { + ctx.macro_rewrite_failure.replace(true); + } + } + } +} + impl<'b, 'a: 'b> FmtVisitor<'a> { + fn set_parent_context(&mut self, context: &'a RewriteContext) { + self.parent_context = Some(context); + } + pub fn shape(&self) -> Shape { Shape::indented(self.block_indent, self.config) } @@ -97,7 +112,8 @@ fn visit_stmt(&mut self, stmt: &ast::Stmt) { if contains_skip(get_attrs_from_stmt(stmt)) { self.push_skipped_with_span(stmt.span()); } else { - let rewrite = stmt.rewrite(&self.get_context(), self.shape()); + let shape = self.shape(); + let rewrite = self.with_context(|ctx| stmt.rewrite(&ctx, shape)); self.push_rewrite(stmt.span(), rewrite) } } @@ -142,7 +158,8 @@ pub fn visit_block( item.attrs.first() } else { first_stmt.attrs().first() - }.and_then(|attr| { + } + .and_then(|attr| { // Some stmts can have embedded attributes. // e.g. `match { #![attr] ... }` let attr_lo = attr.span.lo(); @@ -350,11 +367,14 @@ pub fn visit_item(&mut self, item: &ast::Item) { let where_span_end = snippet .find_uncommented("{") .map(|x| BytePos(x as u32) + source!(self, item.span).lo()); - let rw = format_impl(&self.get_context(), item, self.block_indent, where_span_end); + let block_indent = self.block_indent; + let rw = + self.with_context(|ctx| format_impl(&ctx, item, block_indent, where_span_end)); self.push_rewrite(item.span, rw); } ast::ItemKind::Trait(..) => { - let rw = format_trait(&self.get_context(), item, self.block_indent); + let block_indent = self.block_indent; + let rw = self.with_context(|ctx| format_trait(&ctx, item, block_indent)); self.push_rewrite(item.span, rw); } ast::ItemKind::TraitAlias(ref generics, ref generic_bounds) => { @@ -478,6 +498,7 @@ pub fn visit_trait_item(&mut self, ti: &ast::TraitItem) { let rewrite = rewrite_associated_type( ti.ident, type_default.as_ref(), + &ti.generics, Some(generic_bounds), &self.get_context(), self.block_indent, @@ -516,6 +537,7 @@ pub fn visit_impl_item(&mut self, ii: &ast::ImplItem) { ii.ident, ii.defaultness, Some(ty), + &ii.generics, &self.get_context(), self.block_indent, ); @@ -525,6 +547,7 @@ pub fn visit_impl_item(&mut self, ii: &ast::ImplItem) { let rewrite = rewrite_existential_impl_type( &self.get_context(), ii.ident, + &ii.generics, generic_bounds, self.block_indent, ); @@ -575,12 +598,14 @@ pub fn push_skipped_with_span(&mut self, span: Span) { } pub fn from_context(ctx: &'a RewriteContext) -> FmtVisitor<'a> { - FmtVisitor::from_source_map( + let mut visitor = FmtVisitor::from_source_map( ctx.parse_session, ctx.config, ctx.snippet_provider, ctx.report.clone(), - ) + ); + visitor.set_parent_context(ctx); + visitor } pub(crate) fn from_source_map( @@ -590,6 +615,7 @@ pub(crate) fn from_source_map( report: FormatReport, ) -> FmtVisitor<'a> { FmtVisitor { + parent_context: None, parse_session, source_map: parse_session.source_map(), buffer: String::with_capacity(snippet_provider.big_snippet.len() * 2), @@ -621,25 +647,24 @@ pub fn visit_attrs(&mut self, attrs: &[ast::Attribute], style: ast::AttrStyle) - self.report.append( file_name, vec![FormattingError::from_span( - &attr.span, + attr.span, &self.source_map, ErrorKind::DeprecatedAttr, )], ); - } else if attr.path.segments[0].ident.to_string() == "rustfmt" { - if attr.path.segments.len() == 1 - || attr.path.segments[1].ident.to_string() != "skip" - { - let file_name = self.source_map.span_to_filename(attr.span).into(); - self.report.append( - file_name, - vec![FormattingError::from_span( - &attr.span, - &self.source_map, - ErrorKind::BadAttr, - )], - ); - } + } else if attr.path.segments[0].ident.to_string() == "rustfmt" + && (attr.path.segments.len() == 1 + || attr.path.segments[1].ident.to_string() != "skip") + { + let file_name = self.source_map.span_to_filename(attr.span).into(); + self.report.append( + file_name, + vec![FormattingError::from_span( + attr.span, + &self.source_map, + ErrorKind::BadAttr, + )], + ); } } if contains_skip(attrs) { @@ -766,13 +791,9 @@ pub fn with_context(&mut self, f: F) -> Option where F: Fn(&RewriteContext) -> Option, { - let result; - let macro_rewrite_failure = { - let context = self.get_context(); - result = f(&context); - unsafe { *context.macro_rewrite_failure.as_ptr() } - }; - self.macro_rewrite_failure |= macro_rewrite_failure; + let context = self.get_context(); + let result = f(&context); + self.macro_rewrite_failure |= *context.macro_rewrite_failure.borrow(); result }