X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Frewrite.rs;h=17bb027bd5685b64a41fa0f2e1409aafc318e784;hb=6fb188bd43840f4a99c6a4b4cdbdb21ccf3304e7;hp=9713871880e39c4905b628abb7c281917e628c3f;hpb=3e25e628a152bb78cd42b0b81852a63d6e0ab204;p=rust.git diff --git a/src/rewrite.rs b/src/rewrite.rs index 9713871880e..17bb027bd56 100644 --- a/src/rewrite.rs +++ b/src/rewrite.rs @@ -10,32 +10,66 @@ // A generic trait to abstract the rewriting of an element (of the AST). -use syntax::codemap::{CodeMap, Span}; use syntax::parse::ParseSess; +use syntax::ptr; +use syntax::source_map::{SourceMap, Span}; -use Shape; -use config::Config; +use config::{Config, IndentStyle}; +use shape::Shape; +use visitor::SnippetProvider; +use FormatReport; + +use std::cell::RefCell; pub trait Rewrite { /// Rewrite self into shape. 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 source_map: &'a SourceMap, pub config: &'a Config, - pub inside_macro: bool, + pub inside_macro: RefCell, // Force block indent style even if we are using visual indent style. - pub use_block: bool, - // When `format_if_else_cond_comment` is true, unindent the comment on top + pub use_block: RefCell, + // When `is_if_else_block` is true, unindent the comment on top // of the `else` or `else if`. - pub is_if_else_block: bool, + pub is_if_else_block: RefCell, + // When rewriting chain, veto going multi line except the last element + pub force_one_line_chain: RefCell, + pub snippet_provider: &'a SnippetProvider<'a>, + // Used for `format_snippet` + pub(crate) macro_rewrite_failure: RefCell, + pub(crate) report: FormatReport, } impl<'a> RewriteContext<'a> { - pub fn snippet(&self, span: Span) -> String { - self.codemap.span_to_snippet(span).unwrap() + pub 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() + } + + pub 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 fn is_if_else_block(&self) -> bool { + *self.is_if_else_block.borrow() } }