Skip to content

Commit e822e97

Browse files
refactor: track configs set from cli flags
1 parent e21c1e2 commit e822e97

File tree

4 files changed

+113
-21
lines changed

4 files changed

+113
-21
lines changed

src/bin/main.rs

Lines changed: 39 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -263,24 +263,35 @@ fn format_string(input: String, options: GetOptsOptions) -> Result<i32> {
263263
let (mut config, _) = load_config(Some(Path::new(".")), Some(options.clone()))?;
264264

265265
if options.check {
266-
config.set().emit_mode(EmitMode::Diff);
266+
config.set_cli().emit_mode(EmitMode::Diff);
267267
} else {
268268
match options.emit_mode {
269269
// Emit modes which work with standard input
270270
// None means default, which is Stdout.
271-
None | Some(EmitMode::Stdout) | Some(EmitMode::Checkstyle) | Some(EmitMode::Json) => {}
271+
None => {
272+
config
273+
.set()
274+
.emit_mode(options.emit_mode.unwrap_or(EmitMode::Stdout));
275+
}
276+
Some(EmitMode::Stdout) | Some(EmitMode::Checkstyle) | Some(EmitMode::Json) => {
277+
config
278+
.set_cli()
279+
.emit_mode(options.emit_mode.unwrap_or(EmitMode::Stdout));
280+
}
272281
Some(emit_mode) => {
273282
return Err(OperationError::StdinBadEmit(emit_mode).into());
274283
}
275284
}
276-
config
277-
.set()
278-
.emit_mode(options.emit_mode.unwrap_or(EmitMode::Stdout));
279285
}
280286
config.set().verbose(Verbosity::Quiet);
281287

282288
// parse file_lines
283-
config.set().file_lines(options.file_lines);
289+
if options.file_lines.is_all() {
290+
config.set().file_lines(options.file_lines);
291+
} else {
292+
config.set_cli().file_lines(options.file_lines);
293+
}
294+
284295
for f in config.file_lines().files() {
285296
match *f {
286297
FileName::Stdin => {}
@@ -650,36 +661,46 @@ impl GetOptsOptions {
650661
impl CliOptions for GetOptsOptions {
651662
fn apply_to(self, config: &mut Config) {
652663
if self.verbose {
653-
config.set().verbose(Verbosity::Verbose);
664+
config.set_cli().verbose(Verbosity::Verbose);
654665
} else if self.quiet {
655-
config.set().verbose(Verbosity::Quiet);
666+
config.set_cli().verbose(Verbosity::Quiet);
656667
} else {
657668
config.set().verbose(Verbosity::Normal);
658669
}
659-
config.set().file_lines(self.file_lines);
660-
config.set().unstable_features(self.unstable_features);
670+
671+
if self.file_lines.is_all() {
672+
config.set().file_lines(self.file_lines);
673+
} else {
674+
config.set_cli().file_lines(self.file_lines);
675+
}
676+
677+
if self.unstable_features {
678+
config.set_cli().unstable_features(self.unstable_features);
679+
} else {
680+
config.set().unstable_features(self.unstable_features);
681+
}
661682
if let Some(skip_children) = self.skip_children {
662-
config.set().skip_children(skip_children);
683+
config.set_cli().skip_children(skip_children);
663684
}
664685
if let Some(error_on_unformatted) = self.error_on_unformatted {
665-
config.set().error_on_unformatted(error_on_unformatted);
686+
config.set_cli().error_on_unformatted(error_on_unformatted);
666687
}
667688
if let Some(edition) = self.edition {
668-
config.set().edition(edition);
689+
config.set_cli().edition(edition);
669690
}
670691
if self.check {
671-
config.set().emit_mode(EmitMode::Diff);
692+
config.set_cli().emit_mode(EmitMode::Diff);
672693
} else if let Some(emit_mode) = self.emit_mode {
673-
config.set().emit_mode(emit_mode);
694+
config.set_cli().emit_mode(emit_mode);
674695
}
675696
if self.backup {
676-
config.set().make_backup(true);
697+
config.set_cli().make_backup(true);
677698
}
678699
if let Some(color) = self.color {
679-
config.set().color(color);
700+
config.set_cli().color(color);
680701
}
681702
if self.print_misformatted_file_names {
682-
config.set().print_misformatted_file_names(true);
703+
config.set_cli().print_misformatted_file_names(true);
683704
}
684705

685706
for (key, val) in self.inline_config {

src/config/config_type.rs

Lines changed: 59 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,10 @@ macro_rules! create_config {
8989
// - 1: true if the option was manually initialized
9090
// - 2: the option value
9191
// - 3: true if the option is unstable
92-
$($i: (Cell<bool>, bool, <$ty as StyleEditionDefault>::ConfigType, bool)),+
92+
// - 4: true if the option was set manually from a CLI flag
93+
// FIXME: 4 is probably unnecessary and duplicative
94+
// https://github.com/rust-lang/rustfmt/issues/6252
95+
$($i: (Cell<bool>, bool, <$ty as StyleEditionDefault>::ConfigType, bool, bool)),+
9396
}
9497

9598
// Just like the Config struct but with each property wrapped
@@ -136,6 +139,35 @@ macro_rules! create_config {
136139
)+
137140
}
138141

142+
#[allow(unreachable_pub)]
143+
pub struct CliConfigSetter<'a>(&'a mut Config);
144+
145+
impl<'a> CliConfigSetter<'a> {
146+
$(
147+
#[allow(unreachable_pub)]
148+
pub fn $i(&mut self, value: <$ty as StyleEditionDefault>::ConfigType) {
149+
(self.0).$i.2 = value;
150+
(self.0).$i.4 = true;
151+
match stringify!($i) {
152+
"max_width"
153+
| "use_small_heuristics"
154+
| "fn_call_width"
155+
| "single_line_if_else_max_width"
156+
| "single_line_let_else_max_width"
157+
| "attr_fn_like_width"
158+
| "struct_lit_width"
159+
| "struct_variant_width"
160+
| "array_width"
161+
| "chain_width" => self.0.set_heuristics(),
162+
"merge_imports" => self.0.set_merge_imports(),
163+
"fn_args_layout" => self.0.set_fn_args_layout(),
164+
"hide_parse_errors" => self.0.set_hide_parse_errors(),
165+
&_ => (),
166+
}
167+
}
168+
)+
169+
}
170+
139171
// Query each option, returns true if the user set the option, false if
140172
// a default was used.
141173
#[allow(unreachable_pub)]
@@ -150,6 +182,20 @@ macro_rules! create_config {
150182
)+
151183
}
152184

185+
// Query each option, returns true if the user set the option via a CLI flag,
186+
// false if a default was used.
187+
#[allow(unreachable_pub)]
188+
pub struct CliConfigWasSet<'a>(&'a Config);
189+
190+
impl<'a> CliConfigWasSet<'a> {
191+
$(
192+
#[allow(unreachable_pub)]
193+
pub fn $i(&self) -> bool {
194+
(self.0).$i.4
195+
}
196+
)+
197+
}
198+
153199
impl Config {
154200
$(
155201
#[allow(unreachable_pub)]
@@ -169,7 +215,8 @@ macro_rules! create_config {
169215
<$ty as StyleEditionDefault>::style_edition_default(
170216
style_edition
171217
),
172-
$stb
218+
$stb,
219+
false,
173220
),
174221
)+
175222
}
@@ -180,11 +227,21 @@ macro_rules! create_config {
180227
ConfigSetter(self)
181228
}
182229

230+
#[allow(unreachable_pub)]
231+
pub fn set_cli(&mut self) -> CliConfigSetter<'_> {
232+
CliConfigSetter(self)
233+
}
234+
183235
#[allow(unreachable_pub)]
184236
pub fn was_set(&self) -> ConfigWasSet<'_> {
185237
ConfigWasSet(self)
186238
}
187239

240+
#[allow(unreachable_pub)]
241+
pub fn was_set_cli(&self) -> CliConfigWasSet<'_> {
242+
CliConfigWasSet(self)
243+
}
244+
188245
fn fill_from_parsed_config(mut self, parsed: PartialConfig, dir: &Path) -> Config {
189246
$(
190247
if let Some(option_value) = parsed.$i {

src/config/file_lines.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ impl FileLines {
201201
}
202202

203203
/// Returns `true` if this `FileLines` contains all lines in all files.
204-
pub(crate) fn is_all(&self) -> bool {
204+
pub fn is_all(&self) -> bool {
205205
self.0.is_none()
206206
}
207207

src/config/mod.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -741,6 +741,20 @@ make_backup = false
741741
assert_eq!(config.unstable_features(), true);
742742
}
743743

744+
#[test]
745+
fn test_set_cli() {
746+
let mut config = Config::default();
747+
assert_eq!(config.was_set().edition(), false);
748+
assert_eq!(config.was_set_cli().edition(), false);
749+
config.set().edition(Edition::Edition2021);
750+
assert_eq!(config.was_set().edition(), false);
751+
assert_eq!(config.was_set_cli().edition(), false);
752+
config.set_cli().edition(Edition::Edition2021);
753+
assert_eq!(config.was_set().edition(), false);
754+
assert_eq!(config.was_set_cli().edition(), true);
755+
assert_eq!(config.was_set_cli().emit_mode(), false);
756+
}
757+
744758
#[cfg(test)]
745759
mod deprecated_option_merge_imports {
746760
use super::*;

0 commit comments

Comments
 (0)