|  | // 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.lens.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); | 
|  | } |