blob: 82c0843dcb475684b7e467cf88a7ce984bb2ccfb [file] [log] [blame]
/*
* Copyright 2015 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.googlejavaformat.java;
import static com.google.common.base.Preconditions.checkNotNull;
import com.google.common.base.Joiner;
/** Checked exception class for formatter command-line usage errors. */
final class UsageException extends Exception {
private static final Joiner NEWLINE_JOINER = Joiner.on(System.lineSeparator());
private static final String[] DOCS_LINK = {
"https://github.com/google/google-java-format",
};
private static final String[] USAGE = {
"",
"Usage: google-java-format [options] file(s)",
"",
"Options:",
" -i, -r, -replace, --replace",
" Send formatted output back to files, not stdout.",
" -",
" Format stdin -> stdout",
" --assume-filename, -assume-filename",
" File name to use for diagnostics when formatting standard input (default is <stdin>).",
" --aosp, -aosp, -a",
" Use AOSP style instead of Google Style (4-space indentation).",
" --fix-imports-only",
" Fix import order and remove any unused imports, but do no other formatting.",
" --skip-sorting-imports",
" Do not fix the import order. Unused imports will still be removed.",
" --skip-removing-unused-imports",
" Do not remove unused imports. Imports will still be sorted.",
" . --skip-reflowing-long-strings",
" Do not reflow string literals that exceed the column limit.",
" . --skip-javadoc-formatting",
" Do not reformat javadoc.",
" --dry-run, -n",
" Prints the paths of the files whose contents would change if the formatter were run"
+ " normally.",
" --set-exit-if-changed",
" Return exit code 1 if there are any formatting changes.",
" --lines, -lines, --line, -line",
" Line range(s) to format, like 5:10 (1-based; default is all).",
" --offset, -offset",
" Character offset to format (0-based; default is all).",
" --length, -length",
" Character length to format.",
" --help, -help, -h",
" Print this usage statement.",
" --version, -version, -v",
" Print the version.",
" @<filename>",
" Read options and filenames from file.",
"",
};
private static final String[] ADDITIONAL_USAGE = {
"If -i is given with -, the result is sent to stdout.",
"The --lines, --offset, and --length flags may be given more than once.",
"The --offset and --length flags must be given an equal number of times.",
"If --lines, --offset, or --length are given, only one file (or -) may be given."
};
UsageException() {
super(buildMessage(null));
}
UsageException(String message) {
super(buildMessage(checkNotNull(message)));
}
private static String buildMessage(String message) {
StringBuilder builder = new StringBuilder();
if (message != null) {
builder.append(message).append('\n');
}
appendLines(builder, USAGE);
appendLines(builder, ADDITIONAL_USAGE);
appendLines(builder, new String[] {""});
appendLine(builder, Main.versionString());
appendLines(builder, DOCS_LINK);
return builder.toString();
}
private static void appendLine(StringBuilder builder, String line) {
builder.append(line).append(System.lineSeparator());
}
private static void appendLines(StringBuilder builder, String[] lines) {
NEWLINE_JOINER.appendTo(builder, lines).append(System.lineSeparator());
}
}