code: private Node parseFieldTypeList(JsDocToken token) {
      Node fieldTypeList = newNode(Token.LB);
  
      Set<String> names = new HashSet<>();
  
      do {
        Node fieldType = parseFieldType(token);
  
        if (fieldType == null) {
          return null;
        }
  
        String name = fieldType.isStringKey() ? fieldType.getString()
            : fieldType.getFirstChild().getString();
        if (names.add(name)) {
          fieldTypeList.addChildToBack(fieldType);
        } else {
          addTypeWarning("msg.jsdoc.type.record.duplicate", name);
        }
  
        skipEOLs();
        if (!match(JsDocToken.COMMA)) {
          break;
        }
  
        // Move to the comma token.
        next();
  
        // Move to the token past the comma
        skipEOLs();
  
        if (match(JsDocToken.RIGHT_CURLY)) {
          // Allow trailing comma (ie, right curly following the comma)
          break;
        }
  
        token = next();
      } while (true);
  
      return fieldTypeList;
    }
docs: FieldTypeList := FieldType | FieldType ',' FieldTypeList