content: /*
   * Copyright 2016 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 com.google.common.collect.ImmutableList;
  import com.google.common.collect.ImmutableRangeSet;
  import java.util.Optional;
  
  /**
   * Command line options for google-java-format.
   *
   * <p>google-java-format doesn't depend on AutoValue, to allow AutoValue to depend on
   * google-java-format.
   */
  final class CommandLineOptions {
  
    private final ImmutableList<String> files;
    private final boolean inPlace;
    private final ImmutableRangeSet<Integer> lines;
    private final ImmutableList<Integer> offsets;
    private final ImmutableList<Integer> lengths;
    private final boolean aosp;
    private final boolean version;
    private final boolean help;
    private final boolean stdin;
    private final boolean fixImportsOnly;
    private final boolean sortImports;
    private final boolean removeUnusedImports;
    private final boolean dryRun;
    private final boolean setExitIfChanged;
    private final Optional<String> assumeFilename;
    private final boolean reflowLongStrings;
    private final boolean formatJavadoc;
  
    CommandLineOptions(
        ImmutableList<String> files,
        boolean inPlace,
        ImmutableRangeSet<Integer> lines,
        ImmutableList<Integer> offsets,
        ImmutableList<Integer> lengths,
        boolean aosp,
        boolean version,
        boolean help,
        boolean stdin,
        boolean fixImportsOnly,
        boolean sortImports,
        boolean removeUnusedImports,
        boolean dryRun,
        boolean setExitIfChanged,
        Optional<String> assumeFilename,
        boolean reflowLongStrings,
        boolean formatJavadoc) {
      this.files = files;
      this.inPlace = inPlace;
      this.lines = lines;
      this.offsets = offsets;
      this.lengths = lengths;
      this.aosp = aosp;
      this.version = version;
      this.help = help;
      this.stdin = stdin;
      this.fixImportsOnly = fixImportsOnly;
      this.sortImports = sortImports;
      this.removeUnusedImports = removeUnusedImports;
      this.dryRun = dryRun;
      this.setExitIfChanged = setExitIfChanged;
      this.assumeFilename = assumeFilename;
      this.reflowLongStrings = reflowLongStrings;
      this.formatJavadoc = formatJavadoc;
    }
  
    /** The files to format. */
    ImmutableList<String> files() {
      return files;
    }
  
    /** Format files in place. */
    boolean inPlace() {
      return inPlace;
    }
  
    /** Line ranges to format. */
    ImmutableRangeSet<Integer> lines() {
      return lines;
    }
  
    /** Character offsets for partial formatting, paired with {@code lengths}. */
    ImmutableList<Integer> offsets() {
      return offsets;
    }
  
    /** Partial formatting region lengths, paired with {@code offsets}. */
    ImmutableList<Integer> lengths() {
      return lengths;
    }
  
    /** Use AOSP style instead of Google Style (4-space indentation). */
    boolean aosp() {
      return aosp;
    }
  
    /** Print the version. */
    boolean version() {
      return version;
    }
  
    /** Print usage information. */
    boolean help() {
      return help;
    }
  
    /** Format input from stdin. */
    boolean stdin() {
      return stdin;
    }
  
    /** Fix imports, but do no formatting. */
    boolean fixImportsOnly() {
      return fixImportsOnly;
    }
  
    /** Sort imports. */
    boolean sortImports() {
      return sortImports;
    }
  
    /** Remove unused imports. */
    boolean removeUnusedImports() {
      return removeUnusedImports;
    }
  
    /**
     * Print the paths of the files whose contents would change if the formatter were run normally.
     */
    boolean dryRun() {
      return dryRun;
    }
  
    /** Return exit code 1 if there are any formatting changes. */
    boolean setExitIfChanged() {
      return setExitIfChanged;
    }
  
    /** Return the name to use for diagnostics when formatting standard input. */
    Optional<String> assumeFilename() {
      return assumeFilename;
    }
  
    boolean reflowLongStrings() {
      return reflowLongStrings;
    }
  
    /** Returns true if partial formatting was selected. */
    boolean isSelection() {
      return !lines().isEmpty() || !offsets().isEmpty() || !lengths().isEmpty();
    }
  
    boolean formatJavadoc() {
      return formatJavadoc;
    }
  
    static Builder builder() {
      return new Builder();
    }
  
    static class Builder {
  
      private final ImmutableList.Builder<String> files = ImmutableList.builder();
      private final ImmutableRangeSet.Builder<Integer> lines = ImmutableRangeSet.builder();
      private final ImmutableList.Builder<Integer> offsets = ImmutableList.builder();
      private final ImmutableList.Builder<Integer> lengths = ImmutableList.builder();
      private boolean inPlace = false;
      private boolean aosp = false;
      private boolean version = false;
      private boolean help = false;
      private boolean stdin = false;
      private boolean fixImportsOnly = false;
      private boolean sortImports = true;
      private boolean removeUnusedImports = true;
      private boolean dryRun = false;
      private boolean setExitIfChanged = false;
      private Optional<String> assumeFilename = Optional.empty();
      private boolean reflowLongStrings = true;
      private boolean formatJavadoc = true;
  
      ImmutableList.Builder<String> filesBuilder() {
        return files;
      }
  
      Builder inPlace(boolean inPlace) {
        this.inPlace = inPlace;
        return this;
      }
  
      ImmutableRangeSet.Builder<Integer> linesBuilder() {
        return lines;
      }
  
      Builder addOffset(Integer offset) {
        offsets.add(offset);
        return this;
      }
  
      Builder addLength(Integer length) {
        lengths.add(length);
        return this;
      }
  
      Builder aosp(boolean aosp) {
        this.aosp = aosp;
        return this;
      }
  
      Builder version(boolean version) {
        this.version = version;
        return this;
      }
  
      Builder help(boolean help) {
        this.help = help;
        return this;
      }
  
      Builder stdin(boolean stdin) {
        this.stdin = stdin;
        return this;
      }
  
      Builder fixImportsOnly(boolean fixImportsOnly) {
        this.fixImportsOnly = fixImportsOnly;
        return this;
      }
  
      Builder sortImports(boolean sortImports) {
        this.sortImports = sortImports;
        return this;
      }
  
      Builder removeUnusedImports(boolean removeUnusedImports) {
        this.removeUnusedImports = removeUnusedImports;
        return this;
      }
  
      Builder dryRun(boolean dryRun) {
        this.dryRun = dryRun;
        return this;
      }
  
      Builder setExitIfChanged(boolean setExitIfChanged) {
        this.setExitIfChanged = setExitIfChanged;
        return this;
      }
  
      Builder assumeFilename(String assumeFilename) {
        this.assumeFilename = Optional.of(assumeFilename);
        return this;
      }
  
      Builder reflowLongStrings(boolean reflowLongStrings) {
        this.reflowLongStrings = reflowLongStrings;
        return this;
      }
  
      Builder formatJavadoc(boolean formatJavadoc) {
        this.formatJavadoc = formatJavadoc;
        return this;
      }
  
      CommandLineOptions build() {
        return new CommandLineOptions(
            files.build(),
            inPlace,
            lines.build(),
            offsets.build(),
            lengths.build(),
            aosp,
            version,
            help,
            stdin,
            fixImportsOnly,
            sortImports,
            removeUnusedImports,
            dryRun,
            setExitIfChanged,
            assumeFilename,
            reflowLongStrings,
            formatJavadoc);
      }
    }
  }
  