// 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.function.Function;
import java.util.function.Predicate;
import java.util.stream.Stream;

/**
 * A common interface for {@link DexClass}, {@link DexEncodedField}, and {@link DexEncodedMethod}.
 */
public abstract class DexDefinition extends DexItem {

  public boolean isDexClass() {
    return false;
  }

  public DexClass asDexClass() {
    return null;
  }

  public boolean isDexEncodedField() {
    return false;
  }

  public DexEncodedField asDexEncodedField() {
    return null;
  }

  public boolean isDexEncodedMethod() {
    return false;
  }

  public DexEncodedMethod asDexEncodedMethod() {
    return null;
  }

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

  public abstract DexReference toReference();

  public static Stream<DexReference> mapToReference(Stream<DexDefinition> definitions) {
    return definitions.map(DexDefinition::toReference);
  }

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

  public static Stream<DexClass> filterDexClass(Stream<DexDefinition> stream) {
    return filter(stream, DexDefinition::isDexClass, DexDefinition::asDexClass);
  }

  public static Stream<DexEncodedField> filterDexEncodedField(Stream<DexDefinition> stream) {
    return filter(stream, DexDefinition::isDexEncodedField, DexDefinition::asDexEncodedField);
  }

  public static Stream<DexEncodedMethod> filterDexEncodedMethod(Stream<DexDefinition> stream) {
    return filter(stream, DexDefinition::isDexEncodedMethod, DexDefinition::asDexEncodedMethod);
  }

  public abstract boolean isStatic();

  public abstract boolean isStaticMember();
}
