|  | // 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; | 
|  |  | 
|  | import com.android.tools.r8.origin.Origin; | 
|  | import com.android.tools.r8.position.Position; | 
|  | import java.util.List; | 
|  | import java.util.function.Consumer; | 
|  |  | 
|  | public class ProguardKeepRuleBase extends ProguardConfigurationRule { | 
|  |  | 
|  | public static abstract class Builder<C extends ProguardKeepRuleBase, B extends Builder<C, B>> | 
|  | extends ProguardConfigurationRule.Builder<C, B> { | 
|  |  | 
|  | protected ProguardKeepRuleType type; | 
|  | protected final ProguardKeepRuleModifiers.Builder modifiersBuilder = | 
|  | ProguardKeepRuleModifiers.builder(); | 
|  |  | 
|  | protected Builder() { | 
|  | super(); | 
|  | } | 
|  |  | 
|  | public B setType(ProguardKeepRuleType type) { | 
|  | this.type = type; | 
|  | return self(); | 
|  | } | 
|  |  | 
|  | public ProguardKeepRuleModifiers.Builder getModifiersBuilder() { | 
|  | return modifiersBuilder; | 
|  | } | 
|  |  | 
|  | public B updateModifiers(Consumer<ProguardKeepRuleModifiers.Builder> consumer) { | 
|  | consumer.accept(getModifiersBuilder()); | 
|  | return self(); | 
|  | } | 
|  | } | 
|  |  | 
|  | private final ProguardKeepRuleType type; | 
|  | private final ProguardKeepRuleModifiers modifiers; | 
|  |  | 
|  | protected ProguardKeepRuleBase( | 
|  | Origin origin, | 
|  | Position position, | 
|  | String source, | 
|  | List<ProguardTypeMatcher> classAnnotations, | 
|  | ProguardAccessFlags classAccessFlags, | 
|  | ProguardAccessFlags negatedClassAccessFlags, | 
|  | boolean classTypeNegated, | 
|  | ProguardClassType classType, | 
|  | ProguardClassNameList classNames, | 
|  | List<ProguardTypeMatcher> inheritanceAnnotations, | 
|  | ProguardTypeMatcher inheritanceClassName, | 
|  | boolean inheritanceIsExtends, | 
|  | List<ProguardMemberRule> memberRules, | 
|  | ProguardKeepRuleType type, | 
|  | ProguardKeepRuleModifiers modifiers) { | 
|  | super( | 
|  | origin, | 
|  | position, | 
|  | source, | 
|  | classAnnotations, | 
|  | classAccessFlags, | 
|  | negatedClassAccessFlags, | 
|  | classTypeNegated, | 
|  | classType, | 
|  | classNames, | 
|  | inheritanceAnnotations, | 
|  | inheritanceClassName, | 
|  | inheritanceIsExtends, | 
|  | memberRules); | 
|  | this.type = type; | 
|  | this.modifiers = modifiers; | 
|  | } | 
|  |  | 
|  | public ProguardKeepRuleType getType() { | 
|  | return type; | 
|  | } | 
|  |  | 
|  | public ProguardKeepRuleModifiers getModifiers() { | 
|  | return modifiers; | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public boolean equals(Object o) { | 
|  | if (!(o instanceof ProguardKeepRuleBase)) { | 
|  | return false; | 
|  | } | 
|  | ProguardKeepRuleBase that = (ProguardKeepRuleBase) o; | 
|  |  | 
|  | if (type != that.type) { | 
|  | return false; | 
|  | } | 
|  | if (!modifiers.equals(that.modifiers)) { | 
|  | return false; | 
|  | } | 
|  | return super.equals(that); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public int hashCode() { | 
|  | // Used multiplier 3 to avoid too much overflow when computing hashCode. | 
|  | int result = type.hashCode(); | 
|  | result = 3 * result + modifiers.hashCode(); | 
|  | result = 3 * result + super.hashCode(); | 
|  | return result; | 
|  | } | 
|  |  | 
|  | static void appendNonEmpty(StringBuilder builder, String pre, Object item, String post) { | 
|  | if (item == null) { | 
|  | return; | 
|  | } | 
|  | String text = item.toString(); | 
|  | if (!text.isEmpty()) { | 
|  | if (pre != null) { | 
|  | builder.append(pre); | 
|  | } | 
|  | builder.append(text); | 
|  | if (post != null) { | 
|  | builder.append(post); | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | @Override | 
|  | String typeString() { | 
|  | return type.toString(); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | String modifierString() { | 
|  | return modifiers.toString(); | 
|  | } | 
|  | } |