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

import com.android.tools.r8.TestBase;
import com.android.tools.r8.graph.ClassAccessFlags;
import com.android.tools.r8.graph.DexAnnotationSet;
import com.android.tools.r8.graph.DexEncodedField;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexTypeList;
import com.android.tools.r8.graph.GenericSignature.ClassSignature;
import com.android.tools.r8.graph.GenericSignature.MethodTypeSignature;
import com.android.tools.r8.graph.MethodAccessFlags;
import com.android.tools.r8.graph.ParameterAnnotationsList;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.ir.conversion.CallGraph.Node;
import com.android.tools.r8.origin.SynthesizedOrigin;
import java.util.Collections;

class CallGraphTestBase extends TestBase {

  private DexItemFactory dexItemFactory = new DexItemFactory();
  private DexProgramClass clazz =
      new DexProgramClass(
          dexItemFactory.createType("LCallGraphTest;"),
          null,
          new SynthesizedOrigin("test", CallGraphTestBase.class),
          ClassAccessFlags.fromSharedAccessFlags(0),
          dexItemFactory.objectType,
          DexTypeList.empty(),
          null,
          null,
          Collections.emptyList(),
          null,
          Collections.emptyList(),
          ClassSignature.noSignature(),
          DexAnnotationSet.empty(),
          DexEncodedField.EMPTY_ARRAY,
          DexEncodedField.EMPTY_ARRAY,
          DexEncodedMethod.EMPTY_ARRAY,
          DexEncodedMethod.EMPTY_ARRAY,
          false,
          DexProgramClass::invalidChecksumRequest);

  Node createNode(String methodName) {
    DexMethod signature =
        dexItemFactory.createMethod(
            clazz.type, dexItemFactory.createProto(dexItemFactory.voidType), methodName);
    ProgramMethod method =
        new ProgramMethod(
            clazz,
            new DexEncodedMethod(
                signature,
                MethodAccessFlags.fromDexAccessFlags(0),
                MethodTypeSignature.noSignature(),
                DexAnnotationSet.empty(),
                ParameterAnnotationsList.empty(),
                null));
    return new Node(method);
  }

  Node createForceInlinedNode(String methodName) {
    Node node = createNode(methodName);
    node.getMethod().getMutableOptimizationInfo().markForceInline();
    return node;
  }
}
