blob: a132f97f9baed90459ad84d7b238fdeb79404f5a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 Google, Inc and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Stefan Xenos (Google) - Initial implementation
*******************************************************************************/
package org.eclipse.jdt.internal.core.nd.java;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import org.eclipse.jdt.internal.core.nd.Nd;
import org.eclipse.jdt.internal.core.nd.db.IString;
import org.eclipse.jdt.internal.core.nd.field.FieldOneToMany;
import org.eclipse.jdt.internal.core.nd.field.FieldSearchKey;
import org.eclipse.jdt.internal.core.nd.field.StructDef;
import org.eclipse.jdt.internal.core.nd.util.CharArrayUtils;
import org.eclipse.jdt.internal.core.util.CharArrayBuffer;
public class NdTypeId extends NdTypeSignature {
public static final FieldSearchKey<JavaIndex> FIELD_DESCRIPTOR;
public static final FieldSearchKey<JavaIndex> SIMPLE_NAME;
public static final FieldOneToMany<NdType> TYPES;
public static final FieldOneToMany<NdComplexTypeSignature> USED_AS_COMPLEX_TYPE;
public static final FieldOneToMany<NdType> DECLARED_TYPES;
@SuppressWarnings("hiding")
public static final StructDef<NdTypeId> type;
private String fName;
static {
type = StructDef.create(NdTypeId.class, NdTypeSignature.type);
FIELD_DESCRIPTOR = FieldSearchKey.create(type, JavaIndex.TYPES);
SIMPLE_NAME = FieldSearchKey.create(type, JavaIndex.SIMPLE_INDEX);
TYPES = FieldOneToMany.create(type, NdType.TYPENAME, 2);
USED_AS_COMPLEX_TYPE = FieldOneToMany.create(type, NdComplexTypeSignature.RAW_TYPE);
DECLARED_TYPES = FieldOneToMany.create(type, NdType.DECLARING_TYPE);
type.useStandardRefCounting().done();
}
public NdTypeId(Nd nd, long address) {
super(nd, address);
}
public NdTypeId(Nd nd, char[] fieldDescriptor) {
super(nd);
char[] simpleName = JavaNames.fieldDescriptorToJavaName(fieldDescriptor, false);
FIELD_DESCRIPTOR.put(nd, this.address, fieldDescriptor);
SIMPLE_NAME.put(nd, this.address, simpleName);
}
@Override
public List<NdType> getSubTypes() {
List<NdType> result = new ArrayList<>();
result.addAll(super.getSubTypes());
for (NdComplexTypeSignature next : getComplexTypes()) {
result.addAll(next.getSubTypes());
}
return result;
}
public List<NdComplexTypeSignature> getComplexTypes() {
return USED_AS_COMPLEX_TYPE.asList(getNd(), this.address);
}
public NdType findTypeByResourceAddress(long resourceAddress) {
int size = TYPES.size(getNd(), this.address);
for (int idx = 0; idx < size; idx++) {
NdType next = TYPES.get(getNd(), this.address, idx);
if (next.getResourceAddress() == resourceAddress) {
return next;
}
}
return null;
}
public List<NdType> getTypes() {
return TYPES.asList(getNd(), this.address);
}
/**
* Returns the field descriptor.
*/
public IString getFieldDescriptor() {
return FIELD_DESCRIPTOR.get(getNd(), this.address);
}
public char[] getFieldDescriptorWithoutTrailingSemicolon() {
char[] fieldDescriptor = getFieldDescriptor().getChars();
int end = fieldDescriptor.length;
if (fieldDescriptor.length > 0 && fieldDescriptor[end - 1] == ';') {
end--;
}
return CharArrayUtils.subarray(fieldDescriptor, 0, end);
}
public char[] getBinaryName() {
return JavaNames.fieldDescriptorToBinaryName(getFieldDescriptor().getChars());
}
public IString getSimpleName() {
return SIMPLE_NAME.get(getNd(), this.address);
}
public char[] getSimpleNameCharArray() {
if (this.fName == null) {
this.fName= getSimpleName().getString();
}
return this.fName.toCharArray();
}
public boolean hasFieldDescriptor(String name) {
return this.getFieldDescriptor().compare(name, true) == 0;
}
public boolean hasSimpleName(String name) {
if (this.fName != null)
return this.fName.equals(name);
return getSimpleName().equals(name);
}
public void setSimpleName(String name) {
if (Objects.equals(name, this.fName)) {
return;
}
this.fName = name;
SIMPLE_NAME.put(getNd(), this.address, name);
}
public List<NdType> getDeclaredTypes() {
return DECLARED_TYPES.asList(getNd(), this.address);
}
@Override
public NdTypeId getRawType() {
return this;
}
@Override
public void getSignature(CharArrayBuffer result, boolean includeTrailingSemicolon) {
if (includeTrailingSemicolon) {
result.append(getFieldDescriptor().getChars());
} else {
result.append(getFieldDescriptorWithoutTrailingSemicolon());
}
}
@Override
public boolean isTypeVariable() {
return false;
}
@Override
public List<NdTypeSignature> getDeclaringTypeChain() {
return Collections.singletonList((NdTypeSignature)this);
}
@Override
public NdTypeSignature getArrayDimensionType() {
return null;
}
@Override
public List<NdTypeArgument> getTypeArguments() {
return Collections.emptyList();
}
@Override
public boolean isArrayType() {
return false;
}
}