blob: dbc2119cbad91d3b1ebdef5dba4934f2d544844f [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.graph;
import com.android.tools.r8.utils.OptionalBool;
public abstract class FieldResolutionResult
extends MemberResolutionResult<DexEncodedField, DexField> {
public static FailedFieldResolutionResult failure() {
return FailedFieldResolutionResult.INSTANCE;
}
public static UnknownFieldResolutionResult unknown() {
return UnknownFieldResolutionResult.INSTANCE;
}
public DexEncodedField getResolvedField() {
return null;
}
public DexField getResolvedFieldReference() {
return null;
}
@Override
public DexClassAndField getResolutionPair() {
return null;
}
public boolean isSuccessfulResolution() {
return false;
}
public SuccessfulFieldResolutionResult asSuccessfulResolution() {
return null;
}
@Override
public boolean isSuccessfulMemberResolutionResult() {
return false;
}
@Override
public SuccessfulFieldResolutionResult asSuccessfulMemberResolutionResult() {
return null;
}
public boolean isFailedOrUnknownResolution() {
return false;
}
public DexClass getInitialResolutionHolder() {
return null;
}
public static class SuccessfulFieldResolutionResult extends FieldResolutionResult
implements SuccessfulMemberResolutionResult<DexEncodedField, DexField> {
private final DexClass initialResolutionHolder;
private final DexClass resolvedHolder;
private final DexEncodedField resolvedField;
SuccessfulFieldResolutionResult(
DexClass initialResolutionHolder, DexClass resolvedHolder, DexEncodedField resolvedField) {
assert resolvedHolder.type == resolvedField.getHolderType();
this.initialResolutionHolder = initialResolutionHolder;
this.resolvedHolder = resolvedHolder;
this.resolvedField = resolvedField;
}
@Override
public DexClass getInitialResolutionHolder() {
return initialResolutionHolder;
}
@Override
public DexClass getResolvedHolder() {
return resolvedHolder;
}
@Override
public DexEncodedField getResolvedField() {
return resolvedField;
}
@Override
public DexField getResolvedFieldReference() {
return resolvedField.getReference();
}
@Override
public DexEncodedField getResolvedMember() {
return resolvedField;
}
@Override
public DexClassAndField getResolutionPair() {
return DexClassAndField.create(resolvedHolder, resolvedField);
}
@Override
public OptionalBool isAccessibleFrom(
ProgramDefinition context, AppInfoWithClassHierarchy appInfo) {
return AccessControl.isMemberAccessible(this, context, appInfo);
}
@Override
public boolean isSuccessfulResolution() {
return true;
}
@Override
public SuccessfulFieldResolutionResult asSuccessfulResolution() {
return this;
}
@Override
public boolean isSuccessfulMemberResolutionResult() {
return true;
}
@Override
public SuccessfulFieldResolutionResult asSuccessfulMemberResolutionResult() {
return this;
}
}
public static class FailedFieldResolutionResult extends FieldResolutionResult {
private static final FailedFieldResolutionResult INSTANCE = new FailedFieldResolutionResult();
@Override
public OptionalBool isAccessibleFrom(
ProgramDefinition context, AppInfoWithClassHierarchy appInfo) {
return OptionalBool.FALSE;
}
@Override
public boolean isFailedOrUnknownResolution() {
return true;
}
}
/**
* Used in D8 when trying to resolve a field that is not declared on the enclosing class of the
* current method.
*/
public static class UnknownFieldResolutionResult extends FieldResolutionResult {
private static final UnknownFieldResolutionResult INSTANCE = new UnknownFieldResolutionResult();
@Override
public OptionalBool isAccessibleFrom(
ProgramDefinition context, AppInfoWithClassHierarchy appInfo) {
return OptionalBool.FALSE;
}
@Override
public boolean isFailedOrUnknownResolution() {
return true;
}
}
}