blob: caca5a27f2d954edb971f4290b840e0b2ac684dc [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015, 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.indexer;
import org.eclipse.jdt.internal.compiler.env.IBinaryField;
import org.eclipse.jdt.internal.compiler.env.IBinaryMethod;
import org.eclipse.jdt.internal.compiler.env.IBinaryType;
import org.eclipse.jdt.internal.compiler.lookup.SignatureWrapper;
import org.eclipse.jdt.internal.core.nd.util.CharArrayUtils;
/**
* Contains static factory methods for constructing {@link SignatureWrapper} from various types.
*/
public class GenericSignatures {
private static final char[][] EMPTY_CHAR_ARRAY_ARRAY = new char[0][];
public static SignatureWrapper getGenericSignature(IBinaryMethod next) {
char[] signature = next.getGenericSignature();
if (signature == null) {
signature = next.getMethodDescriptor();
}
return new SignatureWrapper(signature);
}
/**
* Returns the generic signature for the given field. If the field has no generic signature, one is generated
* from the type's field descriptor.
*/
public static SignatureWrapper getGenericSignature(IBinaryType binaryType) {
char[][] interfaces = binaryType.getInterfaceNames();
if (interfaces == null) {
interfaces = EMPTY_CHAR_ARRAY_ARRAY;
}
char[] genericSignature = binaryType.getGenericSignature();
if (genericSignature == null) {
int startIndex = binaryType.getSuperclassName() != null ? 3 : 0;
char[][] toCatenate = new char[startIndex + (interfaces.length * 3)][];
char[] prefix = new char[]{'L'};
char[] suffix = new char[]{';'};
if (binaryType.getSuperclassName() != null) {
toCatenate[0] = prefix;
toCatenate[1] = binaryType.getSuperclassName();
toCatenate[2] = suffix;
}
for (int idx = 0; idx < interfaces.length; idx++) {
int catIndex = startIndex + idx * 3;
toCatenate[catIndex] = prefix;
toCatenate[catIndex + 1] = interfaces[idx];
toCatenate[catIndex + 2] = suffix;
}
genericSignature = CharArrayUtils.concat(toCatenate);
}
SignatureWrapper signatureWrapper = new SignatureWrapper(genericSignature);
return signatureWrapper;
}
/**
* Returns the generic signature for the given field. If the field has no generic signature, one is generated
* from the type's field descriptor.
*/
static SignatureWrapper getGenericSignatureFor(IBinaryField nextField) {
char[] signature = nextField.getGenericSignature();
if (signature == null) {
signature = nextField.getTypeName();
}
return new SignatureWrapper(signature);
}
}