| // Copyright (c) 2016, 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; | 
 |  | 
 | public class ProguardKeepRuleModifiers { | 
 |   public static class Builder { | 
 |  | 
 |     private boolean allowsAccessModification = false; | 
 |     private boolean allowsShrinking = false; | 
 |     private boolean allowsOptimization = false; | 
 |     private boolean allowsObfuscation = false; | 
 |     private boolean includeDescriptorClasses = false; | 
 |  | 
 |     private Builder() {} | 
 |  | 
 |     public Builder setAllowsAccessModification(boolean allowsAccessModification) { | 
 |       this.allowsAccessModification = allowsAccessModification; | 
 |       return this; | 
 |     } | 
 |  | 
 |     public void setAllowsShrinking(boolean allowsShrinking) { | 
 |       this.allowsShrinking = allowsShrinking; | 
 |     } | 
 |  | 
 |     public void setAllowsOptimization(boolean allowsOptimization) { | 
 |       this.allowsOptimization = allowsOptimization; | 
 |     } | 
 |  | 
 |     public Builder setAllowsObfuscation(boolean allowsObfuscation) { | 
 |       this.allowsObfuscation = allowsObfuscation; | 
 |       return this; | 
 |     } | 
 |  | 
 |     public void setIncludeDescriptorClasses(boolean includeDescriptorClasses) { | 
 |       this.includeDescriptorClasses = includeDescriptorClasses; | 
 |     } | 
 |  | 
 |     ProguardKeepRuleModifiers build() { | 
 |       return new ProguardKeepRuleModifiers( | 
 |           allowsAccessModification, | 
 |           allowsShrinking, | 
 |           allowsOptimization, | 
 |           allowsObfuscation, | 
 |           includeDescriptorClasses); | 
 |     } | 
 |   } | 
 |  | 
 |   public final boolean allowsAccessModification; | 
 |   public final boolean allowsShrinking; | 
 |   public final boolean allowsOptimization; | 
 |   public final boolean allowsObfuscation; | 
 |   public final boolean includeDescriptorClasses; | 
 |  | 
 |   private ProguardKeepRuleModifiers( | 
 |       boolean allowsAccessModification, | 
 |       boolean allowsShrinking, | 
 |       boolean allowsOptimization, | 
 |       boolean allowsObfuscation, | 
 |       boolean includeDescriptorClasses) { | 
 |     this.allowsAccessModification = allowsAccessModification; | 
 |     this.allowsShrinking = allowsShrinking; | 
 |     this.allowsOptimization = allowsOptimization; | 
 |     this.allowsObfuscation = allowsObfuscation; | 
 |     this.includeDescriptorClasses = includeDescriptorClasses; | 
 |   } | 
 |  | 
 |   /** | 
 |    * Create a new empty builder. | 
 |    */ | 
 |   public static Builder builder() { | 
 |     return new Builder(); | 
 |   } | 
 |  | 
 |   @Override | 
 |   public boolean equals(Object o) { | 
 |     if (!(o instanceof ProguardKeepRuleModifiers)) { | 
 |       return false; | 
 |     } | 
 |     ProguardKeepRuleModifiers that = (ProguardKeepRuleModifiers) o; | 
 |     return allowsAccessModification == that.allowsAccessModification | 
 |         && allowsShrinking == that.allowsShrinking | 
 |         && allowsOptimization == that.allowsOptimization | 
 |         && allowsObfuscation == that.allowsObfuscation | 
 |         && includeDescriptorClasses == that.includeDescriptorClasses; | 
 |   } | 
 |  | 
 |   @Override | 
 |   public int hashCode() { | 
 |     return (allowsAccessModification ? 1 : 0) | 
 |         | (allowsShrinking ? 2 : 0) | 
 |         | (allowsOptimization ? 4 : 0) | 
 |         | (allowsObfuscation ? 8 : 0) | 
 |         | (includeDescriptorClasses ? 16 : 0); | 
 |   } | 
 |  | 
 |   @Override | 
 |   public String toString() { | 
 |     StringBuilder builder = new StringBuilder(); | 
 |     appendWithComma(builder, allowsAccessModification, "allowaccessmodification"); | 
 |     appendWithComma(builder, allowsObfuscation, "allowobfuscation"); | 
 |     appendWithComma(builder, allowsShrinking, "allowshrinking"); | 
 |     appendWithComma(builder, allowsOptimization, "allowoptimization"); | 
 |     appendWithComma(builder, includeDescriptorClasses, "includedescriptorclasses"); | 
 |     return builder.toString(); | 
 |   } | 
 |  | 
 |   private void appendWithComma(StringBuilder builder, boolean predicate, String text) { | 
 |     if (!predicate) { | 
 |       return; | 
 |     } | 
 |     if (builder.length() != 0) { | 
 |       builder.append(','); | 
 |     } | 
 |     builder.append(text); | 
 |   } | 
 | } |