/*
 * 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.cfg;

import com.google.gwt.core.ext.PropertyOracle;
import com.google.gwt.core.ext.typeinfo.TypeOracle;
import com.google.gwt.dev.javac.CompilationState;

import java.util.Set;

/**
 * A query into the deferred binding system. A {@link Condition} can be tested
 * against such a query.
 */
public class DeferredBindingQuery {
  private int fallbackEvalCost = Integer.MAX_VALUE;
  private final Set<String> linkerNames;
  private final PropertyOracle propertyOracle;
  private final String testType;
  private final CompilationState compilationState;
  /**
   * Construct a query for contexts where a type is not available. Such a query
   * also does not need a type oracle.
   */
  public DeferredBindingQuery(PropertyOracle propertyOracle,
      Set<String> linkerNames) {
    this(propertyOracle, linkerNames, null, null);
  }

  /**
   * Construct a fully general query, including a query type and type oracle.
   */
  public DeferredBindingQuery(PropertyOracle propertyOracle, Set<String> linkerNames,
      CompilationState compilationState, String testType) {
    assert propertyOracle != null;
    assert linkerNames != null;

    this.propertyOracle = propertyOracle;
    this.linkerNames = linkerNames;
    this.testType = testType;
    this.compilationState = compilationState;
  }

  public CompilationState getCompilationState() {
    return compilationState;
  }

  public int getFallbackEvaluationCost() {
    return fallbackEvalCost;
  }

  public Set<String> getLinkerNames() {
    return linkerNames;
  }

  public PropertyOracle getPropertyOracle() {
    return propertyOracle;
  }

  public String getTestType() {
    return testType;
  }

  public TypeOracle getTypeOracle() {
    return compilationState.getTypeOracle();
  }

  public void setFallbackEvaluationCost(int cost) {
    fallbackEvalCost = cost;
  }
}
