google-java-format-master/core/src/main/java/com/google/googlejavaformat/Output.java
/*
 * 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;

import com.google.common.base.MoreObjects;
import com.google.common.collect.Range;
import com.google.googlejavaformat.OpsBuilder.BlankLineWanted;
import java.util.Optional;

/** An output from the formatter. */
public abstract class Output extends InputOutput {
  /** Unique identifier for a break. */
  public static final class BreakTag {

    Optional<Boolean> taken = Optional.empty();

    public void recordBroken(boolean broken) {
      // TODO(cushon): enforce invariants.
      // Currently we rely on setting Breaks multiple times, e.g. when deciding
      // whether a Level should be flowed. Using separate data structures
      // instead of mutation or adding an explicit 'reset' step would allow
      // a useful invariant to be enforced here.
      taken = Optional.of(broken);
    }

    public boolean wasBreakTaken() {
      return taken.orElse(false);
    }
  }

  /**
   * Indent by outputting {@code indent} spaces.
   *
   * @param indent the current indent
   */
  public abstract void indent(int indent);

  /**
   * Output a string.
   *
   * @param text the string
   * @param range the {@link Range} corresponding to the string
   */
  public abstract void append(String text, Range<Integer> range);

  /**
   * A blank line is or is not wanted here.
   *
   * @param k the {@link Input.Tok} index
   * @param wanted whether a blank line is wanted here
   */
  public abstract void blankLine(int k, BlankLineWanted wanted);

  /** Marks a region that can be partially formatted. */
  public abstract void markForPartialFormat(Input.Token start, Input.Token end);

  /**
   * Get the {@link CommentsHelper}.
   *
   * @return the {@link CommentsHelper}
   */
  public abstract CommentsHelper getCommentsHelper();

  @Override
  public String toString() {
    return MoreObjects.toStringHelper(this).add("super", super.toString()).toString();
  }
}
