blob: 6042930e0566630ee65db4426f713e46729b762d [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;
public abstract class KeepPackagePattern {
public static Builder builder() {
return new Builder();
}
public static KeepPackagePattern any() {
return Any.getInstance();
}
public static KeepPackagePattern top() {
return Top.getInstance();
}
public static KeepPackagePattern exact(String fullPackage) {
return KeepPackagePattern.builder().exact(fullPackage).build();
}
public static class Builder {
private KeepPackagePattern pattern;
public Builder any() {
pattern = Any.getInstance();
return this;
}
public Builder top() {
pattern = Top.getInstance();
return this;
}
public Builder exact(String fullPackage) {
pattern = fullPackage.isEmpty() ? KeepPackagePattern.top() : new Exact(fullPackage);
return this;
}
public KeepPackagePattern build() {
if (pattern == null) {
throw new KeepEdgeException("Invalid package pattern: null");
}
return pattern;
}
}
private static final class Any extends KeepPackagePattern {
private static final Any INSTANCE = new Any();
public static Any getInstance() {
return INSTANCE;
}
private Any() {}
@Override
public boolean isAny() {
return true;
}
@Override
public boolean isTop() {
return false;
}
@Override
public boolean isExact() {
return false;
}
@Override
public boolean equals(Object obj) {
return obj == this;
}
@Override
public int hashCode() {
return System.identityHashCode(this);
}
@Override
public String toString() {
return "*";
}
}
private static final class Top extends Exact {
private static final Top INSTANCE = new Top();
public static Top getInstance() {
return INSTANCE;
}
private Top() {
super("");
}
@Override
public boolean isAny() {
return false;
}
@Override
public boolean isTop() {
return true;
}
@Override
public String toString() {
return "";
}
}
private static class Exact extends KeepPackagePattern {
private final String fullPackage;
private Exact(String fullPackage) {
assert fullPackage != null;
this.fullPackage = fullPackage;
// TODO: Verify valid package identifiers.
}
@Override
public boolean isAny() {
return false;
}
@Override
public boolean isTop() {
return fullPackage.equals("");
}
@Override
public boolean isExact() {
return true;
}
@Override
public String getExactPackageAsString() {
return fullPackage;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Exact that = (Exact) o;
return fullPackage.equals(that.fullPackage);
}
@Override
public int hashCode() {
return fullPackage.hashCode();
}
@Override
public String toString() {
return fullPackage;
}
}
public abstract boolean isAny();
public abstract boolean isTop();
public abstract boolean isExact();
public String getExactPackageAsString() {
throw new IllegalStateException();
}
}