blob: c8f83b27b051047995f9589a9986a713c39f66cc [file] [log] [blame]
// Copyright (c) 2022, 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.keepanno.ast;
import com.android.tools.r8.keepanno.keeprules.RulePrinter;
import com.android.tools.r8.keepanno.keeprules.RulePrintingUtils;
import java.util.Set;
public class KeepMethodAccessPattern extends KeepMemberAccessPattern {
private static final KeepMethodAccessPattern ANY =
new KeepMethodAccessPattern(
AccessVisibility.all(),
ModifierPattern.any(),
ModifierPattern.any(),
ModifierPattern.any(),
ModifierPattern.any(),
ModifierPattern.any(),
ModifierPattern.any(),
ModifierPattern.any(),
ModifierPattern.any());
public static KeepMethodAccessPattern anyMethodAccess() {
return ANY;
}
public static Builder builder() {
return new Builder();
}
private final ModifierPattern synchronizedPattern;
private final ModifierPattern bridgePattern;
private final ModifierPattern nativePattern;
private final ModifierPattern abstractPattern;
private final ModifierPattern strictFpPattern;
public KeepMethodAccessPattern(
Set<AccessVisibility> allowedVisibilities,
ModifierPattern staticPattern,
ModifierPattern finalPattern,
ModifierPattern synchronizedPattern,
ModifierPattern bridgePattern,
ModifierPattern nativePattern,
ModifierPattern abstractPattern,
ModifierPattern syntheticPattern,
ModifierPattern strictFpPattern) {
super(allowedVisibilities, staticPattern, finalPattern, syntheticPattern);
this.synchronizedPattern = synchronizedPattern;
this.bridgePattern = bridgePattern;
this.nativePattern = nativePattern;
this.abstractPattern = abstractPattern;
this.strictFpPattern = strictFpPattern;
}
@Override
public String toString() {
if (isAny()) {
return "*";
}
StringBuilder builder = new StringBuilder();
RulePrintingUtils.printMethodAccess(RulePrinter.withoutBackReferences(builder), this);
return builder.toString();
}
@Override
public boolean isAny() {
return super.isAny()
&& synchronizedPattern.isAny()
&& bridgePattern.isAny()
&& nativePattern.isAny()
&& abstractPattern.isAny()
&& strictFpPattern.isAny();
}
public ModifierPattern getSynchronizedPattern() {
return synchronizedPattern;
}
public ModifierPattern getBridgePattern() {
return bridgePattern;
}
public ModifierPattern getNativePattern() {
return nativePattern;
}
public ModifierPattern getAbstractPattern() {
return abstractPattern;
}
public ModifierPattern getStrictFpPattern() {
return strictFpPattern;
}
public static class Builder extends BuilderBase<KeepMethodAccessPattern, Builder> {
private ModifierPattern synchronizedPattern = ModifierPattern.any();
private ModifierPattern bridgePattern = ModifierPattern.any();
private ModifierPattern nativePattern = ModifierPattern.any();
private ModifierPattern abstractPattern = ModifierPattern.any();
private ModifierPattern strictFpPattern = ModifierPattern.any();
private Builder() {}
@Override
public Builder self() {
return this;
}
@Override
public KeepMethodAccessPattern build() {
KeepMethodAccessPattern pattern =
new KeepMethodAccessPattern(
getAllowedVisibilities(),
getStaticPattern(),
getFinalPattern(),
getSynchronizedPattern(),
getBridgePattern(),
getNativePattern(),
getAbstractPattern(),
getSyntheticPattern(),
getStrictFpPattern());
return pattern.isAny() ? anyMethodAccess() : pattern;
}
public Builder setSynchronized(boolean allow) {
synchronizedPattern = ModifierPattern.fromAllowValue(allow);
return this;
}
public Builder setBridge(boolean allow) {
bridgePattern = ModifierPattern.fromAllowValue(allow);
return this;
}
public Builder setNative(boolean allow) {
nativePattern = ModifierPattern.fromAllowValue(allow);
return this;
}
public Builder setAbstract(boolean allow) {
abstractPattern = ModifierPattern.fromAllowValue(allow);
return this;
}
public Builder setStrictFp(boolean allow) {
strictFpPattern = ModifierPattern.fromAllowValue(allow);
return this;
}
public ModifierPattern getSynchronizedPattern() {
return synchronizedPattern;
}
public ModifierPattern getBridgePattern() {
return bridgePattern;
}
public ModifierPattern getNativePattern() {
return nativePattern;
}
public ModifierPattern getAbstractPattern() {
return abstractPattern;
}
public ModifierPattern getStrictFpPattern() {
return strictFpPattern;
}
}
}