// Copyright (c) 2020, 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.synthesis;

import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.ProgramMethod;
import com.google.common.hash.HashCode;
import com.google.common.hash.Hasher;
import com.google.common.hash.Hashing;
import java.util.Comparator;

/**
 * Definition of a synthetic method item.
 *
 * <p>This class is internal to the synthetic items collection, thus package-protected.
 */
class SyntheticMethodDefinition extends SyntheticDefinition
    implements Comparable<SyntheticMethodDefinition> {

  private final ProgramMethod method;

  SyntheticMethodDefinition(SynthesizingContext context, ProgramMethod method) {
    super(context);
    this.method = method;
  }

  public ProgramMethod getMethod() {
    return method;
  }

  @Override
  SyntheticReference toReference() {
    return new SyntheticMethodReference(getContext(), method.getReference());
  }

  @Override
  DexProgramClass getHolder() {
    return method.getHolder();
  }

  @Override
  HashCode computeHash() {
    Hasher hasher = Hashing.sha256().newHasher();
    method.getDefinition().hashSyntheticContent(hasher);
    return hasher.hash();
  }

  @Override
  boolean isEquivalentTo(SyntheticDefinition other) {
    if (!(other instanceof SyntheticMethodDefinition)) {
      return false;
    }
    SyntheticMethodDefinition o = (SyntheticMethodDefinition) other;
    return method.getDefinition().isSyntheticContentEqual(o.method.getDefinition());
  }

  // Since methods are sharable they must define an order from which representatives can be found.
  @Override
  public int compareTo(SyntheticMethodDefinition other) {
    return Comparator.comparing(SyntheticMethodDefinition::getContextType, DexType::slowCompareTo)
        .thenComparing(m -> m.method.getDefinition(), DexEncodedMethod::syntheticCompareTo)
        .compare(this, other);
  }
}
