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();
}