/**
   * 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;
  }
Esempio n. 3
0
 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;
   }
 }