blob: 84151e898a22cad092cab3535cb099369308040f [file] [log] [blame]
// Copyright (c) 2018, 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.shaking;
import com.android.tools.r8.errors.Unreachable;
public abstract class ProguardWildcard {
abstract void setCaptured(String captured);
abstract void clearCaptured();
abstract String getCaptured();
boolean isPattern() {
return false;
}
Pattern asPattern() {
return null;
}
boolean isBackReference() {
return false;
}
BackReference asBackReference() {
return null;
}
static class Pattern extends ProguardWildcard {
final String pattern;
// TODO(b/79486261): Having captured part here makes back-reference handling not thread-safe.
private String captured = null;
Pattern(String pattern) {
this.pattern = pattern;
}
@Override
void setCaptured(String captured) {
this.captured = captured;
}
@Override
void clearCaptured() {
captured = null;
}
@Override
String getCaptured() {
return captured;
}
@Override
boolean isPattern() {
return true;
}
@Override
Pattern asPattern() {
return this;
}
@Override
public String toString() {
return pattern;
}
}
static class BackReference extends ProguardWildcard {
// Back-reference is not referable, hence the other type, Pattern, here.
Pattern reference;
final int referenceIndex;
BackReference(int referenceIndex) {
this.referenceIndex = referenceIndex;
}
void setReference(Pattern reference) {
this.reference = reference;
}
@Override
void setCaptured(String captured) {
throw new Unreachable("A back reference refers back to a previously matched wildcard.");
}
@Override
void clearCaptured() {
// no-op
}
@Override
String getCaptured() {
return reference != null ? reference.getCaptured() : null;
}
@Override
boolean isBackReference() {
return true;
}
@Override
BackReference asBackReference() {
return this;
}
@Override
public String toString() {
return "<" + referenceIndex + ">";
}
}
}