// 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.horizontalclassmerging.policies;

import static com.android.tools.r8.graph.DexProgramClass.asProgramClassOrNull;

import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.SubtypingInfo;
import com.android.tools.r8.horizontalclassmerging.HorizontalClassMerger.Mode;
import com.android.tools.r8.horizontalclassmerging.MergeGroup;
import com.android.tools.r8.horizontalclassmerging.MultiClassPolicyWithPreprocessing;
import com.android.tools.r8.utils.SetUtils;
import com.android.tools.r8.utils.WorkList;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import java.util.ArrayList;
import java.util.Collection;
import java.util.IdentityHashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;

/**
 * This policy ensures that we do not create cycles in the class hierarchy as a result of interface
 * merging.
 *
 * <p>Example: Consider that we have the following three interfaces:
 *
 * <pre>
 *   interface I extends ... {}
 *   interface J extends I, ... {}
 *   interface K extends J, ... {}
 * </pre>
 *
 * <p>In this case, it would be possible to merge the groups {I, J}, {J, K}, and {I, J, K}. Common
 * to these merge groups is that each interface in the merge group can reach all other interfaces in
 * the same merge group in the class hierarchy, without visiting any interfaces outside the merge
 * group.
 *
 * <p>The group {I, K} cannot safely be merged, as this would lead to a cycle in the class
 * hierarchy:
 *
 * <pre>
 *   interface IK extends J, ... {}
 *   interface J extends IK, ... {}
 * </pre>
 */
public class OnlyDirectlyConnectedOrUnrelatedInterfaces
    extends MultiClassPolicyWithPreprocessing<SubtypingInfo> {

  private final AppView<? extends AppInfoWithClassHierarchy> appView;
  private final Mode mode;

  // The interface merge groups that this policy has committed to so far.
  private final Map<DexProgramClass, MergeGroup> committed = new IdentityHashMap<>();

  public OnlyDirectlyConnectedOrUnrelatedInterfaces(
      AppView<? extends AppInfoWithClassHierarchy> appView, Mode mode) {
    this.appView = appView;
    this.mode = mode;
  }

  @Override
  public Collection<MergeGroup> apply(MergeGroup group, SubtypingInfo subtypingInfo) {
    if (!group.isInterfaceGroup()) {
      return ImmutableList.of(group);
    }

    List<MergeGroupWithInfo> newGroupsWithInfo = new ArrayList<>();
    for (DexProgramClass clazz : group) {
      Set<DexProgramClass> superInterfaces = computeSuperInterfaces(clazz);
      Set<DexProgramClass> subInterfaces = computeSubInterfaces(clazz, subtypingInfo);

      MergeGroupWithInfo newGroup = null;
      for (MergeGroupWithInfo candidateGroup : newGroupsWithInfo) {
        // Check if adding `clazz` to `candidateGroup` would introduce a super interface that is
        // also a sub interface. In that case we must abort since merging would lead to a cycle in
        // the class hierarchy.
        if (candidateGroup.isSafeToAddSubAndSuperInterfaces(
            clazz, subInterfaces, superInterfaces)) {
          newGroup = candidateGroup;
          break;
        }
      }

      if (newGroup != null) {
        newGroup.add(clazz, superInterfaces, subInterfaces);
      } else {
        newGroupsWithInfo.add(new MergeGroupWithInfo(clazz, superInterfaces, subInterfaces));
      }
    }

    List<MergeGroup> newGroups = new LinkedList<>();
    for (MergeGroupWithInfo newGroupWithInfo : newGroupsWithInfo) {
      MergeGroup newGroup = newGroupWithInfo.getGroup();
      if (!newGroup.isTrivial()) {
        newGroups.add(newGroup);
        newGroup.forEach(clazz -> committed.put(clazz, newGroup));
      }
    }
    return newGroups;
  }

  private Set<DexProgramClass> computeSuperInterfaces(DexProgramClass clazz) {
    return computeTransitiveSubOrSuperInterfaces(clazz, DexClass::getInterfaces);
  }

  private Set<DexProgramClass> computeSubInterfaces(
      DexProgramClass clazz, SubtypingInfo subtypingInfo) {
    return computeTransitiveSubOrSuperInterfaces(
        clazz, definition -> subtypingInfo.allImmediateExtendsSubtypes(definition.getType()));
  }

  private Set<DexProgramClass> computeTransitiveSubOrSuperInterfaces(
      DexProgramClass clazz,
      Function<DexProgramClass, Iterable<DexType>> immediateSubOrSuperInterfacesProvider) {
    WorkList<DexProgramClass> workList = WorkList.newWorkList(new LinkedHashSet<>());
    // Intentionally not marking `clazz` as seen, since we only want the strict sub/super types.
    workList.addIgnoringSeenSet(clazz);
    while (workList.hasNext()) {
      DexProgramClass interfaceDefinition = workList.next();
      MergeGroup group = committed.get(interfaceDefinition);
      if (group != null) {
        workList.addIfNotSeen(group);
      }
      for (DexType immediateSubOrSuperInterfaceType :
          immediateSubOrSuperInterfacesProvider.apply(interfaceDefinition)) {
        DexProgramClass immediateSubOrSuperInterface =
            asProgramClassOrNull(appView.definitionFor(immediateSubOrSuperInterfaceType));
        if (immediateSubOrSuperInterface != null) {
          workList.addIfNotSeen(immediateSubOrSuperInterface);
        }
      }
    }
    assert !workList.isSeen(clazz);
    return workList.getMutableSeenSet();
  }

  @Override
  public void clear() {
    committed.clear();
  }

  @Override
  public String getName() {
    return "OnlyDirectlyConnectedOrUnrelatedInterfaces";
  }

  @Override
  public SubtypingInfo preprocess(Collection<MergeGroup> groups) {
    return new SubtypingInfo(appView);
  }

  @Override
  public boolean shouldSkipPolicy() {
    return !appView.options().horizontalClassMergerOptions().isInterfaceMergingEnabled(mode);
  }

  static class MergeGroupWithInfo {

    private final MergeGroup group;
    private final Set<DexProgramClass> members;
    private final Set<DexProgramClass> superInterfaces;
    private final Set<DexProgramClass> subInterfaces;

    MergeGroupWithInfo(
        DexProgramClass clazz,
        Set<DexProgramClass> superInterfaces,
        Set<DexProgramClass> subInterfaces) {
      this.group = new MergeGroup(clazz);
      this.members = SetUtils.newIdentityHashSet(clazz);
      this.superInterfaces = superInterfaces;
      this.subInterfaces = subInterfaces;
    }

    void add(
        DexProgramClass clazz,
        Set<DexProgramClass> newSuperInterfaces,
        Set<DexProgramClass> newSubInterfaces) {
      group.add(clazz);
      members.add(clazz);
      Iterables.addAll(
          superInterfaces,
          Iterables.filter(
              newSuperInterfaces, superInterface -> !members.contains(superInterface)));
      superInterfaces.remove(clazz);
      Iterables.addAll(
          subInterfaces,
          Iterables.filter(newSubInterfaces, subInterface -> !members.contains(subInterface)));
      subInterfaces.remove(clazz);
    }

    MergeGroup getGroup() {
      return group;
    }

    boolean isSafeToAddSubAndSuperInterfaces(
        DexProgramClass clazz,
        Set<DexProgramClass> newSubInterfaces,
        Set<DexProgramClass> newSuperInterfaces) {
      // Check that adding the new sub and super interfaces to the group is safe.
      for (DexProgramClass newSubInterface : newSubInterfaces) {
        if (!group.contains(newSubInterface) && superInterfaces.contains(newSubInterface)) {
          return false;
        }
      }
      for (DexProgramClass newSuperInterface : newSuperInterfaces) {
        if (!group.contains(newSuperInterface) && subInterfaces.contains(newSuperInterface)) {
          return false;
        }
      }
      // Check that adding the sub and super interfaces of the group to the current class is safe.
      for (DexProgramClass subInterface : subInterfaces) {
        if (subInterface != clazz && newSuperInterfaces.contains(subInterface)) {
          return false;
        }
      }
      for (DexProgramClass superInterface : superInterfaces) {
        if (superInterface != clazz && newSubInterfaces.contains(superInterface)) {
          return false;
        }
      }
      return true;
    }
  }
}
