|  | // 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.google.common.base.Equivalence; | 
|  | import com.google.common.collect.Iterables; | 
|  | import java.util.Objects; | 
|  |  | 
|  | public class IfRuleClassPartEquivalence extends Equivalence<ProguardIfRule> { | 
|  |  | 
|  | @Override | 
|  | protected boolean doEquivalent(ProguardIfRule p1, ProguardIfRule p2) { | 
|  | if (!p1.getClassAnnotations().equals(p2.getClassAnnotations())) { | 
|  | return false; | 
|  | } | 
|  | if (!p1.getClassAccessFlags().equals(p2.getClassAccessFlags()) | 
|  | || !p1.getNegatedClassAccessFlags().equals(p2.getNegatedClassAccessFlags())) { | 
|  | return false; | 
|  | } | 
|  | if (p1.getClassType() != p2.getClassType() | 
|  | || p1.getClassTypeNegated() != p2.getClassTypeNegated()) { | 
|  | return false; | 
|  | } | 
|  | if (p1.getInheritanceIsExtends() != p2.getInheritanceIsExtends()) { | 
|  | return false; | 
|  | } | 
|  | if (!p1.getInheritanceAnnotations().equals(p2.getInheritanceAnnotations())) { | 
|  | return false; | 
|  | } | 
|  | if (!Objects.equals(p1.getInheritanceClassName(), p2.getInheritanceClassName())) { | 
|  | return false; | 
|  | } | 
|  | if (!p1.getClassNames().equals(p2.getClassNames())) { | 
|  | return false; | 
|  | } | 
|  | return true; | 
|  | } | 
|  |  | 
|  | @Override | 
|  | protected int doHash(ProguardIfRule rule) { | 
|  | int result = rule.getClassAnnotations().hashCode(); | 
|  | result = 3 * result + rule.getClassAccessFlags().hashCode(); | 
|  | result = 3 * result + rule.getNegatedClassAccessFlags().hashCode(); | 
|  | result = 3 * result + (rule.getClassTypeNegated() ? 1 : 0); | 
|  | result = 3 * result + (rule.getClassType() != null ? rule.getClassType().hashCode() : 0); | 
|  | result = 3 * result + rule.getClassNames().hashCode(); | 
|  | result = 3 * result + rule.getInheritanceAnnotations().hashCode(); | 
|  | result = | 
|  | 3 * result | 
|  | + (rule.getInheritanceClassName() != null | 
|  | ? rule.getInheritanceClassName().hashCode() | 
|  | : 0); | 
|  | result = 3 * result + (rule.getInheritanceIsImplements() ? 1 : 0); | 
|  | result = 3 * result + Iterables.size(rule.subsequentRule.getWildcards()); | 
|  | return result; | 
|  | } | 
|  | } |