| // Copyright (c) 2022, 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.optimize.interfaces.collection; |
| |
| import com.android.tools.r8.graph.DexClass; |
| import com.android.tools.r8.graph.DexType; |
| import com.android.tools.r8.graph.GraphLens; |
| import com.android.tools.r8.graph.PrunedItems; |
| import com.android.tools.r8.utils.SetUtils; |
| import java.util.Set; |
| |
| public class NonEmptyOpenClosedInterfacesCollection extends OpenClosedInterfacesCollection { |
| |
| private final Set<DexType> openInterfaceTypes; |
| |
| public NonEmptyOpenClosedInterfacesCollection(Set<DexType> openInterfaceTypes) { |
| this.openInterfaceTypes = openInterfaceTypes; |
| } |
| |
| @Override |
| public boolean isDefinitelyClosed(DexClass clazz) { |
| assert clazz.isInterface(); |
| return !openInterfaceTypes.contains(clazz.getType()); |
| } |
| |
| @Override |
| public OpenClosedInterfacesCollection rewrittenWithLens(GraphLens graphLens) { |
| Set<DexType> rewrittenOpenInterfaceTypes = |
| SetUtils.newIdentityHashSet(openInterfaceTypes.size()); |
| for (DexType openInterfaceType : openInterfaceTypes) { |
| rewrittenOpenInterfaceTypes.add(graphLens.lookupType(openInterfaceType)); |
| } |
| return new NonEmptyOpenClosedInterfacesCollection(rewrittenOpenInterfaceTypes); |
| } |
| |
| @Override |
| public OpenClosedInterfacesCollection withoutPrunedItems(PrunedItems prunedItems) { |
| if (!prunedItems.hasRemovedClasses()) { |
| return this; |
| } |
| Set<DexType> prunedOpenInterfaceTypes = SetUtils.newIdentityHashSet(openInterfaceTypes.size()); |
| for (DexType openInterfaceType : openInterfaceTypes) { |
| if (!prunedItems.isRemoved(openInterfaceType)) { |
| prunedOpenInterfaceTypes.add(openInterfaceType); |
| } |
| } |
| return new NonEmptyOpenClosedInterfacesCollection(prunedOpenInterfaceTypes); |
| } |
| } |