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

import com.android.tools.r8.graph.ClassResolutionResult;
import com.android.tools.r8.graph.DexApplication;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.synthesis.SyntheticItems.GlobalSyntheticsStrategy;
import com.android.tools.r8.synthesis.SyntheticItems.State;
import com.google.common.collect.ImmutableList;
import java.util.Collection;
import java.util.function.Function;

/**
 * Represents an application with a fully "committed" addition of synthetic items.
 *
 * <p>The committed application is used to rebuild application info (see AppInfo and its
 * derivatives) with the associated additional information for the program at well defined points on
 * the main thread.
 *
 * <p>A committed application will have no pending synthetics that are not defined in the program
 * classes collection, and it must also satisfy that all synthetic types are indeed contained in the
 * applications program class collection.
 */
public class CommittedItems implements SyntheticDefinitionsProvider {

  // Immutable package accessible fields to allow SyntheticItems creation.
  final DexApplication application;
  final SyntheticItems.State state;
  final CommittedSyntheticsCollection committed;
  final ImmutableList<DexType> committedProgramTypes;
  final GlobalSyntheticsStrategy globalSyntheticsStrategy;

  CommittedItems(
      State state,
      DexApplication application,
      CommittedSyntheticsCollection committed,
      ImmutableList<DexType> committedProgramTypes,
      GlobalSyntheticsStrategy globalSyntheticsStrategy) {
    this.state = state;
    this.application = application;
    this.committed = committed;
    this.committedProgramTypes = committedProgramTypes;
    this.globalSyntheticsStrategy = globalSyntheticsStrategy;
    assert committed.verifyTypesAreInApp(application);
  }

  // Conversion to a mutable synthetic items collection. Should only be used in AppInfo creation.
  public SyntheticItems toSyntheticItems() {
    return new SyntheticItems(this);
  }

  public DexApplication getApplication() {
    return application;
  }

  public Collection<DexType> getCommittedProgramTypes() {
    return committedProgramTypes;
  }

  @Override
  public ClassResolutionResult definitionFor(
      DexType type, Function<DexType, ClassResolutionResult> baseDefinitionFor) {
    // All synthetic types are committed to the application so lookup is just the base lookup.
    return baseDefinitionFor.apply(type);
  }
}
