Skip to content

Commit fe20610

Browse files
committed
Add support for --assume-filename
------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=186912338
1 parent d109789 commit fe20610

File tree

7 files changed

+87
-4
lines changed

7 files changed

+87
-4
lines changed

core/src/main/java/com/google/googlejavaformat/java/CommandLineOptions.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
import com.google.common.collect.ImmutableList;
1818
import com.google.common.collect.ImmutableRangeSet;
19+
import java.util.Optional;
1920

2021
/**
2122
* Command line options for google-java-format.
@@ -39,6 +40,7 @@ final class CommandLineOptions {
3940
private final boolean removeUnusedImports;
4041
private final boolean dryRun;
4142
private final boolean setExitIfChanged;
43+
private final Optional<String> assumeFilename;
4244

4345
CommandLineOptions(
4446
ImmutableList<String> files,
@@ -54,7 +56,8 @@ final class CommandLineOptions {
5456
boolean sortImports,
5557
boolean removeUnusedImports,
5658
boolean dryRun,
57-
boolean setExitIfChanged) {
59+
boolean setExitIfChanged,
60+
Optional<String> assumeFilename) {
5861
this.files = files;
5962
this.inPlace = inPlace;
6063
this.lines = lines;
@@ -69,6 +72,7 @@ final class CommandLineOptions {
6972
this.removeUnusedImports = removeUnusedImports;
7073
this.dryRun = dryRun;
7174
this.setExitIfChanged = setExitIfChanged;
75+
this.assumeFilename = assumeFilename;
7276
}
7377

7478
/** The files to format. */
@@ -143,6 +147,11 @@ boolean setExitIfChanged() {
143147
return setExitIfChanged;
144148
}
145149

150+
/** Return the name to use for diagnostics when formatting standard input. */
151+
Optional<String> assumeFilename() {
152+
return assumeFilename;
153+
}
154+
146155
/** Returns true if partial formatting was selected. */
147156
boolean isSelection() {
148157
return !lines().isEmpty() || !offsets().isEmpty() || !lengths().isEmpty();
@@ -168,6 +177,7 @@ static class Builder {
168177
private boolean removeUnusedImports = true;
169178
private boolean dryRun = false;
170179
private boolean setExitIfChanged = false;
180+
private Optional<String> assumeFilename = Optional.empty();
171181

172182
ImmutableList.Builder<String> filesBuilder() {
173183
return files;
@@ -237,6 +247,11 @@ Builder setExitIfChanged(boolean setExitIfChanged) {
237247
return this;
238248
}
239249

250+
Builder assumeFilename(String assumeFilename) {
251+
this.assumeFilename = Optional.of(assumeFilename);
252+
return this;
253+
}
254+
240255
CommandLineOptions build() {
241256
return new CommandLineOptions(
242257
files.build(),
@@ -252,7 +267,8 @@ CommandLineOptions build() {
252267
sortImports,
253268
removeUnusedImports,
254269
dryRun,
255-
setExitIfChanged);
270+
setExitIfChanged,
271+
assumeFilename);
256272
}
257273
}
258274
}

core/src/main/java/com/google/googlejavaformat/java/CommandLineOptionsParser.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,10 @@ static CommandLineOptions parse(Iterable<String> options) {
115115
case "--set-exit-if-changed":
116116
optionsBuilder.setExitIfChanged(true);
117117
break;
118+
case "-assume-filename":
119+
case "--assume-filename":
120+
optionsBuilder.assumeFilename(getValue(flag, it, value));
121+
break;
118122
default:
119123
throw new IllegalArgumentException("unexpected flag: " + flag);
120124
}

core/src/main/java/com/google/googlejavaformat/java/Main.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ private int formatStdin(CommandLineOptions parameters, JavaFormatterOptions opti
183183
} catch (IOException e) {
184184
throw new IOError(e);
185185
}
186+
String stdinFilename = parameters.assumeFilename().orElse(STDIN_FILENAME);
186187
boolean ok = true;
187188
try {
188189
String output = new FormatFileCallable(parameters, input, options).call();
@@ -192,14 +193,14 @@ private int formatStdin(CommandLineOptions parameters, JavaFormatterOptions opti
192193
}
193194
if (parameters.dryRun()) {
194195
if (changed) {
195-
outWriter.println(STDIN_FILENAME);
196+
outWriter.println(stdinFilename);
196197
}
197198
} else {
198199
outWriter.write(output);
199200
}
200201
} catch (FormatterException e) {
201202
for (FormatterDiagnostic diagnostic : e.diagnostics()) {
202-
errWriter.println(STDIN_FILENAME + ":" + diagnostic.toString());
203+
errWriter.println(stdinFilename + ":" + diagnostic.toString());
203204
}
204205
ok = false;
205206
// TODO(cpovirk): Catch other types of exception (as we do in the formatFiles case).
@@ -238,6 +239,10 @@ public static CommandLineOptions processArgs(String... args) throws UsageExcepti
238239
if (parameters.stdin() && !parameters.files().isEmpty()) {
239240
throw new UsageException("cannot format from standard input and files simultaneously");
240241
}
242+
if (parameters.assumeFilename().isPresent() && !parameters.stdin()) {
243+
throw new UsageException(
244+
"--assume-filename is only supported when formatting standard input");
245+
}
241246
if (parameters.dryRun() && parameters.inPlace()) {
242247
throw new UsageException("cannot use --dry-run and --in-place at the same time");
243248
}

core/src/main/java/com/google/googlejavaformat/java/UsageException.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ final class UsageException extends Exception {
3636
" Send formatted output back to files, not stdout.",
3737
" -",
3838
" Format stdin -> stdout",
39+
" --assume-filename, -assume-filename",
40+
" File name to use for diagnostics when formatting standard input (default is <stdin>).",
3941
" --aosp, -aosp, -a",
4042
" Use AOSP style instead of Google Style (4-space indentation).",
4143
" --fix-imports-only",

core/src/test/java/com/google/googlejavaformat/java/CommandLineFlagsTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,4 +185,16 @@ public void inPlaceDryRun() {
185185
.contains("cannot use --dry-run and --in-place at the same time");
186186
}
187187
}
188+
189+
@Test
190+
public void assumeFileNameOnlyWorksWithStdin() {
191+
try {
192+
Main.processArgs("--assume-filename=Foo.java", "Foo.java");
193+
fail();
194+
} catch (UsageException e) {
195+
assertThat(e)
196+
.hasMessageThat()
197+
.contains("--assume-filename is only supported when formatting standard input");
198+
}
199+
}
188200
}

core/src/test/java/com/google/googlejavaformat/java/CommandLineOptionsParserTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
package com.google.googlejavaformat.java;
1616

1717
import static com.google.common.truth.Truth.assertThat;
18+
import static com.google.common.truth.Truth8.assertThat;
1819
import static java.nio.charset.StandardCharsets.UTF_8;
1920
import static org.junit.Assert.fail;
2021

@@ -175,4 +176,14 @@ public void paramsFile() throws IOException {
175176
CommandLineOptions options = CommandLineOptionsParser.parse(Arrays.asList(args));
176177
assertThat(options.files()).containsExactly("L", "M", "ℕ", "@O", "P", "Q");
177178
}
179+
180+
@Test
181+
public void assumeFilename() {
182+
assertThat(
183+
CommandLineOptionsParser.parse(Arrays.asList("--assume-filename", "Foo.java"))
184+
.assumeFilename())
185+
.hasValue("Foo.java");
186+
assertThat(CommandLineOptionsParser.parse(Arrays.asList("Foo.java")).assumeFilename())
187+
.isEmpty();
188+
}
178189
}

core/src/test/java/com/google/googlejavaformat/java/MainTest.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,4 +443,37 @@ public void exitIfChangedFiles() throws Exception {
443443
assertThat(out).isEqualTo(path.toAbsolutePath().toString() + System.lineSeparator());
444444
assertThat(process.exitValue()).isEqualTo(1);
445445
}
446+
447+
@Test
448+
public void assumeFilename_error() throws Exception {
449+
String[] input = {
450+
"class Test {}}",
451+
};
452+
StringWriter out = new StringWriter();
453+
StringWriter err = new StringWriter();
454+
Main main =
455+
new Main(
456+
new PrintWriter(out, true),
457+
new PrintWriter(err, true),
458+
new ByteArrayInputStream(joiner.join(input).getBytes(UTF_8)));
459+
assertThat(main.format("--assume-filename=Foo.java", "-")).isEqualTo(1);
460+
assertThat(err.toString()).contains("Foo.java:1:15: error: class, interface, or enum expected");
461+
}
462+
463+
@Test
464+
public void assumeFilename_dryRun() throws Exception {
465+
String[] input = {
466+
"class Test {", //
467+
"}",
468+
};
469+
StringWriter out = new StringWriter();
470+
StringWriter err = new StringWriter();
471+
Main main =
472+
new Main(
473+
new PrintWriter(out, true),
474+
new PrintWriter(err, true),
475+
new ByteArrayInputStream(joiner.join(input).getBytes(UTF_8)));
476+
assertThat(main.format("--dry-run", "--assume-filename=Foo.java", "-")).isEqualTo(0);
477+
assertThat(out.toString()).isEqualTo("Foo.java\n");
478+
}
446479
}

0 commit comments

Comments
 (0)