diff --git a/src/bin/main.rs b/src/bin/main.rs index 681e677488c..3d86404e029 100644 --- a/src/bin/main.rs +++ b/src/bin/main.rs @@ -215,7 +215,7 @@ fn execute(opts: &Options) -> Result<(WriteMode, Summary), failure::Error> { config.set().file_lines(options.file_lines); for f in config.file_lines().files() { match *f { - FileName::Custom(ref f) if f == "stdin" => {} + FileName::Stdin => {} _ => eprintln!("Warning: Extra file listed in file_lines option '{}'", f), } } @@ -500,7 +500,7 @@ impl GetOptsOptions { FileName::Real(_) => { eprintln!("Warning: Extra file listed in file_lines option '{}'", f) } - _ => eprintln!("Warning: Not a file '{}'", f), + FileName::Stdin => eprintln!("Warning: Not a file '{}'", f), } } } diff --git a/src/config/file_lines.rs b/src/config/file_lines.rs index 5e29e0ff965..8fbd1e02ca0 100644 --- a/src/config/file_lines.rs +++ b/src/config/file_lines.rs @@ -11,13 +11,14 @@ //! This module contains types and functions to support formatting specific line ranges. use std::collections::HashMap; +use std::path::PathBuf; use std::rc::Rc; -use std::{cmp, iter, str}; +use std::{cmp, fmt, iter, str}; use serde::de::{Deserialize, Deserializer}; use serde_json as json; -use syntax::codemap::{FileMap, FileName}; +use syntax::codemap::{self, FileMap}; /// A range of lines in a file, inclusive of both ends. pub struct LineRange { @@ -26,9 +27,34 @@ pub struct LineRange { pub hi: usize, } +#[derive(Clone, Debug, Eq, PartialEq, Hash, Ord, PartialOrd)] +pub enum FileName { + Real(PathBuf), + Stdin, +} + +impl From for FileName { + fn from(name: codemap::FileName) -> FileName { + match name { + codemap::FileName::Real(p) => FileName::Real(p), + codemap::FileName::Custom(ref f) if f == "stdin" => FileName::Stdin, + _ => unreachable!(), + } + } +} + +impl fmt::Display for FileName { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + FileName::Real(p) => write!(f, "{}", p.to_str().unwrap()), + FileName::Stdin => write!(f, "stdin"), + } + } +} + impl LineRange { - pub fn file_name(&self) -> &FileName { - &self.file.name + pub fn file_name(&self) -> FileName { + self.file.name.clone().into() } } @@ -169,12 +195,12 @@ impl FileLines { /// Returns true if `range` is fully contained in `self`. #[allow(dead_code)] pub(crate) fn contains(&self, range: &LineRange) -> bool { - self.file_range_matches(range.file_name(), |r| r.contains(Range::from(range))) + self.file_range_matches(&range.file_name(), |r| r.contains(Range::from(range))) } /// Returns true if any lines in `range` are in `self`. pub(crate) fn intersects(&self, range: &LineRange) -> bool { - self.file_range_matches(range.file_name(), |r| r.intersects(Range::from(range))) + self.file_range_matches(&range.file_name(), |r| r.intersects(Range::from(range))) } /// Returns true if `line` from `file_name` is in `self`. @@ -232,7 +258,7 @@ struct JsonSpan { fn deserialize_filename<'de, D: Deserializer<'de>>(d: D) -> Result { let s = String::deserialize(d)?; if s == "stdin" { - Ok(FileName::Custom(s)) + Ok(FileName::Stdin) } else { Ok(FileName::Real(s.into())) } diff --git a/src/config/mod.rs b/src/config/mod.rs index 6168c56ef38..3724b120228 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -17,7 +17,7 @@ use std::path::{Path, PathBuf}; use std::{env, fs}; use config::config_type::ConfigType; -pub use config::file_lines::FileLines; +pub use config::file_lines::{FileLines, FileName}; pub use config::lists::*; pub use config::options::*; diff --git a/src/config/options.rs b/src/config/options.rs index 9bf6c380919..5ba2b23b6cf 100644 --- a/src/config/options.rs +++ b/src/config/options.rs @@ -8,11 +8,9 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -use syntax::codemap::FileName; - use config::config_type::ConfigType; use config::lists::*; -use config::Config; +use config::{Config, FileName}; use std::collections::HashSet; use std::path::{Path, PathBuf}; diff --git a/src/filemap.rs b/src/filemap.rs index d61a3aa2a74..8cb992e2b8d 100644 --- a/src/filemap.rs +++ b/src/filemap.rs @@ -15,9 +15,8 @@ use std::io::{self, BufWriter, Read, Write}; use std::path::Path; use checkstyle::output_checkstyle_file; -use config::{Config, NewlineStyle, Verbosity, WriteMode}; +use config::{Config, FileName, NewlineStyle, Verbosity, WriteMode}; use rustfmt_diff::{make_diff, output_modified, print_diff, Mismatch}; -use syntax::codemap::FileName; #[cfg(test)] use FileRecord; diff --git a/src/lib.rs b/src/lib.rs index c3fe0db3155..066411e4d67 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -46,7 +46,6 @@ use std::rc::Rc; use std::time::Duration; use syntax::ast; -pub use syntax::codemap::FileName; use syntax::codemap::{CodeMap, FilePathMapping, Span}; use syntax::errors::emitter::{ColorConfig, EmitterWriter}; use syntax::errors::{DiagnosticBuilder, Handler}; @@ -59,9 +58,10 @@ use shape::Indent; use utils::use_colored_tty; use visitor::{FmtVisitor, SnippetProvider}; -pub use config::options::CliOptions; pub use config::summary::Summary; -pub use config::{load_config, Color, Config, FileLines, Verbosity, WriteMode}; +pub use config::{ + load_config, CliOptions, Color, Config, FileLines, FileName, Verbosity, WriteMode, +}; #[macro_use] mod utils; @@ -97,8 +97,6 @@ mod types; mod vertical; pub(crate) mod visitor; -const STDIN: &str = ""; - // A map of the files of a crate, with their new content pub(crate) type FileMap = Vec; @@ -397,7 +395,7 @@ fn should_emit_verbose(path: &FileName, config: &Config, f: F) where F: Fn(), { - if config.verbose() == Verbosity::Verbose && path.to_string() != STDIN { + if config.verbose() == Verbosity::Verbose && path != &FileName::Stdin { f(); } } @@ -626,7 +624,7 @@ fn parse_input<'sess>( Input::File(file) => parse::new_parser_from_file(parse_session, &file), Input::Text(text) => parse::new_parser_from_source_str( parse_session, - FileName::Custom("stdin".to_owned()), + syntax::codemap::FileName::Custom("stdin".to_owned()), text, ), }; @@ -797,7 +795,7 @@ fn format_input_inner( let main_file = match input { Input::File(ref file) => FileName::Real(file.clone()), - Input::Text(..) => FileName::Custom("stdin".to_owned()), + Input::Text(..) => FileName::Stdin, }; let krate = match parse_input(input, &parse_session, config) { diff --git a/src/missed_spans.rs b/src/missed_spans.rs index 1a5c6d4f2e6..fbead850eaa 100644 --- a/src/missed_spans.rs +++ b/src/missed_spans.rs @@ -10,11 +10,11 @@ use std::borrow::Cow; -use syntax::codemap::{BytePos, FileName, Pos, Span}; +use syntax::codemap::{BytePos, Pos, Span}; use codemap::LineRangeUtils; use comment::{rewrite_comment, CodeCharKind, CommentCodeSlices}; -use config::WriteMode; +use config::{FileName, WriteMode}; use shape::{Indent, Shape}; use utils::{count_newlines, last_line_width, mk_sp}; use visitor::FmtVisitor; @@ -177,7 +177,7 @@ impl<'a> FmtVisitor<'a> { // Annoyingly, the library functions for splitting by lines etc. are not // quite right, so we must do it ourselves. let char_pos = self.codemap.lookup_char_pos(span.lo()); - let file_name = &char_pos.file.name; + let file_name = &char_pos.file.name.clone().into(); let mut status = SnippetStatus::new(char_pos.line); let snippet = &*match self.config.write_mode() { diff --git a/src/modules.rs b/src/modules.rs index 80a7e85c71d..d94b2dd1333 100644 --- a/src/modules.rs +++ b/src/modules.rs @@ -13,9 +13,10 @@ use std::io; use std::path::{Path, PathBuf}; use syntax::ast; -use syntax::codemap::{self, FileName}; +use syntax::codemap; use syntax::parse::{parser, DirectoryOwnership}; +use config::FileName; use utils::contains_skip; /// List all the files containing modules of a crate. @@ -28,12 +29,12 @@ pub fn list_files<'a>( let root_filename = codemap.span_to_filename(krate.span); { let parent = match root_filename { - FileName::Real(ref path) => path.parent().unwrap(), + codemap::FileName::Real(ref path) => path.parent().unwrap(), _ => Path::new(""), }; list_submodules(&krate.module, parent, None, codemap, &mut result)?; } - result.insert(root_filename, &krate.module); + result.insert(root_filename.into(), &krate.module); Ok(result) } diff --git a/src/visitor.rs b/src/visitor.rs index bf1f95381d9..4a0ce4399a4 100644 --- a/src/visitor.rs +++ b/src/visitor.rs @@ -594,7 +594,7 @@ impl<'b, 'a: 'b> FmtVisitor<'a> { pub fn visit_attrs(&mut self, attrs: &[ast::Attribute], style: ast::AttrStyle) -> bool { for attr in attrs { if attr.name() == DEPR_SKIP_ANNOTATION { - let file_name = self.codemap.span_to_filename(attr.span); + let file_name = self.codemap.span_to_filename(attr.span).into(); self.report.append( file_name, vec![FormattingError::from_span( @@ -607,7 +607,7 @@ impl<'b, 'a: 'b> FmtVisitor<'a> { if attr.path.segments.len() == 1 || attr.path.segments[1].ident.to_string() != "skip" { - let file_name = self.codemap.span_to_filename(attr.span); + let file_name = self.codemap.span_to_filename(attr.span).into(); self.report.append( file_name, vec![FormattingError::from_span(