code: private Node parseTypeExpressionList(String typeName, JsDocToken token) {
      Node typeExpr = parseTopLevelTypeExpression(token);
      if (typeExpr == null) {
        return null;
      }
      Node typeList = IR.block();
      int numTypeExprs = 1;
      typeList.addChildToBack(typeExpr);
      while (match(JsDocToken.COMMA)) {
        next();
        skipEOLs();
        typeExpr = parseTopLevelTypeExpression(next());
        if (typeExpr == null) {
          return null;
        }
        numTypeExprs++;
        typeList.addChildToBack(typeExpr);
      }
      if (typeName.equals("Object") && numTypeExprs == 1) {
        // Unlike other generic types, Object<V> means Object<?, V>, not Object<V, ?>.
        typeList.addChildToFront(newNode(Token.QMARK));
      }
      return typeList;
    }
docs: TypeExpressionList := TopLevelTypeExpression
  | TopLevelTypeExpression ',' TypeExpressionList