X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Frewrite.rs;h=c8abe70141b5c90665b11ca7f0f0628869f7c060;hb=127ec9a8c94419669b22079c988e38638b58395f;hp=90b613df6c4026bdb7d20698124bf870f58b269b;hpb=34067a1c4c7dd2751270bba13712bdef36295643;p=rust.git diff --git a/src/rewrite.rs b/src/rewrite.rs index 90b613df6c4..c8abe70141b 100644 --- a/src/rewrite.rs +++ b/src/rewrite.rs @@ -1,68 +1,98 @@ -// Copyright 2015 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - // A generic trait to abstract the rewriting of an element (of the AST). -use syntax::codemap::{CodeMap, Span}; -use syntax::parse::ParseSess; +use std::cell::{Cell, RefCell}; +use std::rc::Rc; -use config::{Config, IndentStyle}; -use shape::Shape; -use visitor::SnippetProvider; -use FormatReport; +use rustc_ast::ptr; +use rustc_span::Span; -use std::cell::RefCell; +use crate::config::{Config, IndentStyle}; +use crate::shape::Shape; +use crate::skip::SkipContext; +use crate::syntux::session::ParseSess; +use crate::visitor::SnippetProvider; +use crate::FormatReport; -pub trait Rewrite { +pub(crate) trait Rewrite { /// Rewrite self into shape. - fn rewrite(&self, context: &RewriteContext, shape: Shape) -> Option; + fn rewrite(&self, context: &RewriteContext<'_>, shape: Shape) -> Option; +} + +impl Rewrite for ptr::P { + fn rewrite(&self, context: &RewriteContext<'_>, shape: Shape) -> Option { + (**self).rewrite(context, shape) + } } #[derive(Clone)] -pub struct RewriteContext<'a> { - pub parse_session: &'a ParseSess, - pub codemap: &'a CodeMap, - pub config: &'a Config, - pub inside_macro: RefCell, +pub(crate) struct RewriteContext<'a> { + pub(crate) parse_sess: &'a ParseSess, + pub(crate) config: &'a Config, + pub(crate) inside_macro: Rc>, // Force block indent style even if we are using visual indent style. - pub use_block: RefCell, - // When `format_if_else_cond_comment` is true, unindent the comment on top + pub(crate) use_block: Cell, + // When `is_if_else_block` is true, unindent the comment on top // of the `else` or `else if`. - pub is_if_else_block: RefCell, + pub(crate) is_if_else_block: Cell, // When rewriting chain, veto going multi line except the last element - pub force_one_line_chain: RefCell, - pub snippet_provider: &'a SnippetProvider<'a>, + pub(crate) force_one_line_chain: Cell, + pub(crate) snippet_provider: &'a SnippetProvider, // Used for `format_snippet` - pub(crate) macro_rewrite_failure: RefCell, + pub(crate) macro_rewrite_failure: Cell, + pub(crate) is_macro_def: bool, pub(crate) report: FormatReport, + pub(crate) skip_context: SkipContext, + pub(crate) skipped_range: Rc>>, +} + +pub(crate) struct InsideMacroGuard { + is_nested_macro_context: bool, + inside_macro_ref: Rc>, +} + +impl InsideMacroGuard { + pub(crate) fn is_nested(&self) -> bool { + self.is_nested_macro_context + } +} + +impl Drop for InsideMacroGuard { + fn drop(&mut self) { + self.inside_macro_ref.replace(self.is_nested_macro_context); + } } impl<'a> RewriteContext<'a> { - pub fn snippet(&self, span: Span) -> &str { + pub(crate) fn snippet(&self, span: Span) -> &str { self.snippet_provider.span_to_snippet(span).unwrap() } - /// Return true if we should use block indent style for rewriting function call. - pub fn use_block_indent(&self) -> bool { - self.config.indent_style() == IndentStyle::Block || *self.use_block.borrow() + /// Returns `true` if we should use block indent style for rewriting function call. + pub(crate) fn use_block_indent(&self) -> bool { + self.config.indent_style() == IndentStyle::Block || self.use_block.get() } - pub fn budget(&self, used_width: usize) -> usize { + pub(crate) fn budget(&self, used_width: usize) -> usize { self.config.max_width().saturating_sub(used_width) } - pub fn inside_macro(&self) -> bool { - *self.inside_macro.borrow() + pub(crate) fn inside_macro(&self) -> bool { + self.inside_macro.get() + } + + pub(crate) fn enter_macro(&self) -> InsideMacroGuard { + let is_nested_macro_context = self.inside_macro.replace(true); + InsideMacroGuard { + is_nested_macro_context, + inside_macro_ref: self.inside_macro.clone(), + } + } + + pub(crate) fn leave_macro(&self) { + self.inside_macro.replace(false); } - pub fn is_if_else_block(&self) -> bool { - *self.is_if_else_block.borrow() + pub(crate) fn is_if_else_block(&self) -> bool { + self.is_if_else_block.get() } }