/** * Returns the lower bound of a type signature. Returns the null type signature if <code>signature * </code> is a wildcard or upper bound (<code>? extends T</code>); returns the signature of the * type <code>T</code> of a lower bound (<code>? super T</code>) or <code>signature</code> itself * if it is not a bound signature. * * @param signature the signature * @return the lower bound signature of <code>signature</code> */ public static char[] getLowerBound(char[] signature) { if (signature.length < 1) return signature; if (signature.length == 1 && signature[0] == Signature.C_STAR) return signature; int superIndex = indexOf(signature, Signature.C_EXTENDS); if (superIndex == 0) return NULL_TYPE_SIGNATURE_ARRAY; if (superIndex != -1) { char afterSuper = signature[superIndex + 1]; if (afterSuper == Signature.C_STAR || afterSuper == Signature.C_EXTENDS) // impossible captured type return NULL_TYPE_SIGNATURE_ARRAY; } char[][] typeArguments = Signature.getTypeArguments(signature); for (int i = 0; i < typeArguments.length; i++) if (Arrays.equals(typeArguments[i], NULL_TYPE_SIGNATURE_ARRAY)) return NULL_TYPE_SIGNATURE_ARRAY; if (signature[0] == Signature.C_SUPER) { char[] type = new char[signature.length - 1]; System.arraycopy(signature, 1, type, 0, signature.length - 1); return type; } return signature; }
/* * @see org.eclipse.jdt.internal.ui.text.java.LazyJavaCompletionProposal#computeContextInformation() * @since 3.3 */ @Override protected IContextInformation computeContextInformation() { char[] signature = fProposal.getSignature(); char[][] typeParameters = Signature.getTypeArguments(signature); if (typeParameters.length == 0) return super.computeContextInformation(); ProposalContextInformation contextInformation = new ProposalContextInformation(fProposal); if (fContextInformationPosition != 0 && fProposal.getCompletion().length == 0) contextInformation.setContextInformationPosition(fContextInformationPosition); return contextInformation; }
public void computeParameterizedTypeName(String signature, StringBuilder uriBuilder) { computeTypeName(signature, uriBuilder); String[] typeArguments = Signature.getTypeArguments(signature); if (typeArguments.length != 0) { uriBuilder.append('<'); for (int i = 0; i < typeArguments.length; i++) { if (i != 0) uriBuilder.append(','); computeParameter(typeArguments[i], uriBuilder); } uriBuilder.append('>'); } }
private static String typeSignatureToFqn(String signature) { try { switch (Signature.getTypeSignatureKind(signature)) { case Signature.ARRAY_TYPE_SIGNATURE: return typeSignatureToFqn(Signature.getElementType(signature)) + brackets.substring(0, 2 * Signature.getArrayCount(signature)); case Signature.CLASS_TYPE_SIGNATURE: String args[] = Signature.getTypeArguments(signature); if (args.length == 0) { int firstDollar = signature.indexOf('$'); if (firstDollar == -1) { return Signature.getSignatureQualifier(signature) + "." + Signature.getSignatureSimpleName(signature); } else { String shortSig = signature.substring(0, firstDollar) + ";"; return Signature.getSignatureQualifier(shortSig) + "." + Signature.getSignatureSimpleName(shortSig) + signature.substring(firstDollar, signature.length() - 1); } } else { StringBuilder fqnBuilder = new StringBuilder(typeSignatureToFqn(Signature.getTypeErasure(signature))); fqnBuilder.append('<'); boolean first = true; for (String arg : args) { if (first) { first = false; } else { fqnBuilder.append(','); } fqnBuilder.append(typeSignatureToFqn(arg)); } fqnBuilder.append('>'); return fqnBuilder.toString(); } case Signature.BASE_TYPE_SIGNATURE: return Signature.getSignatureSimpleName(signature); case Signature.TYPE_VARIABLE_SIGNATURE: return "<" + Signature.getSignatureSimpleName(signature) + ">"; case Signature.WILDCARD_TYPE_SIGNATURE: if (signature.startsWith("+")) { return "<?+" + typeSignatureToFqn(signature.substring(1)) + ">"; } else if (signature.startsWith("-")) { return "<?-" + typeSignatureToFqn(signature.substring(1)) + ">"; } else { return "<?>"; } case Signature.CAPTURE_TYPE_SIGNATURE: System.out.println("eek"); return ""; default: throw new IllegalArgumentException("Not a valid type signature"); } } catch (Exception e) { e.printStackTrace(); System.out.println("bad"); return null; } }