blob: 3dcf1c9746e3dcc6769c4066b1f059c89823c824 [file] [log] [blame]
// Copyright (c) 2020, 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.retrace;
import com.android.tools.r8.references.ClassReference;
import com.android.tools.r8.references.FieldReference;
import com.android.tools.r8.references.Reference;
import java.util.Objects;
/** Internal encoding of a field that allows for having either basic info or full info. */
abstract class FieldDefinition implements Definition {
static FieldDefinition create(ClassReference obfuscatedReference, String fieldName) {
return new BaseFieldDefinition(obfuscatedReference, fieldName);
}
public static FieldDefinition create(FieldReference field) {
return new FullFieldDefinition(field);
}
abstract FieldDefinition substituteHolder(ClassReference newHolder);
static class BaseFieldDefinition extends FieldDefinition {
private final ClassReference classReference;
private final String name;
private BaseFieldDefinition(ClassReference classReference, String name) {
this.classReference = classReference;
this.name = name;
}
@Override
public String getName() {
return name;
}
@Override
public ClassReference getHolderClass() {
return classReference;
}
@Override
FieldDefinition substituteHolder(ClassReference newHolder) {
return FieldDefinition.create(classReference, name);
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
BaseFieldDefinition that = (BaseFieldDefinition) o;
return classReference.equals(that.classReference) && name.equals(that.name);
}
@Override
public int hashCode() {
return Objects.hash(classReference, name);
}
}
static class FullFieldDefinition extends FieldDefinition {
private final FieldReference fieldReference;
private FullFieldDefinition(FieldReference fieldReference) {
this.fieldReference = fieldReference;
}
@Override
public String getName() {
return fieldReference.getFieldName();
}
@Override
public ClassReference getHolderClass() {
return fieldReference.getHolderClass();
}
@Override
FieldDefinition substituteHolder(ClassReference newHolder) {
return create(
Reference.field(newHolder, fieldReference.getFieldName(), fieldReference.getFieldType()));
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
FullFieldDefinition that = (FullFieldDefinition) o;
return fieldReference.equals(that.fieldReference);
}
@Override
public int hashCode() {
return fieldReference.hashCode();
}
}
}