// 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.origin.Origin;
import java.util.function.Function;

public interface Definition {

  <T> T apply(
      Function<ProgramDefinition, T> programFunction,
      Function<ClasspathDefinition, T> classpathFunction,
      Function<LibraryDefinition, T> libraryFunction);

  default ClasspathOrLibraryClass asClasspathOrLibraryClass() {
    return null;
  }

  default ClasspathOrLibraryDefinition asClasspathOrLibraryDefinition() {
    return null;
  }

  ProgramDerivedContext asProgramDerivedContext(ProgramDerivedContext witness);

  AccessFlags<?> getAccessFlags();

  DexClass getContextClass();

  DexType getContextType();

  DexDefinition getDefinition();

  Origin getOrigin();

  DexReference getReference();

  default boolean isClass() {
    return false;
  }

  default DexClass asClass() {
    return null;
  }

  default boolean isField() {
    return false;
  }

  default DexClassAndField asField() {
    return null;
  }

  default boolean isMember() {
    return !isClass();
  }

  default DexClassAndMember<?, ?> asMember() {
    return null;
  }

  default boolean isMethod() {
    return false;
  }

  default DexClassAndMethod asMethod() {
    return null;
  }

  default boolean isClasspathField() {
    return false;
  }

  default ClasspathField asClasspathField() {
    return null;
  }

  default boolean isClasspathMember() {
    return false;
  }

  default boolean isClasspathMethod() {
    return false;
  }

  default ClasspathMethod asClasspathMethod() {
    return null;
  }

  default boolean isLibraryField() {
    return false;
  }

  default LibraryField asLibraryField() {
    return null;
  }

  default boolean isLibraryMember() {
    return false;
  }

  default boolean isLibraryMethod() {
    return false;
  }

  default LibraryMethod asLibraryMethod() {
    return null;
  }

  default boolean isProgramClass() {
    return false;
  }

  default DexProgramClass asProgramClass() {
    return null;
  }

  default boolean isProgramDefinition() {
    return false;
  }

  default ProgramDefinition asProgramDefinition() {
    return null;
  }

  default boolean isProgramField() {
    return false;
  }

  default ProgramField asProgramField() {
    return null;
  }

  default boolean isProgramMember() {
    return false;
  }

  default ProgramMember<?, ?> asProgramMember() {
    return null;
  }

  default boolean isProgramMethod() {
    return false;
  }

  default ProgramMethod asProgramMethod() {
    return null;
  }
}
