|  | // 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.shaking; | 
|  |  | 
|  | import com.android.tools.r8.graph.AppView; | 
|  | import com.android.tools.r8.graph.DexCallSite; | 
|  | import com.android.tools.r8.graph.DexEncodedMethod; | 
|  | import com.android.tools.r8.graph.DexField; | 
|  | import com.android.tools.r8.graph.DexMethod; | 
|  | import com.android.tools.r8.graph.DexMethodHandle; | 
|  | import com.android.tools.r8.graph.DexProgramClass; | 
|  | import com.android.tools.r8.graph.DexType; | 
|  | import com.android.tools.r8.graph.ProgramMethod; | 
|  | import com.android.tools.r8.graph.UseRegistry; | 
|  |  | 
|  | public class DefaultEnqueuerUseRegistry extends UseRegistry { | 
|  |  | 
|  | private final ProgramMethod context; | 
|  | protected final Enqueuer enqueuer; | 
|  |  | 
|  | public DefaultEnqueuerUseRegistry( | 
|  | AppView<?> appView, DexProgramClass holder, DexEncodedMethod method, Enqueuer enqueuer) { | 
|  | super(appView.dexItemFactory()); | 
|  | this.context = new ProgramMethod(holder, method); | 
|  | this.enqueuer = enqueuer; | 
|  | } | 
|  |  | 
|  | public ProgramMethod getContext() { | 
|  | return context; | 
|  | } | 
|  |  | 
|  | public DexProgramClass getContextHolder() { | 
|  | return context.getHolder(); | 
|  | } | 
|  |  | 
|  | public DexEncodedMethod getContextMethod() { | 
|  | return context.getMethod(); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public boolean registerInitClass(DexType clazz) { | 
|  | return enqueuer.traceInitClass(clazz, context); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public boolean registerInvokeVirtual(DexMethod invokedMethod) { | 
|  | return enqueuer.traceInvokeVirtual(invokedMethod, context); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public boolean registerInvokeDirect(DexMethod invokedMethod) { | 
|  | return enqueuer.traceInvokeDirect(invokedMethod, context); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public boolean registerInvokeStatic(DexMethod invokedMethod) { | 
|  | return enqueuer.traceInvokeStatic(invokedMethod, context); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public boolean registerInvokeInterface(DexMethod invokedMethod) { | 
|  | return enqueuer.traceInvokeInterface(invokedMethod, context); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public boolean registerInvokeSuper(DexMethod invokedMethod) { | 
|  | return enqueuer.traceInvokeSuper(invokedMethod, context); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public boolean registerInstanceFieldRead(DexField field) { | 
|  | return enqueuer.traceInstanceFieldRead(field, context.getMethod()); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public boolean registerInstanceFieldReadFromMethodHandle(DexField field) { | 
|  | return enqueuer.traceInstanceFieldReadFromMethodHandle(field, context.getMethod()); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public boolean registerInstanceFieldWrite(DexField field) { | 
|  | return enqueuer.traceInstanceFieldWrite(field, context.getMethod()); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public boolean registerInstanceFieldWriteFromMethodHandle(DexField field) { | 
|  | return enqueuer.traceInstanceFieldWriteFromMethodHandle(field, context.getMethod()); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public boolean registerNewInstance(DexType type) { | 
|  | return enqueuer.traceNewInstance(type, context); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public boolean registerStaticFieldRead(DexField field) { | 
|  | return enqueuer.traceStaticFieldRead(field, context.getMethod()); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public boolean registerStaticFieldReadFromMethodHandle(DexField field) { | 
|  | return enqueuer.traceStaticFieldReadFromMethodHandle(field, context.getMethod()); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public boolean registerStaticFieldWrite(DexField field) { | 
|  | return enqueuer.traceStaticFieldWrite(field, context.getMethod()); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public boolean registerStaticFieldWriteFromMethodHandle(DexField field) { | 
|  | return enqueuer.traceStaticFieldWriteFromMethodHandle(field, context.getMethod()); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public boolean registerConstClass(DexType type) { | 
|  | return enqueuer.traceConstClass(type, context.getMethod()); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public boolean registerCheckCast(DexType type) { | 
|  | return enqueuer.traceCheckCast(type, context.getMethod()); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public boolean registerTypeReference(DexType type) { | 
|  | return enqueuer.traceTypeReference(type, context.getMethod()); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public void registerMethodHandle(DexMethodHandle methodHandle, MethodHandleUse use) { | 
|  | super.registerMethodHandle(methodHandle, use); | 
|  | enqueuer.traceMethodHandle(methodHandle, use, context.getMethod()); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public void registerCallSite(DexCallSite callSite) { | 
|  | super.registerCallSite(callSite); | 
|  | enqueuer.traceCallSite(callSite, context); | 
|  | } | 
|  | } |