blob: 326a95e5476245241803dbf09d50ec1f29ad0c1e [file] [log] [blame]
// 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.graph.DexItemFactory;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.position.Position;
import java.util.List;
import java.util.function.Consumer;
import java.util.stream.Collectors;
public class ProguardKeepRule extends ProguardKeepRuleBase {
public static class Builder extends ProguardKeepRuleBase.Builder<ProguardKeepRule, Builder> {
protected Builder() {
super();
}
@Override
public Builder self() {
return this;
}
@Override
public ProguardKeepRule build() {
return new ProguardKeepRule(
origin,
getPosition(),
source,
buildClassAnnotations(),
classAccessFlags,
negatedClassAccessFlags,
classTypeNegated,
classType,
classNames,
buildInheritanceAnnotations(),
inheritanceClassName,
inheritanceIsExtends,
memberRules,
type,
modifiersBuilder.build());
}
}
protected ProguardKeepRule(
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,
type,
modifiers);
}
/**
* Create a new empty builder.
*/
public static Builder builder() {
return new Builder();
}
protected ProguardKeepRule materialize(DexItemFactory dexItemFactory) {
return new ProguardKeepRule(
getOrigin(),
getPosition(),
getSource(),
ProguardTypeMatcher.materializeList(getClassAnnotations(), dexItemFactory),
getClassAccessFlags(),
getNegatedClassAccessFlags(),
getClassTypeNegated(),
getClassType(),
getClassNames() == null ? null : getClassNames().materialize(dexItemFactory),
ProguardTypeMatcher.materializeList(getInheritanceAnnotations(), dexItemFactory),
getInheritanceClassName() == null
? null
: getInheritanceClassName().materialize(dexItemFactory),
getInheritanceIsExtends(),
getMemberRules() == null
? null
: getMemberRules().stream()
.map(memberRule -> memberRule.materialize(dexItemFactory))
.collect(Collectors.toList()),
getType(),
getModifiers());
}
@Override
public boolean equals(Object o) {
if (!(o instanceof ProguardKeepRule)) {
return false;
}
ProguardKeepRule that = (ProguardKeepRule) o;
return super.equals(that);
}
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);
}
}
}
public static ProguardKeepRule defaultKeepAllRule(
Consumer<ProguardKeepRuleModifiers.Builder> modifiers) {
ProguardKeepRule.Builder builder = ProguardKeepRule.builder();
builder.setOrigin(
new Origin(Origin.root()) {
@Override
public String part() {
return "<DEFAULT_KEEP_ALL_RULE>";
}
});
builder.setClassType(ProguardClassType.CLASS);
builder.matchAllSpecification();
builder.setType(ProguardKeepRuleType.KEEP);
modifiers.accept(builder.getModifiersBuilder());
ProguardKeepRule rule = builder.build();
// Consider the default keep all rule as always matched.
rule.markAsUsed();
return rule;
}
@Override
public boolean isProguardKeepRule() {
return true;
}
@Override
public ProguardKeepRule asProguardKeepRule() {
return this;
}
}