// Copyright (c) 2018, the R8 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.android.tools.r8.ir.analysis.type;

import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
import java.util.Collections;
import java.util.Set;

public class ReferenceTypeLatticeElement extends TypeLatticeElement {
  private static final ReferenceTypeLatticeElement NULL_INSTANCE =
      new ReferenceTypeLatticeElement(true, DexItemFactory.nullValueType);

  // TODO(b/72693244): Consider moving this to ClassTypeLatticeElement.
  final DexType type;

  // Link between maybe-null and definitely-not-null reference type lattices.
  ReferenceTypeLatticeElement dual;

  public ReferenceTypeLatticeElement getOrCreateDualLattice() {
    throw new Unreachable("Should be defined/used by class/array types.");
  }

  static void linkDualLattice(ReferenceTypeLatticeElement t1, ReferenceTypeLatticeElement t2) {
    assert t1.dual == null && t2.dual == null;
    t1.dual = t2;
    t2.dual = t1;
  }

  ReferenceTypeLatticeElement(boolean isNullable, DexType type) {
    super(isNullable);
    this.type = type;
  }

  static ReferenceTypeLatticeElement getNullTypeLatticeElement() {
    return NULL_INSTANCE;
  }

  public Set<DexType> getInterfaces() {
    return Collections.emptySet();
  }

  @Override
  public boolean isNullType() {
    return type == DexItemFactory.nullValueType;
  }

  @Override
  public TypeLatticeElement asNullable() {
    assert isNullType();
    return this;
  }

  @Override
  public boolean isReference() {
    return true;
  }

  @Override
  public String toString() {
    return isNullableString() + type.toString();
  }

  @Override
  public boolean equals(Object o) {
    if (this == o) {
      return true;
    }
    if (!(o instanceof ReferenceTypeLatticeElement)) {
      return false;
    }
    ReferenceTypeLatticeElement other = (ReferenceTypeLatticeElement) o;
    if (this.isNullable() != other.isNullable()) {
      return false;
    }
    if (!type.equals(other.type)) {
      return false;
    }
    Set<DexType> thisInterfaces = getInterfaces();
    Set<DexType> otherInterfaces = other.getInterfaces();
    if (thisInterfaces.size() != otherInterfaces.size()) {
      return false;
    }
    return thisInterfaces.containsAll(otherInterfaces);
  }

  @Override
  public int hashCode() {
    assert isNullType();
    return System.identityHashCode(this);
  }
}
