private _tryParseJSDocTypeOrValueRest()

in tsdoc/src/parser/NodeParser.ts [389:436]


  private _tryParseJSDocTypeOrValueRest(
    tokenReader: TokenReader,
    openKind: TokenKind,
    closeKind: TokenKind,
    startMarker: number
  ): TokenSequence | undefined {
    let quoteKind: TokenKind | undefined;
    let openCount: number = 1;
    while (openCount > 0) {
      let tokenKind: TokenKind = tokenReader.peekTokenKind();
      switch (tokenKind) {
        case openKind:
          // ignore open bracket/brace inside of a quoted string
          if (quoteKind === undefined) openCount++;
          break;
        case closeKind:
          // ignore close bracket/brace inside of a quoted string
          if (quoteKind === undefined) openCount--;
          break;
        case TokenKind.Backslash:
          // ignore backslash outside of quoted string
          if (quoteKind !== undefined) {
            // skip the backslash and the next character.
            tokenReader.readToken();
            tokenKind = tokenReader.peekTokenKind();
          }
          break;
        case TokenKind.DoubleQuote:
        case TokenKind.SingleQuote:
        case TokenKind.Backtick:
          if (quoteKind === tokenKind) {
            // exit quoted string if quote character matches.
            quoteKind = undefined;
          } else if (quoteKind === undefined) {
            // start quoted string if not in a quoted string.
            quoteKind = tokenKind;
          }
          break;
      }
      // give up at end of input and backtrack to start.
      if (tokenKind === TokenKind.EndOfInput) {
        tokenReader.backtrackToMarker(startMarker);
        return undefined;
      }
      tokenReader.readToken();
    }
    return tokenReader.tryExtractAccumulatedSequence();
  }