// 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 com.android.tools.r8.errors.Unreachable;

public class TopDownClassHierarchyTraversal<T extends DexClass>
    extends ClassHierarchyTraversal<T, TopDownClassHierarchyTraversal<T>> {

  private TopDownClassHierarchyTraversal(
      AppView<? extends AppInfoWithClassHierarchy> appView, Scope scope) {
    super(appView, scope);
  }

  /**
   * Returns a visitor that can be used to visit all the classes (including class path and library
   * classes) that are reachable from a given set of sources.
   */
  public static TopDownClassHierarchyTraversal<DexClass> forAllClasses(
      AppView<? extends AppInfoWithClassHierarchy> appView) {
    return new TopDownClassHierarchyTraversal<>(appView, Scope.ALL_CLASSES);
  }

  /**
   * Returns a visitor that can be used to visit all the library classes that are reachable from a
   * given set of sources.
   */
  public static TopDownClassHierarchyTraversal<DexLibraryClass> forLibraryClasses(
      AppView<? extends AppInfoWithClassHierarchy> appView) {
    return new TopDownClassHierarchyTraversal<>(appView, Scope.ONLY_LIBRARY_CLASSES);
  }

  /**
   * Returns a visitor that can be used to visit all the library and classpath classes that are
   * reachable from a given set of sources.
   */
  public static TopDownClassHierarchyTraversal<DexClass> forLibraryAndClasspathClasses(
      AppView<? extends AppInfoWithClassHierarchy> appView) {
    return new TopDownClassHierarchyTraversal<>(appView, Scope.ONLY_LIBRARY_AND_CLASSPATH_CLASSES);
  }

  /**
   * Returns a visitor that can be used to visit all the program classes that are reachable from a
   * given set of sources.
   */
  public static TopDownClassHierarchyTraversal<DexProgramClass> forProgramClasses(
      AppView<? extends AppInfoWithClassHierarchy> appView) {
    return new TopDownClassHierarchyTraversal<>(appView, Scope.ONLY_PROGRAM_CLASSES);
  }

  @Override
  TopDownClassHierarchyTraversal<T> self() {
    return this;
  }

  @Override
  void addDependentsToWorklist(DexClass clazz) {

    if (excludeInterfaces && clazz.isInterface()) {
      return;
    }

    if (visited.contains(clazz)) {
      return;
    }

    if (scope.shouldBePassedToVisitor(clazz)) {
      @SuppressWarnings("unchecked")
      T clazzWithTypeT = (T) clazz;
      worklist.addFirst(clazzWithTypeT);
    }

    // Add super classes to worklist.
    if (clazz.superType != null) {
      DexClass definition = definitionSupplier.contextIndependentDefinitionFor(clazz.superType);
      if (definition != null && shouldTraverseUpwardsFrom(definition)) {
        addDependentsToWorklist(definition);
      }
    }

    // Add super interfaces to worklist.
    if (!excludeInterfaces) {
      for (DexType interfaceType : clazz.interfaces.values) {
        DexClass definition = definitionSupplier.contextIndependentDefinitionFor(interfaceType);
        if (definition != null && shouldTraverseUpwardsFrom(definition)) {
          addDependentsToWorklist(definition);
        }
      }
    }
  }

  private boolean shouldTraverseUpwardsFrom(DexClass clazz) {
    switch (scope) {
      case ALL_CLASSES:
      case ONLY_LIBRARY_CLASSES:
      case ONLY_LIBRARY_AND_CLASSPATH_CLASSES:
        return true;
      case ONLY_PROGRAM_CLASSES:
        return clazz.isProgramClass();

      default:
        throw new Unreachable();
    }
  }
}
