code: JCExpression typeArgument() {
          List<JCAnnotation> annotations = typeAnnotationsOpt();
          if (token.kind != QUES) return parseType(annotations);
          int pos = token.pos;
          nextToken();
          JCExpression result;
          if (token.kind == EXTENDS) {
              TypeBoundKind t = to(F.at(pos).TypeBoundKind(BoundKind.EXTENDS));
              nextToken();
              JCExpression bound = parseType();
              result = F.at(pos).Wildcard(t, bound);
          } else if (token.kind == SUPER) {
              TypeBoundKind t = to(F.at(pos).TypeBoundKind(BoundKind.SUPER));
              nextToken();
              JCExpression bound = parseType();
              result = F.at(pos).Wildcard(t, bound);
          } else if (LAX_IDENTIFIER.accepts(token.kind)) {
              //error recovery
              TypeBoundKind t = F.at(Position.NOPOS).TypeBoundKind(BoundKind.UNBOUND);
              JCExpression wc = toP(F.at(pos).Wildcard(t, null));
              JCIdent id = toP(F.at(token.pos).Ident(ident()));
              JCErroneous err = F.at(pos).Erroneous(List.<JCTree>of(wc, id));
              reportSyntaxError(err, "expected3", GT, EXTENDS, SUPER);
              result = err;
          } else {
              TypeBoundKind t = toP(F.at(pos).TypeBoundKind(BoundKind.UNBOUND));
              result = toP(F.at(pos).Wildcard(t, null));
          }
          if (!annotations.isEmpty()) {
              result = toP(F.at(annotations.head.pos).AnnotatedType(annotations,result));
          }
          return result;
      }
docs: {@literal
  TypeArgument = Type
  | [Annotations] "?"
  | [Annotations] "?" EXTENDS Type {"&" Type}
  | [Annotations] "?" SUPER Type
  }