| // 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.shaking; |
| |
| 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.ProgramMethod; |
| import com.android.tools.r8.graph.analysis.EnqueuerCheckCastAnalysis; |
| import com.android.tools.r8.graph.analysis.EnqueuerInstanceOfAnalysis; |
| import com.google.common.collect.Sets; |
| import java.util.Set; |
| |
| public class ClassMergingEnqueuerExtension |
| implements EnqueuerInstanceOfAnalysis, EnqueuerCheckCastAnalysis { |
| |
| private final Set<DexType> instanceOfTypes = Sets.newIdentityHashSet(); |
| private final Set<DexType> checkCastTypes = Sets.newIdentityHashSet(); |
| private final DexItemFactory factory; |
| |
| public ClassMergingEnqueuerExtension(DexItemFactory factory) { |
| this.factory = factory; |
| } |
| |
| @Override |
| public void traceCheckCast(DexType type, ProgramMethod context) { |
| checkCastTypes.add(type.toBaseType(factory)); |
| } |
| |
| @Override |
| public void traceInstanceOf(DexType type, ProgramMethod context) { |
| instanceOfTypes.add(type.toBaseType(factory)); |
| } |
| |
| public boolean isCheckCastType(DexProgramClass clazz) { |
| return checkCastTypes.contains(clazz.type); |
| } |
| |
| public boolean isInstanceOfType(DexProgramClass clazz) { |
| return instanceOfTypes.contains(clazz.type); |
| } |
| |
| public void attach(Enqueuer enqueuer) { |
| enqueuer.registerInstanceOfAnalysis(this).registerCheckCastAnalysis(this); |
| } |
| } |