blob: 919bbd756482b0aef3379d793b32ce320f1be4ba [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.references;
import com.android.tools.r8.Keep;
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.utils.DescriptorUtils;
import java.util.Objects;
/** Reference to an array type. */
@Keep
public final class ArrayReference implements TypeReference {
private final int dimensions;
private final TypeReference baseType;
// Consider removing the descriptor field as dimensions and baseType encode the same information.
private final String descriptor;
private ArrayReference(int dimensions, TypeReference baseType, String descriptor) {
assert dimensions > 0;
this.dimensions = dimensions;
this.baseType = baseType;
this.descriptor = descriptor;
}
static ArrayReference fromDescriptor(String descriptor) {
for (int i = 0; i < descriptor.length(); i++) {
if (descriptor.charAt(i) != '[') {
if (i > 0) {
return new ArrayReference(
i, Reference.typeFromDescriptor(descriptor.substring(i)), descriptor);
}
break;
}
}
throw new Unreachable("Invalid array type descriptor: " + descriptor);
}
static ArrayReference fromBaseType(TypeReference baseType, int dimensions) {
return new ArrayReference(
dimensions,
baseType,
DescriptorUtils.toArrayDescriptor(dimensions, baseType.getDescriptor()));
}
public int getDimensions() {
return dimensions;
}
public TypeReference getMemberType() {
return Reference.arrayFromDescriptor(descriptor.substring(1));
}
public TypeReference getBaseType() {
return baseType;
}
@Override
public boolean isArray() {
return true;
}
@Override
public ArrayReference asArray() {
return this;
}
@Override
public String getDescriptor() {
return descriptor;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof ArrayReference)) {
return false;
}
ArrayReference other = (ArrayReference) o;
return dimensions == other.dimensions && baseType.equals(other.baseType);
}
@Override
public int hashCode() {
return Objects.hash(dimensions, baseType);
}
}