// 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.utils.codeinspector;

import com.android.tools.r8.code.CheckCast;
import com.android.tools.r8.code.Const4;
import com.android.tools.r8.code.ConstString;
import com.android.tools.r8.code.ConstStringJumbo;
import com.android.tools.r8.code.Goto;
import com.android.tools.r8.code.IfEq;
import com.android.tools.r8.code.IfEqz;
import com.android.tools.r8.code.IfGe;
import com.android.tools.r8.code.IfGez;
import com.android.tools.r8.code.IfGt;
import com.android.tools.r8.code.IfGtz;
import com.android.tools.r8.code.IfLe;
import com.android.tools.r8.code.IfLez;
import com.android.tools.r8.code.IfLt;
import com.android.tools.r8.code.IfLtz;
import com.android.tools.r8.code.IfNe;
import com.android.tools.r8.code.IfNez;
import com.android.tools.r8.code.Iget;
import com.android.tools.r8.code.IgetBoolean;
import com.android.tools.r8.code.IgetByte;
import com.android.tools.r8.code.IgetChar;
import com.android.tools.r8.code.IgetObject;
import com.android.tools.r8.code.IgetShort;
import com.android.tools.r8.code.IgetWide;
import com.android.tools.r8.code.Instruction;
import com.android.tools.r8.code.InvokeDirect;
import com.android.tools.r8.code.InvokeDirectRange;
import com.android.tools.r8.code.InvokeInterface;
import com.android.tools.r8.code.InvokeInterfaceRange;
import com.android.tools.r8.code.InvokeStatic;
import com.android.tools.r8.code.InvokeStaticRange;
import com.android.tools.r8.code.InvokeSuper;
import com.android.tools.r8.code.InvokeSuperRange;
import com.android.tools.r8.code.InvokeVirtual;
import com.android.tools.r8.code.InvokeVirtualRange;
import com.android.tools.r8.code.Iput;
import com.android.tools.r8.code.IputBoolean;
import com.android.tools.r8.code.IputByte;
import com.android.tools.r8.code.IputChar;
import com.android.tools.r8.code.IputObject;
import com.android.tools.r8.code.IputShort;
import com.android.tools.r8.code.IputWide;
import com.android.tools.r8.code.NewInstance;
import com.android.tools.r8.code.Nop;
import com.android.tools.r8.code.PackedSwitch;
import com.android.tools.r8.code.ReturnObject;
import com.android.tools.r8.code.ReturnVoid;
import com.android.tools.r8.code.Sget;
import com.android.tools.r8.code.SgetBoolean;
import com.android.tools.r8.code.SgetByte;
import com.android.tools.r8.code.SgetChar;
import com.android.tools.r8.code.SgetObject;
import com.android.tools.r8.code.SgetShort;
import com.android.tools.r8.code.SgetWide;
import com.android.tools.r8.code.SparseSwitch;
import com.android.tools.r8.code.Sput;
import com.android.tools.r8.code.SputBoolean;
import com.android.tools.r8.code.SputByte;
import com.android.tools.r8.code.SputChar;
import com.android.tools.r8.code.SputObject;
import com.android.tools.r8.code.SputShort;
import com.android.tools.r8.code.SputWide;
import com.android.tools.r8.code.Throw;

public class DexInstructionSubject implements InstructionSubject {
  protected final Instruction instruction;

  public DexInstructionSubject(Instruction instruction) {
    this.instruction = instruction;
  }

  @Override
  public boolean isFieldAccess() {
    return isInstanceGet() || isInstancePut() || isStaticGet() || isStaticPut();
  }

  @Override
  public boolean isInvokeVirtual() {
    return instruction instanceof InvokeVirtual || instruction instanceof InvokeVirtualRange;
  }

  @Override
  public boolean isInvokeInterface() {
    return instruction instanceof InvokeInterface || instruction instanceof InvokeInterfaceRange;
  }

  @Override
  public boolean isInvokeStatic() {
    return instruction instanceof InvokeStatic || instruction instanceof InvokeStaticRange;
  }

  @Override
  public boolean isNop() {
    return instruction instanceof Nop;
  }

  @Override
  public boolean isConstString(JumboStringMode jumboStringMode) {
    return instruction instanceof ConstString
        || (jumboStringMode == JumboStringMode.ALLOW && instruction instanceof ConstStringJumbo);
  }

  @Override
  public boolean isConstString(String value, JumboStringMode jumboStringMode) {
    return (instruction instanceof ConstString
            && ((ConstString) instruction).BBBB.toSourceString().equals(value))
        || (jumboStringMode == JumboStringMode.ALLOW
            && instruction instanceof ConstStringJumbo
            && ((ConstStringJumbo) instruction).BBBBBBBB.toSourceString().equals(value));
  }

  @Override
  public boolean isGoto() {

    return instruction instanceof Goto;
  }

  @Override
  public boolean isIfNez() {
    return instruction instanceof IfNez;
  }

  @Override
  public boolean isIfEqz() {
    return instruction instanceof IfEqz;
  }

  @Override
  public boolean isReturnVoid() {
    return instruction instanceof ReturnVoid;
  }

  @Override
  public boolean isReturnObject() {
    return instruction instanceof ReturnObject;
  }

  @Override
  public boolean isThrow() {
    return instruction instanceof Throw;
  }

  @Override
  public boolean isInvoke() {
    return isInvokeVirtual()
        || isInvokeInterface()
        || isInvokeDirect()
        || isInvokeSuper()
        || isInvokeStatic();
  }

  @Override
  public boolean isNewInstance() {
    return instruction instanceof NewInstance;
  }

  @Override
  public boolean isCheckCast() {
    return instruction instanceof CheckCast;
  }

  @Override
  public boolean isCheckCast(String type) {
    return isCheckCast() && ((CheckCast) instruction).getType().toString().equals(type);
  }

  public boolean isInvokeSuper() {
    return instruction instanceof InvokeSuper || instruction instanceof InvokeSuperRange;
  }

  public boolean isInvokeDirect() {
    return instruction instanceof InvokeDirect || instruction instanceof InvokeDirectRange;
  }

  public boolean isConst4() {
    return instruction instanceof Const4;
  }

  @Override
  public boolean isInstanceGet() {
    return instruction instanceof Iget
        || instruction instanceof IgetBoolean
        || instruction instanceof IgetByte
        || instruction instanceof IgetShort
        || instruction instanceof IgetChar
        || instruction instanceof IgetWide
        || instruction instanceof IgetObject;
  }

  @Override
  public boolean isInstancePut() {
    return instruction instanceof Iput
        || instruction instanceof IputBoolean
        || instruction instanceof IputByte
        || instruction instanceof IputShort
        || instruction instanceof IputChar
        || instruction instanceof IputWide
        || instruction instanceof IputObject;
  }

  @Override
  public boolean isStaticGet() {
    return instruction instanceof Sget
        || instruction instanceof SgetBoolean
        || instruction instanceof SgetByte
        || instruction instanceof SgetShort
        || instruction instanceof SgetChar
        || instruction instanceof SgetWide
        || instruction instanceof SgetObject;
  }

  @Override
  public boolean isStaticPut() {
    return instruction instanceof Sput
        || instruction instanceof SputBoolean
        || instruction instanceof SputByte
        || instruction instanceof SputShort
        || instruction instanceof SputChar
        || instruction instanceof SputWide
        || instruction instanceof SputObject;
  }

  @Override
  public boolean isIf() {
    return instruction instanceof IfEq
        || instruction instanceof IfEqz
        || instruction instanceof IfGe
        || instruction instanceof IfGez
        || instruction instanceof IfGt
        || instruction instanceof IfGtz
        || instruction instanceof IfLe
        || instruction instanceof IfLez
        || instruction instanceof IfLt
        || instruction instanceof IfLtz
        || instruction instanceof IfNe
        || instruction instanceof IfNez;
  }

  @Override
  public boolean isPackedSwitch() {
    return instruction instanceof PackedSwitch;
  }

  @Override
  public boolean isSparseSwitch() {
    return instruction instanceof SparseSwitch;
  }
}
