blob: e00fedd0919c3439249dfd7d0895d40b9b840296 [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.ast.KeepMethodNamePattern.KeepMethodNameExactPattern;
import java.util.Objects;
public final class KeepMethodPattern extends KeepMemberPattern {
public static Builder builder() {
return new Builder();
}
public static class Builder {
private KeepMethodAccessPattern accessPattern = KeepMethodAccessPattern.any();
private KeepMethodNamePattern namePattern = null;
private KeepMethodReturnTypePattern returnTypePattern = KeepMethodReturnTypePattern.any();
private KeepMethodParametersPattern parametersPattern = KeepMethodParametersPattern.any();
private Builder() {}
public Builder self() {
return this;
}
public Builder setAccessPattern(KeepMethodAccessPattern accessPattern) {
this.accessPattern = accessPattern;
return self();
}
public Builder setNamePattern(KeepMethodNamePattern namePattern) {
this.namePattern = namePattern;
return self();
}
public Builder setReturnTypeVoid() {
returnTypePattern = KeepMethodReturnTypePattern.voidType();
return self();
}
public Builder setParametersPattern(KeepMethodParametersPattern parametersPattern) {
this.parametersPattern = parametersPattern;
return self();
}
public KeepMethodPattern build() {
if (namePattern == null) {
throw new KeepEdgeException("Method pattern must declar a name pattern");
}
KeepMethodReturnTypePattern returnTypePattern = this.returnTypePattern;
KeepMethodNameExactPattern exactName = namePattern.asExact();
if (exactName != null
&& (exactName.getName().equals("<init>") || exactName.getName().equals("<clinit>"))) {
if (!this.returnTypePattern.isAny() && !this.returnTypePattern.isVoid()) {
throw new KeepEdgeException("Method constructor pattern must match 'void' type.");
}
returnTypePattern = KeepMethodReturnTypePattern.voidType();
}
return new KeepMethodPattern(
accessPattern, namePattern, returnTypePattern, parametersPattern);
}
}
private final KeepMethodAccessPattern accessPattern;
private final KeepMethodNamePattern namePattern;
private final KeepMethodReturnTypePattern returnTypePattern;
private final KeepMethodParametersPattern parametersPattern;
private KeepMethodPattern(
KeepMethodAccessPattern accessPattern,
KeepMethodNamePattern namePattern,
KeepMethodReturnTypePattern returnTypePattern,
KeepMethodParametersPattern parametersPattern) {
assert accessPattern != null;
assert namePattern != null;
assert returnTypePattern != null;
assert parametersPattern != null;
this.accessPattern = accessPattern;
this.namePattern = namePattern;
this.returnTypePattern = returnTypePattern;
this.parametersPattern = parametersPattern;
}
@Override
public KeepMethodPattern asMethod() {
return this;
}
public boolean isAnyMethod() {
return accessPattern.isAny()
&& namePattern.isAny()
&& returnTypePattern.isAny()
&& parametersPattern.isAny();
}
public KeepMethodAccessPattern getAccessPattern() {
return accessPattern;
}
public KeepMethodNamePattern getNamePattern() {
return namePattern;
}
public KeepMethodReturnTypePattern getReturnTypePattern() {
return returnTypePattern;
}
public KeepMethodParametersPattern getParametersPattern() {
return parametersPattern;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
KeepMethodPattern that = (KeepMethodPattern) o;
return accessPattern.equals(that.accessPattern)
&& namePattern.equals(that.namePattern)
&& returnTypePattern.equals(that.returnTypePattern)
&& parametersPattern.equals(that.parametersPattern);
}
@Override
public int hashCode() {
return Objects.hash(accessPattern, namePattern, returnTypePattern, parametersPattern);
}
@Override
public String toString() {
return "KeepMethodPattern{"
+ "access="
+ accessPattern
+ ", name="
+ namePattern
+ ", returnType="
+ returnTypePattern
+ ", parameters="
+ parametersPattern
+ '}';
}
}