// 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 isNull() {
    return type == DexItemFactory.nullValueType;
  }

  @Override
  public TypeLatticeElement asNullable() {
    assert isNull();
    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 isNull();
    return System.identityHashCode(this);
  }
}
