From bf18ea20f4a53735c2db9d9e4bb5ab1c9149646b Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Mon, 4 Jun 2018 09:03:32 -0700 Subject: [PATCH] Add 'parseOptionalJsdoc' helper --- src/compiler/parser.ts | 42 ++++++++++++++++++------------------------ 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index ea5a2a339372a..c5bbb8e3f619d 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -6385,17 +6385,14 @@ namespace ts { indent += text.length; } - let t = nextJSDocToken(); - while (t === SyntaxKind.WhitespaceTrivia) { - t = nextJSDocToken(); - } - if (t === SyntaxKind.NewLineTrivia) { + nextJSDocToken(); + while (parseOptionalJsdoc(SyntaxKind.WhitespaceTrivia)); + if (parseOptionalJsdoc(SyntaxKind.NewLineTrivia)) { state = JSDocState.BeginningOfLine; indent = 0; - t = nextJSDocToken(); } loop: while (true) { - switch (t) { + switch (token()) { case SyntaxKind.AtToken: if (state === JSDocState.BeginningOfLine || state === JSDocState.SawAsterisk) { removeTrailingNewlines(comments); @@ -6455,12 +6452,11 @@ namespace ts { pushComment(scanner.getTokenText()); break; } - t = nextJSDocToken(); + nextJSDocToken(); } removeLeadingNewlines(comments); removeTrailingNewlines(comments); result = createJSDocComment(); - }); return result; @@ -6897,8 +6893,7 @@ namespace ts { jsdocSignature.parameters = append(jsdocSignature.parameters as MutableNodeArray, child); } const returnTag = tryParse(() => { - if (token() === SyntaxKind.AtToken) { - nextJSDocToken(); + if (parseOptionalJsdoc(SyntaxKind.AtToken)) { const tag = parseTag(indent); if (tag && tag.kind === SyntaxKind.JSDocReturnTag) { return tag as JSDocReturnTag; @@ -7021,7 +7016,8 @@ namespace ts { const typeParameters = []; const typeParametersPos = getNodePos(); - while (true) { + do { + skipWhitespace(); const typeParameter = createNode(SyntaxKind.TypeParameter); const name = parseJSDocIdentifierNameWithOptionalBraces(); skipWhitespace(); @@ -7031,18 +7027,8 @@ namespace ts { } typeParameter.name = name; - finishNode(typeParameter); - - typeParameters.push(typeParameter); - - if (token() === SyntaxKind.CommaToken) { - nextJSDocToken(); - skipWhitespace(); - } - else { - break; - } - } + typeParameters.push(finishNode(typeParameter)); + } while (parseOptionalJsdoc(SyntaxKind.CommaToken)); const result = createNode(SyntaxKind.JSDocTemplateTag, atToken.pos); result.atToken = atToken; @@ -7065,6 +7051,14 @@ namespace ts { return currentToken = scanner.scanJSDocToken(); } + function parseOptionalJsdoc(t: JsDocSyntaxKind): boolean { + if (token() === t) { + nextJSDocToken(); + return true; + } + return false; + } + function parseJSDocEntityName(): EntityName { let entity: EntityName = parseJSDocIdentifierName(/*createIfMissing*/ true); if (parseOptional(SyntaxKind.OpenBracketToken)) {