// 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.ir.optimize.lambda;

import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
import com.android.tools.r8.graph.AppView;
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.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.DexTypeList;
import com.android.tools.r8.graph.EnclosingMethodAttribute;
import com.android.tools.r8.graph.InnerClassAttribute;
import com.android.tools.r8.ir.optimize.info.OptimizationFeedback;
import com.android.tools.r8.origin.SynthesizedOrigin;
import java.util.Collections;
import java.util.List;

// Encapsulates lambda group class building logic and separates
// it from the rest of lambda group functionality.
public abstract class LambdaGroupClassBuilder<T extends LambdaGroup> {
  protected final T group;
  protected final DexItemFactory factory;
  protected final String origin;

  protected LambdaGroupClassBuilder(T group, DexItemFactory factory, String origin) {
    this.group = group;
    this.factory = factory;
    this.origin = origin;
  }

  public final DexProgramClass synthesizeClass(
      AppView<? extends AppInfoWithClassHierarchy> appView, OptimizationFeedback feedback) {
    DexType groupClassType = group.getGroupClassType();
    DexType superClassType = getSuperClassType();
    return new DexProgramClass(
        groupClassType,
        null,
        new SynthesizedOrigin(origin, getClass()),
        buildAccessFlags(),
        superClassType,
        buildInterfaces(),
        factory.createString(origin),
        null,
        Collections.emptyList(),
        buildEnclosingMethodAttribute(),
        buildInnerClasses(),
        buildAnnotations(),
        buildStaticFields(appView, feedback),
        buildInstanceFields(),
        buildDirectMethods(),
        buildVirtualMethods(),
        factory.getSkipNameValidationForTesting(),
        // The name of the class is based on the hash of the content.
        DexProgramClass::checksumFromType);
  }

  protected abstract DexType getSuperClassType();

  protected abstract ClassAccessFlags buildAccessFlags();

  protected abstract EnclosingMethodAttribute buildEnclosingMethodAttribute();

  protected abstract List<InnerClassAttribute> buildInnerClasses();

  protected abstract DexAnnotationSet buildAnnotations();

  protected abstract DexEncodedMethod[] buildVirtualMethods();

  protected abstract DexEncodedMethod[] buildDirectMethods();

  protected abstract DexEncodedField[] buildInstanceFields();

  protected abstract DexEncodedField[] buildStaticFields(
      AppView<? extends AppInfoWithClassHierarchy> appView, OptimizationFeedback feedback);

  protected abstract DexTypeList buildInterfaces();
}
