From a7d4ec92cb4cb77e602ef78a7e2ce3461922a7f1 Mon Sep 17 00:00:00 2001 From: Seiichi Uchida Date: Wed, 22 May 2019 16:41:57 +0900 Subject: [PATCH] Implement Serialize on IgnoreList (#3565) * Implement Serialize on IgnoreList * Add a test for #3536 --- src/config/mod.rs | 73 +++++++++++++++++++++++++++++++++++++++++++ src/config/options.rs | 20 +++++++++--- 2 files changed, 89 insertions(+), 4 deletions(-) diff --git a/src/config/mod.rs b/src/config/mod.rs index d21899049658..eaa6d012d5b0 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -462,6 +462,79 @@ fn test_print_docs_include_unstable() { assert_eq!(s.contains("(unstable)"), true); } + #[test] + fn test_dump_default_config() { + const DEFAULT_CONFIG: &str = r#"max_width = 100 +hard_tabs = false +tab_spaces = 4 +newline_style = "Auto" +use_small_heuristics = "Default" +indent_style = "Block" +wrap_comments = false +format_code_in_doc_comments = false +comment_width = 80 +normalize_comments = false +normalize_doc_attributes = false +license_template_path = "" +format_strings = false +format_macro_matchers = false +format_macro_bodies = true +empty_item_single_line = true +struct_lit_single_line = true +fn_single_line = false +where_single_line = false +imports_indent = "Block" +imports_layout = "Mixed" +merge_imports = false +reorder_imports = true +reorder_modules = true +reorder_impl_items = false +type_punctuation_density = "Wide" +space_before_colon = false +space_after_colon = true +spaces_around_ranges = false +binop_separator = "Front" +remove_nested_parens = true +combine_control_expr = true +overflow_delimited_expr = false +struct_field_align_threshold = 0 +enum_discrim_align_threshold = 0 +match_arm_blocks = true +force_multiline_blocks = false +fn_args_density = "Tall" +brace_style = "SameLineWhere" +control_brace_style = "AlwaysSameLine" +trailing_semicolon = true +trailing_comma = "Vertical" +match_block_trailing_comma = false +blank_lines_upper_bound = 1 +blank_lines_lower_bound = 0 +edition = "2015" +version = "One" +inline_attribute_width = 0 +merge_derives = true +use_try_shorthand = false +use_field_init_shorthand = false +force_explicit_abi = true +condense_wildcard_suffixes = false +color = "Auto" +required_version = "1.2.2" +unstable_features = false +disable_all_formatting = false +skip_children = false +hide_parse_errors = false +error_on_line_overflow = false +error_on_unformatted = false +report_todo = "Never" +report_fixme = "Never" +ignore = [] +emit_mode = "Files" +make_backup = false +"#; + let toml = Config::default().all_options().to_toml().unwrap(); + assert_eq!(&toml, DEFAULT_CONFIG); + } + // FIXME(#2183): these tests cannot be run in parallel because they use env vars. // #[test] // fn test_as_not_nightly_channel() { diff --git a/src/config/options.rs b/src/config/options.rs index 4de8ef928dd5..72acaacd3482 100644 --- a/src/config/options.rs +++ b/src/config/options.rs @@ -5,7 +5,8 @@ use atty; use config_proc_macro::config_type; use serde::de::{SeqAccess, Visitor}; -use serde::{Deserialize, Deserializer, Serialize}; +use serde::ser::SerializeSeq; +use serde::{Deserialize, Deserializer, Serialize, Serializer}; use crate::config::lists::*; use crate::config::Config; @@ -254,16 +255,27 @@ fn default() -> EmitMode { } /// A set of directories, files and modules that rustfmt should ignore. -#[derive(Default, Serialize, Clone, Debug, PartialEq)] +#[derive(Default, Clone, Debug, PartialEq)] pub struct IgnoreList { /// A set of path specified in rustfmt.toml. - #[serde(flatten)] path_set: HashSet, /// A path to rustfmt.toml. - #[serde(skip_serializing)] rustfmt_toml_path: PathBuf, } +impl Serialize for IgnoreList { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + let mut seq = serializer.serialize_seq(Some(self.path_set.len()))?; + for e in &self.path_set { + seq.serialize_element(e)?; + } + seq.end() + } +} + impl<'de> Deserialize<'de> for IgnoreList { fn deserialize(deserializer: D) -> Result where