/******************************************************************************* * 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); } }