// 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.DexClass;
import com.android.tools.r8.graph.DexReference;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens.NonIdentityGraphLens;
import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
import java.util.function.Function;

/**
 * Base type for a reference to a synthetic item.
 *
 * <p>This class is internal to the synthetic items collection, thus package-protected.
 */
abstract class SyntheticReference<
    R extends SyntheticReference<R, D, C>,
    D extends SyntheticDefinition<R, D, C>,
    C extends DexClass> {

  private final SyntheticKind kind;
  private final SynthesizingContext rewrittenContext;

  SyntheticReference(SyntheticKind kind, SynthesizingContext context) {
    assert kind != null;
    assert context != null;
    this.kind = kind;
    this.rewrittenContext = context;
  }

  abstract D lookupDefinition(Function<DexType, DexClass> definitions);

  final SyntheticKind getKind() {
    return kind;
  }

  final SynthesizingContext getContext() {
    return rewrittenContext;
  }

  abstract DexType getHolder();

  abstract DexReference getReference();

  public final R rewrite(NonIdentityGraphLens lens) {
    SynthesizingContext rewrittenContext = getContext().rewrite(lens);
    return internalRewrite(rewrittenContext, lens);
  }

  abstract R internalRewrite(SynthesizingContext rewrittenContext, NonIdentityGraphLens lens);
}
