// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

package com.google.dart.compiler.type;

import com.google.dart.compiler.resolver.Element;
import com.google.dart.compiler.resolver.TypeVariableElement;

import java.util.Iterator;
import java.util.List;

/**
 * Default implementation of {@link TypeVariable}.
 */
class TypeVariableImplementation extends AbstractType implements TypeVariable {
  private final TypeVariableElement element;

  public TypeVariableImplementation(TypeVariableElement element) {
    this.element = element;
  }

  @Override
  public TypeVariableElement getElement() {
    return element;
  }

  @Override
  public TypeVariableElement getTypeVariableElement() {
    return getElement();
  }

  @Override
  public String toString() {
    Element owner = element.getDeclaringElement();
    if (owner == null) {
      return element.getName();
    } else {
      return owner.getName() + "." + element.getName();
    }
  }

  @Override
  public Type subst(List<Type> arguments, List<Type> parameters) {
    Iterator<? extends Type> itA = arguments.iterator();
    Iterator<? extends Type> itP = parameters.iterator();
    while (itA.hasNext() && itP.hasNext()) {
      Type argument = itA.next();
      Type parameter = itP.next();
      if (equals(parameter)) {
        return argument;
      }
    }

    // O(1) check to assert arguments and parameters are of same size.
    assert itA.hasNext() == itP.hasNext() :
      "arguments: " + arguments + " parameters: " + parameters;
    return this;
  }

  @Override
  public boolean equals(Object obj) {
    if (obj instanceof TypeVariable) {
      TypeVariable other = (TypeVariable) obj;
      return element.equals(other.getElement());
    }
    return false;
  }

  @Override
  public TypeKind getKind() {
    return TypeKind.VARIABLE;
  }
}
