// 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.graph;

import com.android.tools.r8.ir.optimize.info.MethodOptimizationInfo;
import com.android.tools.r8.references.MethodReference;

public abstract class DexClassAndMethod extends DexClassAndMember<DexEncodedMethod, DexMethod>
    implements LookupMethodTarget {

  DexClassAndMethod(DexClass holder, DexEncodedMethod method) {
    super(holder, method);
    assert holder.isClasspathClass() == (this instanceof ClasspathMethod);
    assert holder.isLibraryClass() == (this instanceof LibraryMethod);
    assert holder.isProgramClass() == (this instanceof ProgramMethod);
  }

  public static ProgramMethod asProgramMethodOrNull(DexClassAndMethod method) {
    return method != null ? method.asProgramMethod() : null;
  }

  public static DexClassAndMethod create(DexClass holder, DexEncodedMethod method) {
    if (holder.isProgramClass()) {
      return new ProgramMethod(holder.asProgramClass(), method);
    }
    if (holder.isLibraryClass()) {
      return new LibraryMethod(holder.asLibraryClass(), method);
    }
    assert holder.isClasspathClass();
    return new ClasspathMethod(holder.asClasspathClass(), method);
  }

  public boolean isDefaultMethod() {
    return getHolder().isInterface() && getDefinition().isDefaultMethod();
  }

  public boolean isStructurallyEqualTo(DexClassAndMethod other) {
    return getDefinition() == other.getDefinition() && getHolder() == other.getHolder();
  }

  @Override
  public LookupTarget toLookupTarget(DexClassAndMethod classAndMethod) {
    return classAndMethod;
  }

  @Override
  public MethodAccessFlags getAccessFlags() {
    return getDefinition().getAccessFlags();
  }

  public MethodReference getMethodReference() {
    return getReference().asMethodReference();
  }

  public DexMethodSignature getMethodSignature() {
    return getReference().getSignature();
  }

  @Override
  public MethodOptimizationInfo getOptimizationInfo() {
    return getDefinition().getOptimizationInfo();
  }

  public DexType getArgumentType(int index) {
    return getDefinition().getArgumentType(index);
  }

  public DexType getParameter(int index) {
    return getReference().getParameter(index);
  }

  public DexTypeList getParameters() {
    return getReference().getParameters();
  }

  public DexAnnotationSet getParameterAnnotation(int index) {
    return getParameterAnnotations().get(index);
  }

  public final ParameterAnnotationsList getParameterAnnotations() {
    return getDefinition().getParameterAnnotations();
  }

  public DexProto getProto() {
    return getReference().getProto();
  }

  public DexType getReturnType() {
    return getReference().getReturnType();
  }

  @Override
  public boolean isMethod() {
    return true;
  }

  @Override
  public DexClassAndMethod asMember() {
    return this;
  }

  @Override
  public DexClassAndMethod asMethod() {
    return this;
  }

  @Override
  public DexClassAndMethod getTarget() {
    return this;
  }
}
