// Copyright (c) 2019, 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.ir.desugar.backports;

import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.ir.code.InstructionListIterator;
import com.android.tools.r8.ir.code.InvokeMethod;
import com.android.tools.r8.ir.code.InvokeVirtual;

public final class OptionalMethodRewrites {

  private OptionalMethodRewrites() {}

  public static void rewriteOrElseGet(
      InvokeMethod invoke, InstructionListIterator iterator, DexItemFactory factory) {
    InvokeVirtual getInvoke = new InvokeVirtual(
        factory.createMethod(factory.optionalType, invoke.getInvokedMethod().proto,
            "get"), invoke.outValue(), invoke.inValues());
    iterator.replaceCurrentInstruction(getInvoke);
  }

  public static void rewriteDoubleOrElseGet(
      InvokeMethod invoke, InstructionListIterator iterator, DexItemFactory factory) {
    InvokeVirtual getInvoke = new InvokeVirtual(
        factory.createMethod(factory.optionalDoubleType, invoke.getInvokedMethod().proto,
            "getAsDouble"), invoke.outValue(), invoke.inValues());
    iterator.replaceCurrentInstruction(getInvoke);
  }

  public static void rewriteIntOrElseGet(
      InvokeMethod invoke, InstructionListIterator iterator, DexItemFactory factory) {
    InvokeVirtual getInvoke = new InvokeVirtual(
        factory.createMethod(factory.optionalIntType, invoke.getInvokedMethod().proto,
            "getAsInt"), invoke.outValue(), invoke.inValues());
    iterator.replaceCurrentInstruction(getInvoke);
  }

  public static void rewriteLongOrElseGet(
      InvokeMethod invoke, InstructionListIterator iterator, DexItemFactory factory) {
    InvokeVirtual getInvoke = new InvokeVirtual(
        factory.createMethod(factory.optionalLongType, invoke.getInvokedMethod().proto,
            "getAsLong"), invoke.outValue(), invoke.inValues());
    iterator.replaceCurrentInstruction(getInvoke);
  }
}
