private Node parseTypeName(JsDocToken token) {
    Node typeNameNode = parseNameExpression(token);

    if (match(JsDocToken.LEFT_ANGLE)) {
      next();
      skipEOLs();
      Node memberType = parseTypeExpressionList(typeNameNode.getString(), next());
      if (memberType != null) {
        typeNameNode.addChildToFront(memberType);

        skipEOLs();
        if (!match(JsDocToken.RIGHT_ANGLE)) {
          return reportTypeSyntaxWarning("msg.jsdoc.missing.gt");
        }

        next();
      }
    }
    return typeNameNode;
  }
private Node parseTypeName ( JsDocToken token ) { Node typeNameNode = parseNameExpression ( token ) ; if ( match ( JsDocToken . LEFT_ANGLE ) ) { next ( ) ; skipEOLs ( ) ; Node memberType = parseTypeExpressionList ( typeNameNode . getString ( ) , next ( ) ) ; if ( memberType != null ) { typeNameNode . addChildToFront ( memberType ) ; skipEOLs ( ) ; if ( ! match ( JsDocToken . RIGHT_ANGLE ) ) { return reportTypeSyntaxWarning ( "msg.jsdoc.missing.gt" ) ; } next ( ) ; } } return typeNameNode ; }
Parse a TypeName:

<pre>{@code
TypeName := NameExpression | NameExpression TypeApplication
TypeApplication := '.'? '<' TypeExpressionList '>'
}</pre>