// Copyright (c) 2021, 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.graph;

import com.android.tools.r8.ir.analysis.type.ArrayTypeElement;
import com.android.tools.r8.ir.analysis.type.ClassTypeElement;
import com.android.tools.r8.ir.analysis.type.TypeElement;
import com.google.common.collect.Iterables;

public class DexTypeUtils {

  public static DexType computeLeastUpperBound(
      AppView<? extends AppInfoWithClassHierarchy> appView, Iterable<DexType> types) {
    TypeElement join =
        TypeElement.join(Iterables.transform(types, type -> type.toTypeElement(appView)), appView);
    return toDexType(appView, join);
  }

  public static DexType toDexType(
      AppView<? extends AppInfoWithClassHierarchy> appView, TypeElement type) {
    DexItemFactory dexItemFactory = appView.dexItemFactory();
    if (type.isPrimitiveType()) {
      return type.asPrimitiveType().toDexType(dexItemFactory);
    }
    if (type.isArrayType()) {
      ArrayTypeElement arrayType = type.asArrayType();
      DexType baseType = toDexType(appView, arrayType.getBaseType());
      return baseType.toArrayType(arrayType.getNesting(), dexItemFactory);
    }
    assert type.isClassType();
    ClassTypeElement classType = type.asClassType();
    if (classType.getClassType() != dexItemFactory.objectType) {
      return classType.getClassType();
    }
    if (classType.getInterfaces().hasSingleKnownInterface()) {
      return classType.getInterfaces().getSingleKnownInterface();
    }
    return dexItemFactory.objectType;
  }
}
