| // Copyright (c) 2017, 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.DexMethod; |
| import com.android.tools.r8.utils.MethodSignatureEquivalence; |
| import com.google.common.base.Equivalence; |
| import com.google.common.base.Equivalence.Wrapper; |
| import java.util.HashSet; |
| import java.util.Set; |
| |
| class ScopedDexMethodSet { |
| |
| private static final Equivalence<DexMethod> METHOD_EQUIVALENCE = MethodSignatureEquivalence.get(); |
| |
| private final ScopedDexMethodSet parent; |
| private final Set<Wrapper<DexMethod>> items = new HashSet<>(); |
| |
| public ScopedDexMethodSet() { |
| this(null); |
| } |
| |
| private ScopedDexMethodSet(ScopedDexMethodSet parent) { |
| this.parent = parent; |
| } |
| |
| public ScopedDexMethodSet newNestedScope() { |
| return new ScopedDexMethodSet(this); |
| } |
| |
| private boolean contains(Wrapper<DexMethod> item) { |
| return items.contains(item) |
| || ((parent != null) && parent.contains(item)); |
| } |
| |
| public boolean addMethod(DexMethod method) { |
| Wrapper<DexMethod> wrapped = METHOD_EQUIVALENCE.wrap(method); |
| return !contains(wrapped) && items.add(wrapped); |
| } |
| |
| public ScopedDexMethodSet getParent() { |
| return parent; |
| } |
| } |