// 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.graph;

import java.util.Objects;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Stream;

/**
 * A common interface for {@link DexType}, {@link DexField}, and {@link DexMethod}.
 */
public abstract class DexReference extends IndexedDexItem {

  public boolean isDexType() {
    return false;
  }

  public DexType asDexType() {
    return null;
  }

  public boolean isDexMember() {
    return false;
  }

  public DexMember<?, ?> asDexMember() {
    return null;
  }

  public boolean isDexField() {
    return false;
  }

  public DexField asDexField() {
    return null;
  }

  public boolean isDexMethod() {
    return false;
  }

  public DexMethod asDexMethod() {
    return null;
  }

  public static Stream<DexReference> filterDexReference(Stream<DexItem> stream) {
    return DexItem.filter(stream, DexReference.class);
  }

  public DexDefinition toDefinition(AppInfo appInfo) {
    if (isDexType()) {
      return appInfo.definitionFor(asDexType());
    } else if (isDexField()) {
      return appInfo.definitionFor(asDexField());
    } else {
      assert isDexMethod();
      return appInfo.definitionFor(asDexMethod());
    }
  }

  public static Stream<DexDefinition> mapToDefinition(
      Stream<DexReference> references, AppInfo appInfo) {
    return references.map(r -> r.toDefinition(appInfo)).filter(Objects::nonNull);
  }

  private static <T extends DexReference> Stream<T> filter(
      Stream<DexReference> stream,
      Predicate<DexReference> pred,
      Function<DexReference, T> f) {
    return stream.filter(pred).map(f);
  }

  public static Stream<DexType> filterDexType(Stream<DexReference> stream) {
    return filter(stream, DexReference::isDexType, DexReference::asDexType);
  }

  public static Stream<DexField> filterDexField(Stream<DexReference> stream) {
    return filter(stream, DexReference::isDexField, DexReference::asDexField);
  }

  public static Stream<DexMethod> filterDexMethod(Stream<DexReference> stream) {
    return filter(stream, DexReference::isDexMethod, DexReference::asDexMethod);
  }
}
