blob: a66cc33445f13700d41d4302e862bc3a2765978b [file] [log] [blame]
// Copyright (c) 2024, 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.graph;
import com.android.tools.r8.lightir.LirConstant;
import com.android.tools.r8.utils.structural.CompareToVisitor;
import com.android.tools.r8.utils.structural.Equatable;
import com.android.tools.r8.utils.structural.HashingVisitor;
import com.android.tools.r8.utils.structural.StructuralItem;
import com.android.tools.r8.utils.structural.StructuralMapping;
import com.android.tools.r8.utils.structural.StructuralSpecification;
import java.util.Objects;
import java.util.function.Consumer;
public class OriginalFieldWitness implements LirConstant, StructuralItem<OriginalFieldWitness> {
private final OriginalFieldWitness parent;
private final DexField originalField;
private static void specify(StructuralSpecification<OriginalFieldWitness, ?> spec) {
spec.withItem(d -> d.originalField).withNullableItem(d -> d.parent);
}
private OriginalFieldWitness(OriginalFieldWitness parent, DexField originalField) {
this.parent = parent;
this.originalField = originalField;
}
@Override
public OriginalFieldWitness self() {
return this;
}
@Override
public StructuralMapping<OriginalFieldWitness> getStructuralMapping() {
return OriginalFieldWitness::specify;
}
public static OriginalFieldWitness forProgramField(ProgramField field) {
return new OriginalFieldWitness(null, field.getReference());
}
public boolean isEqualToDexField(DexField field) {
return parent == null && originalField.isIdenticalTo(field);
}
public void forEachReference(Consumer<? super DexField> fn) {
fn.accept(originalField);
if (parent != null) {
parent.forEachReference(fn);
}
}
@Override
public String toString() {
if (parent == null) {
return originalField.toString();
}
return originalField + ":" + parent.toString();
}
@Override
public boolean equals(Object obj) {
return Equatable.equalsImpl(this, obj);
}
@Override
public int hashCode() {
return Objects.hash(originalField, parent);
}
@Override
public LirConstantOrder getLirConstantOrder() {
return LirConstantOrder.ORIGINAL_FIELD_WITNESS;
}
@Override
public int internalLirConstantAcceptCompareTo(LirConstant other, CompareToVisitor visitor) {
return visitor.visit(this, (OriginalFieldWitness) other, OriginalFieldWitness::specify);
}
@Override
public void internalLirConstantAcceptHashing(HashingVisitor visitor) {
visitor.visit(this, OriginalFieldWitness::specify);
}
}