/*
 * Copyright 2010 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.gwt.dev.util.arg;

/**
 * Option for enforcing strict compiles. If this option is on, then fail the
 * compile if any of the input files have errors.
 */
public interface OptionStrict {

  /**
   * Returns true if the compiler should strictly fail when any input file has compilation errors.
   */
  boolean isStrict();

  /**
   * Sets whether or not the compiler should strictly fail when any input file has compilation
   * errors.
   */
  void setStrict(boolean enabled);
}
