blob: 97d01b961fd56b6a16bdc377866eb7aae564e6b1 [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 java.util.Objects;
public final class KeepQualifiedClassNamePattern {
public static Builder builder() {
return new Builder();
}
public static KeepQualifiedClassNamePattern any() {
return KeepQualifiedClassNamePattern.builder()
.setPackagePattern(KeepPackagePattern.any())
.setNamePattern(KeepUnqualfiedClassNamePattern.any())
.build();
}
public static KeepQualifiedClassNamePattern exact(String qualifiedClassName) {
int pkgSeparator = qualifiedClassName.lastIndexOf('.');
if (pkgSeparator == 0) {
throw new KeepEdgeException("Unexpected '.' at index 0 in '" + qualifiedClassName + "'");
}
if (pkgSeparator > 0) {
return KeepQualifiedClassNamePattern.builder()
.setPackagePattern(
KeepPackagePattern.exact(qualifiedClassName.substring(0, pkgSeparator)))
.setNamePattern(
KeepUnqualfiedClassNamePattern.exact(qualifiedClassName.substring(pkgSeparator + 1)))
.build();
}
return KeepQualifiedClassNamePattern.builder()
.setPackagePattern(KeepPackagePattern.top())
.setNamePattern(KeepUnqualfiedClassNamePattern.exact(qualifiedClassName))
.build();
}
public static class Builder {
private KeepPackagePattern packagePattern;
private KeepUnqualfiedClassNamePattern namePattern;
private Builder() {}
public Builder setPackagePattern(KeepPackagePattern packagePattern) {
this.packagePattern = packagePattern;
return this;
}
public Builder setNamePattern(KeepUnqualfiedClassNamePattern namePattern) {
this.namePattern = namePattern;
return this;
}
public KeepQualifiedClassNamePattern build() {
return new KeepQualifiedClassNamePattern(packagePattern, namePattern);
}
}
private final KeepPackagePattern packagePattern;
private final KeepUnqualfiedClassNamePattern namePattern;
public KeepQualifiedClassNamePattern(
KeepPackagePattern packagePattern, KeepUnqualfiedClassNamePattern namePattern) {
assert packagePattern != null;
assert namePattern != null;
this.packagePattern = packagePattern;
this.namePattern = namePattern;
}
public boolean isAny() {
return packagePattern.isAny() && namePattern.isAny();
}
public boolean isExact() {
return packagePattern.isExact() && namePattern.isExact();
}
public String getExactDescriptor() {
if (!isExact()) {
throw new KeepEdgeException("Attempt to obtain exact qualified type for inexact pattern");
}
return 'L'
+ packagePattern.asExact().getExactPackageAsString().replace('.', '/')
+ (packagePattern.isTop() ? "" : "/")
+ namePattern.asExact().getExactNameAsString()
+ ';';
}
public KeepPackagePattern getPackagePattern() {
return packagePattern;
}
public KeepUnqualfiedClassNamePattern getNamePattern() {
return namePattern;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
KeepQualifiedClassNamePattern that = (KeepQualifiedClassNamePattern) o;
return packagePattern.equals(that.packagePattern) && namePattern.equals(that.namePattern);
}
@Override
public int hashCode() {
return Objects.hash(packagePattern.hashCode(), namePattern.hashCode());
}
@Override
public String toString() {
return packagePattern + (packagePattern.isTop() ? "" : ".") + namePattern;
}
}