code: private Node parseBasicTypeExpression(JsDocToken token) {
      if (token == JsDocToken.STAR) {
        return newNode(Token.STAR);
      } else if (token == JsDocToken.LEFT_CURLY) {
        skipEOLs();
        return parseRecordType(next());
      } else if (token == JsDocToken.LEFT_PAREN) {
        skipEOLs();
        return parseUnionType(next());
      } else if (token == JsDocToken.STRING) {
        String string = stream.getString();
        switch (string) {
          case "function":
            skipEOLs();
            return parseFunctionType(next());
          case "null":
          case "undefined":
            return newStringNode(string);
          case "typeof":
            skipEOLs();
            return parseTypeofType(next());
          default:
            return parseTypeName(token);
        }
      }
  
      restoreLookAhead(token);
      return reportGenericTypeSyntaxWarning();
    }
docs: BasicTypeExpression := '*' | 'null' | 'undefined' | TypeName | FunctionType | UnionType |
  RecordType | TypeofType