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

import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.ir.code.Instruction;
import com.android.tools.r8.ir.code.InstructionListIterator;
import com.android.tools.r8.ir.code.InvokeMethod;
import com.android.tools.r8.utils.StringDiagnostic;

public class DesugaredLibraryAPIConverter {

  AppView<?> appView;

  public DesugaredLibraryAPIConverter(AppView<?> appView) {
    this.appView = appView;
  }

  public void desugar(IRCode code) {
    InstructionListIterator iterator = code.instructionListIterator();
    while (iterator.hasNext()) {
      Instruction instruction = iterator.next();
      if (!instruction.isInvokeMethod()) {
        continue;
      }
      InvokeMethod invokeMethod = instruction.asInvokeMethod();
      DexMethod invokedMethod = invokeMethod.getInvokedMethod();
      if (appView.rewritePrefix.hasRewrittenType(invokedMethod.holder)) {
        continue;
      }
      // In this case, the method has not been rewritten and is not on a rewritten class.
      // This invoke will (likely) not work at runtime if a desugared type is present.
      if (appView.rewritePrefix.hasRewrittenType(invokedMethod.proto.returnType)) {
        warnInvalidInvoke(invokedMethod.proto.returnType, invokedMethod, "return");
      }
      for (DexType argType : invokedMethod.proto.parameters.values) {
        if (appView.rewritePrefix.hasRewrittenType(argType)) {
          warnInvalidInvoke(argType, invokedMethod, "parameter");
        }
      }
    }
  }

  private void warnInvalidInvoke(DexType type, DexMethod invokedMethod, String debugString) {
    appView
        .options()
        .reporter
        .warning(
            new StringDiagnostic(
                "Invoke to "
                    + invokedMethod.holder
                    + "#"
                    + invokedMethod.name
                    + " may not work correctly at runtime ("
                    + debugString
                    + " type "
                    + appView.rewritePrefix.rewrittenType(type)
                    + " is a desugared type)."));
  }
}
