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

import com.android.tools.r8.graph.AppInfo;
import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.synthesis.SyntheticItems.GlobalSyntheticsStrategy;

public interface IRCodeProvider {

  IRCode buildIR(ProgramMethod method);

  void setGraphLens(GraphLens graphLens);

  static IRCodeProvider create(AppView<? extends AppInfoWithClassHierarchy> appView) {
    return new IRCodeProviderImpl(appView);
  }

  static IRCodeProvider createThrowing() {
    return new IRCodeProvider() {
      @Override
      public IRCode buildIR(ProgramMethod method) {
        throw new UnsupportedOperationException("Should never build IR for methods in D8");
      }

      @Override
      public void setGraphLens(GraphLens graphLens) {}
    };
  }

  class IRCodeProviderImpl implements IRCodeProvider {

    private final AppView<AppInfo> appViewForConversion;

    private IRCodeProviderImpl(AppView<? extends AppInfoWithClassHierarchy> appView) {
      // At this point the code rewritings described by repackaging and synthetic finalization have
      // not been applied to the code objects. These code rewritings will be applied in the
      // application writer. We therefore simulate that we are in D8, to allow building IR for each
      // of the class initializers without applying the unapplied code rewritings, to avoid that we
      // apply the lens more than once to the same piece of code.
      AppView<AppInfo> appViewForConversion =
          AppView.createForSimulatingD8InR8(
              AppInfo.createInitialAppInfo(
                  appView.appInfo().app(), GlobalSyntheticsStrategy.forNonSynthesizing()));
      appViewForConversion.setGraphLens(appView.graphLens());
      appViewForConversion.setCodeLens(appView.codeLens());
      this.appViewForConversion = appViewForConversion;
    }

    @Override
    public IRCode buildIR(ProgramMethod method) {
      return method
          .getDefinition()
          .getCode()
          .buildIR(method, appViewForConversion, method.getOrigin());
    }

    @Override
    public void setGraphLens(GraphLens graphLens) {
      appViewForConversion.setGraphLens(graphLens);
    }
  }
}
