blob: 7f840904e4701c00969652a7c48bd432aed6e570 [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;
/**
* A pattern for matching items in the program.
*
* <p>An item pattern can be any item, or it can describe a family of classes or a family of members
* on a classes.
*
* <p>A pattern cannot describe both a class *and* a member of a class. Either it is a pattern on
* classes or it is a pattern on members. The distinction is defined by having a "none" member
* pattern.
*/
public class KeepItemPattern {
public static KeepItemPattern any() {
KeepItemPattern any = builder().any().build();
assert any.isAny();
return any;
}
public static Builder builder() {
return new Builder();
}
public static class Builder {
private KeepQualifiedClassNamePattern classNamePattern = KeepQualifiedClassNamePattern.any();
private KeepExtendsPattern extendsPattern = KeepExtendsPattern.any();
private KeepMemberPattern memberPattern = KeepMemberPattern.none();
private Builder() {}
public Builder any() {
classNamePattern = KeepQualifiedClassNamePattern.any();
extendsPattern = KeepExtendsPattern.any();
memberPattern = KeepMemberPattern.all();
return this;
}
public Builder setClassPattern(KeepQualifiedClassNamePattern qualifiedClassNamePattern) {
this.classNamePattern = qualifiedClassNamePattern;
return this;
}
public Builder setExtendsPattern(KeepExtendsPattern extendsPattern) {
this.extendsPattern = extendsPattern;
return this;
}
public Builder setMemberPattern(KeepMemberPattern memberPattern) {
this.memberPattern = memberPattern;
return this;
}
public KeepItemPattern build() {
return new KeepItemPattern(classNamePattern, extendsPattern, memberPattern);
}
}
private final KeepQualifiedClassNamePattern qualifiedClassPattern;
private final KeepExtendsPattern extendsPattern;
private final KeepMemberPattern memberPattern;
// TODO: class annotations
private KeepItemPattern(
KeepQualifiedClassNamePattern qualifiedClassPattern,
KeepExtendsPattern extendsPattern,
KeepMemberPattern memberPattern) {
assert qualifiedClassPattern != null;
assert extendsPattern != null;
assert memberPattern != null;
this.qualifiedClassPattern = qualifiedClassPattern;
this.extendsPattern = extendsPattern;
this.memberPattern = memberPattern;
}
public boolean isAny() {
return qualifiedClassPattern.isAny() && extendsPattern.isAny() && memberPattern.isAll();
}
public KeepQualifiedClassNamePattern getClassNamePattern() {
return qualifiedClassPattern;
}
public KeepExtendsPattern getExtendsPattern() {
return extendsPattern;
}
public KeepMemberPattern getMemberPattern() {
return memberPattern;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
KeepItemPattern that = (KeepItemPattern) obj;
return qualifiedClassPattern.equals(that.qualifiedClassPattern)
&& extendsPattern.equals(that.extendsPattern)
&& memberPattern.equals(that.memberPattern);
}
@Override
public int hashCode() {
return Objects.hash(qualifiedClassPattern, extendsPattern, memberPattern);
}
@Override
public String toString() {
return "KeepClassPattern{"
+ "qualifiedClassPattern="
+ qualifiedClassPattern
+ ", extendsPattern="
+ extendsPattern
+ ", memberPattern="
+ memberPattern
+ '}';
}
}