This commit is contained in:
2024-02-07 01:33:07 -05:00
commit c1af19d441
4088 changed files with 1260170 additions and 0 deletions

View File

@ -0,0 +1,2 @@
export {};
//# sourceMappingURL=LineExtractor.test.d.ts.map

View File

@ -0,0 +1 @@
{"version":3,"file":"LineExtractor.test.d.ts","sourceRoot":"","sources":["../../../src/parser/__tests__/LineExtractor.test.ts"],"names":[],"mappings":""}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,2 @@
export {};
//# sourceMappingURL=NodeParserBasics.test.d.ts.map

View File

@ -0,0 +1 @@
{"version":3,"file":"NodeParserBasics.test.d.ts","sourceRoot":"","sources":["../../../src/parser/__tests__/NodeParserBasics.test.ts"],"names":[],"mappings":""}

View File

@ -0,0 +1 @@
{"version":3,"file":"NodeParserBasics.test.js","sourceRoot":"","sources":["../../../src/parser/__tests__/NodeParserBasics.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,IAAI,CAAC,0BAA0B,EAAE;IAC/B,WAAW,CAAC,+BAA+B,CACzC;QACE,KAAK;QACL,YAAY;QACZ,WAAW;QACX,KAAK;KACN,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+BAA+B,EAAE;IACpC,WAAW,CAAC,+BAA+B,CAAC,OAAO,CAAC,CAAC;IAErD,WAAW,CAAC,+BAA+B,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAE7E,WAAW,CAAC,+BAA+B,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACnF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yCAAyC,EAAE;IAC9C,WAAW,CAAC,+BAA+B,CAAC,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC3F,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yCAAyC,EAAE;IAC9C,WAAW,CAAC,+BAA+B,CACzC,CAAC,KAAK,EAAE,2CAA2C,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CACvE,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["import { TestHelpers } from './TestHelpers';\r\n\r\ntest('00 Tokenizer simple case', () => {\r\n TestHelpers.parseAndMatchNodeParserSnapshot(\r\n [\r\n '/**',\r\n ' * line 1 ', // extra space at end of line\r\n ' * line 2',\r\n ' */'\r\n ].join('\\n')\r\n );\r\n});\r\n\r\ntest('01 Tokenizer degenerate cases', () => {\r\n TestHelpers.parseAndMatchNodeParserSnapshot('/***/');\r\n\r\n TestHelpers.parseAndMatchNodeParserSnapshot(['/**', ' *', ' */'].join('\\n'));\r\n\r\n TestHelpers.parseAndMatchNodeParserSnapshot(['/**', ' ', ' ', ' */'].join('\\n'));\r\n});\r\n\r\ntest('02 Backslash escapes: positive examples', () => {\r\n TestHelpers.parseAndMatchNodeParserSnapshot(['/**', ' * \\\\$\\\\@param', ' */'].join('\\n'));\r\n});\r\n\r\ntest('03 Backslash escapes: negative examples', () => {\r\n TestHelpers.parseAndMatchNodeParserSnapshot(\r\n ['/**', ' * letter: \\\\A space: \\\\ end of line: \\\\', ' */'].join('\\n')\r\n );\r\n});\r\n"]}

View File

@ -0,0 +1,2 @@
export {};
//# sourceMappingURL=NodeParserCode.test.d.ts.map

View File

@ -0,0 +1 @@
{"version":3,"file":"NodeParserCode.test.d.ts","sourceRoot":"","sources":["../../../src/parser/__tests__/NodeParserCode.test.ts"],"names":[],"mappings":""}

View File

@ -0,0 +1 @@
{"version":3,"file":"NodeParserCode.test.js","sourceRoot":"","sources":["../../../src/parser/__tests__/NodeParserCode.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,IAAI,CAAC,8BAA8B,EAAE;IACnC,WAAW,CAAC,+BAA+B,CAAC,CAAC,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1G,WAAW,CAAC,+BAA+B,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACrF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,8BAA8B,EAAE;IACnC,WAAW,CAAC,+BAA+B,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAChG,WAAW,CAAC,+BAA+B,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAClF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yBAAyB,EAAE;IAC9B,WAAW,CAAC,+BAA+B,CACzC;QACE,KAAK;QACL,yCAAyC;QACzC,sBAAsB;QACtB,uBAAuB;QACvB,WAAW;QACX,KAAK;KACN,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACF,WAAW,CAAC,+BAA+B,CACzC;QACE,KAAK;QACL,kEAAkE;QAClE,QAAQ;QACR,uBAAuB;QACvB,UAAU;KACX,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yBAAyB,EAAE;IAC9B,WAAW,CAAC,+BAA+B,CACzC,CAAC,KAAK,EAAE,qCAAqC,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAC9E,CAAC;IACF,WAAW,CAAC,+BAA+B,CACzC,CAAC,KAAK,EAAE,sCAAsC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAC5E,CAAC;IACF,WAAW,CAAC,+BAA+B,CACzC,CAAC,KAAK,EAAE,uCAAuC,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CACxE,CAAC;IACF,WAAW,CAAC,+BAA+B,CACzC,CAAC,KAAK,EAAE,uCAAuC,EAAE,mBAAmB,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CACxF,CAAC;IACF,WAAW,CAAC,+BAA+B,CACzC,CAAC,KAAK,EAAE,+BAA+B,EAAE,uBAAuB,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CACpF,CAAC;IACF,WAAW,CAAC,+BAA+B,CACzC,CAAC,KAAK,EAAE,sCAAsC,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CACtG,CAAC;IACF,WAAW,CAAC,+BAA+B,CACzC;QACE,KAAK;QACL,qDAAqD;QACrD,QAAQ;QACR,SAAS;QACT,WAAW;QACX,KAAK;KACN,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["import { TestHelpers } from './TestHelpers';\r\n\r\ntest('00 Code span basic, positive', () => {\r\n TestHelpers.parseAndMatchNodeParserSnapshot(['/**', ' * line `1`', ' * line ` 2` sdf', ' */'].join('\\n'));\r\n TestHelpers.parseAndMatchNodeParserSnapshot(['/**', ' * M`&`M', ' */'].join('\\n'));\r\n});\r\n\r\ntest('01 Code span basic, negative', () => {\r\n TestHelpers.parseAndMatchNodeParserSnapshot(['/**', ' * `multi', ' * line`', ' */'].join('\\n'));\r\n TestHelpers.parseAndMatchNodeParserSnapshot(['/**', ' * ``', ' */'].join('\\n'));\r\n});\r\n\r\ntest('03 Code fence, positive', () => {\r\n TestHelpers.parseAndMatchNodeParserSnapshot(\r\n [\r\n '/**',\r\n ' * This is a code fence with all parts:',\r\n ' * ```a language! ',\r\n ' * some `code` here',\r\n ' * ``` ',\r\n ' */'\r\n ].join('\\n')\r\n );\r\n TestHelpers.parseAndMatchNodeParserSnapshot(\r\n [\r\n '/**',\r\n ' * This is a code fence with no language or trailing whitespace:',\r\n ' * ```',\r\n ' * some `code` here',\r\n ' * ```*/'\r\n ].join('\\n')\r\n );\r\n});\r\n\r\ntest('04 Code fence, negative', () => {\r\n TestHelpers.parseAndMatchNodeParserSnapshot(\r\n ['/**', ' * Code fence incorrectly indented:', ' * ```', ' */'].join('\\n')\r\n );\r\n TestHelpers.parseAndMatchNodeParserSnapshot(\r\n ['/**', ' * Code fence not starting the line:', ' *a```', ' */'].join('\\n')\r\n );\r\n TestHelpers.parseAndMatchNodeParserSnapshot(\r\n ['/**', ' * Code fence not being terminated 1:', ' * ```*/'].join('\\n')\r\n );\r\n TestHelpers.parseAndMatchNodeParserSnapshot(\r\n ['/**', ' * Code fence not being terminated 2:', ' * ``` some stuff', ' */'].join('\\n')\r\n );\r\n TestHelpers.parseAndMatchNodeParserSnapshot(\r\n ['/**', ' * Language having backticks:', ' * ``` some stuff ```', ' */'].join('\\n')\r\n );\r\n TestHelpers.parseAndMatchNodeParserSnapshot(\r\n ['/**', ' * Closing delimiter being indented:', ' * ```', ' * code', ' * ```', ' */'].join('\\n')\r\n );\r\n TestHelpers.parseAndMatchNodeParserSnapshot(\r\n [\r\n '/**',\r\n ' * Closing delimiter not being on a line by itself:',\r\n ' * ```',\r\n ' * code',\r\n ' * ``` a',\r\n ' */'\r\n ].join('\\n')\r\n );\r\n});\r\n"]}

View File

@ -0,0 +1,2 @@
export {};
//# sourceMappingURL=NodeParserHtml.test.d.ts.map

View File

@ -0,0 +1 @@
{"version":3,"file":"NodeParserHtml.test.d.ts","sourceRoot":"","sources":["../../../src/parser/__tests__/NodeParserHtml.test.ts"],"names":[],"mappings":""}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,2 @@
export {};
//# sourceMappingURL=NodeParserInheritDocTag.test.d.ts.map

View File

@ -0,0 +1 @@
{"version":3,"file":"NodeParserInheritDocTag.test.d.ts","sourceRoot":"","sources":["../../../src/parser/__tests__/NodeParserInheritDocTag.test.ts"],"names":[],"mappings":""}

View File

@ -0,0 +1 @@
{"version":3,"file":"NodeParserInheritDocTag.test.js","sourceRoot":"","sources":["../../../src/parser/__tests__/NodeParserInheritDocTag.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,IAAI,CAAC,sCAAsC,EAAE;IAC3C,WAAW,CAAC,+BAA+B,CAAC,CAAC,KAAK,EAAE,kBAAkB,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3F,WAAW,CAAC,+BAA+B,CAAC,CAAC,KAAK,EAAE,+BAA+B,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACxG,WAAW,CAAC,+BAA+B,CACzC,CAAC,KAAK,EAAE,0CAA0C,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CACtE,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sCAAsC,EAAE;IAC3C,WAAW,CAAC,+BAA+B,CAAC,CAAC,KAAK,EAAE,8BAA8B,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACvG,WAAW,CAAC,+BAA+B,CAAC,CAAC,KAAK,EAAE,+BAA+B,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACxG,WAAW,CAAC,+BAA+B,CACzC,CAAC,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAClE,CAAC;IACF,WAAW,CAAC,+BAA+B,CACzC,CAAC,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,kBAAkB,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAChF,CAAC;IAEF,2BAA2B;IAC3B,WAAW,CAAC,+BAA+B,CACzC,CAAC,KAAK,EAAE,wDAAwD,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CACpF,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["import { TestHelpers } from './TestHelpers';\r\n\r\ntest('00 InheritDoc tag: positive examples', () => {\r\n TestHelpers.parseAndMatchNodeParserSnapshot(['/**', ' * {@inheritDoc}', ' */'].join('\\n'));\r\n TestHelpers.parseAndMatchNodeParserSnapshot(['/**', ' * {@inheritDoc Class.member}', ' */'].join('\\n'));\r\n TestHelpers.parseAndMatchNodeParserSnapshot(\r\n ['/**', ' * {@inheritDoc package# Class . member}', ' */'].join('\\n')\r\n );\r\n});\r\n\r\ntest('01 InheritDoc tag: negative examples', () => {\r\n TestHelpers.parseAndMatchNodeParserSnapshot(['/**', ' * {@inheritDoc | link text}', ' */'].join('\\n'));\r\n TestHelpers.parseAndMatchNodeParserSnapshot(['/**', ' * {@inheritDoc Class % junk}', ' */'].join('\\n'));\r\n TestHelpers.parseAndMatchNodeParserSnapshot(\r\n ['/**', ' * {@inheritDoc}', ' * {@inheritDoc}', ' */'].join('\\n')\r\n );\r\n TestHelpers.parseAndMatchNodeParserSnapshot(\r\n ['/**', ' * summary text', ' * @remarks', ' * {@inheritDoc}', ' */'].join('\\n')\r\n );\r\n\r\n // Old API Extractor syntax\r\n TestHelpers.parseAndMatchNodeParserSnapshot(\r\n ['/**', ' * {@inheritdoc @scope/library:IDisposable.isDisposed}', ' */'].join('\\n')\r\n );\r\n});\r\n"]}

View File

@ -0,0 +1,2 @@
export {};
//# sourceMappingURL=NodeParserLinkTag.test.d.ts.map

View File

@ -0,0 +1 @@
{"version":3,"file":"NodeParserLinkTag.test.d.ts","sourceRoot":"","sources":["../../../src/parser/__tests__/NodeParserLinkTag.test.ts"],"names":[],"mappings":""}

View File

@ -0,0 +1 @@
{"version":3,"file":"NodeParserLinkTag.test.js","sourceRoot":"","sources":["../../../src/parser/__tests__/NodeParserLinkTag.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,IAAI,CAAC,iCAAiC,EAAE;IACtC,WAAW,CAAC,+BAA+B,CACzC;QACE,KAAK;QACL,gCAAgC;QAChC,iCAAiC;QACjC,kCAAkC;QAClC,0CAA0C;QAC1C,sCAAsC;QACtC,YAAY;QACZ,kCAAkC;QAClC,eAAe;QACf,QAAQ;QACR,KAAK;KACN,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iCAAiC,EAAE;IACtC,WAAW,CAAC,+BAA+B,CACzC,CAAC,KAAK,EAAE,YAAY,EAAE,6CAA6C,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CACvF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uCAAuC,EAAE;IAC5C,WAAW,CAAC,+BAA+B,CACzC;QACE,KAAK;QACL,gCAAgC;QAChC,gDAAgD;QAChD,gCAAgC;QAChC,KAAK;KACN,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uCAAuC,EAAE;IAC5C,WAAW,CAAC,+BAA+B,CACzC;QACE,KAAK;QACL,uCAAuC;QACvC,iDAAiD;QACjD,mCAAmC;QACnC,oCAAoC;QACpC,2BAA2B;QAC3B,oBAAoB;QACpB,KAAK;KACN,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+DAA+D,EAAE;IACpE,WAAW,CAAC,+BAA+B,CACzC;QACE,KAAK;QACL,yBAAyB;QACzB,+BAA+B;QAC/B,qCAAqC;QACrC,4CAA4C;QAC5C,gCAAgC;QAChC,KAAK;KACN,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+DAA+D,EAAE;IACpE,WAAW,CAAC,+BAA+B,CACzC;QACE,KAAK;QACL,uBAAuB;QACvB,2BAA2B;QAC3B,6BAA6B;QAC7B,wBAAwB;QACxB,iCAAiC;QACjC,oBAAoB;QACpB,KAAK;KACN,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACF,WAAW,CAAC,+BAA+B,CACzC,CAAC,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,oBAAoB,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CACjF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mEAAmE,EAAE;IACxE,WAAW,CAAC,+BAA+B,CACzC,CAAC,KAAK,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,8BAA8B,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CACzG,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mEAAmE,EAAE;IACxE,WAAW,CAAC,+BAA+B,CACzC,CAAC,KAAK,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAC5E,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["import { TestHelpers } from './TestHelpers';\r\n\r\ntest('00 Link text: positive examples', () => {\r\n TestHelpers.parseAndMatchNodeParserSnapshot(\r\n [\r\n '/**',\r\n ' * {@link http://example1.com}',\r\n ' * {@link http://example2.com|}',\r\n ' * {@link http://example3.com| }',\r\n ' * {@link http://example4.com|link text}',\r\n ' * 1{@link http://example5.com| link',\r\n ' * text }2',\r\n ' * 3{@link http://example5.com| ',\r\n ' * link text ',\r\n ' * }4',\r\n ' */'\r\n ].join('\\n')\r\n );\r\n});\r\n\r\ntest('01 Link text: negative examples', () => {\r\n TestHelpers.parseAndMatchNodeParserSnapshot(\r\n ['/**', ' * {@link}', ' * {@link http://example1.com| link | text}', ' */'].join('\\n')\r\n );\r\n});\r\n\r\ntest('02 URL destination: positive examples', () => {\r\n TestHelpers.parseAndMatchNodeParserSnapshot(\r\n [\r\n '/**',\r\n ' * {@link http://example1.com}',\r\n ' * {@link https://example2.com#hash|link text}',\r\n ' * {@link customscheme://data}',\r\n ' */'\r\n ].join('\\n')\r\n );\r\n});\r\n\r\ntest('03 URL destination: negative examples', () => {\r\n TestHelpers.parseAndMatchNodeParserSnapshot(\r\n [\r\n '/**',\r\n ' * {@link http://example1.com spaces}',\r\n ' * {@link http://example2.com spaces|link text}',\r\n ' * {@link ftp+ssh://example3.com}',\r\n ' * {@link mailto:bob@example4.com}',\r\n ' * {@link //example5.com}',\r\n ' * {@link http://}',\r\n ' */'\r\n ].join('\\n')\r\n );\r\n});\r\n\r\ntest('04 Declaration reference with package name: positive examples', () => {\r\n TestHelpers.parseAndMatchNodeParserSnapshot(\r\n [\r\n '/**',\r\n ' * {@link my-example1#}',\r\n ' * {@link my-example2/path3#}',\r\n ' * {@link my-example4/path5/path6#}',\r\n ' * {@link @scope/my-example7/path8/path9#}',\r\n ' * {@link @scope/my-example7#}',\r\n ' */'\r\n ].join('\\n')\r\n );\r\n});\r\n\r\ntest('05 Declaration reference with package name: negative examples', () => {\r\n TestHelpers.parseAndMatchNodeParserSnapshot(\r\n [\r\n '/**',\r\n ' * {@link example1/#}',\r\n ' * {@link example2/a//b#}',\r\n ' * {@link @scope/ex@mple3#}',\r\n ' * {@link @/example4#}',\r\n ' * {@link @scope//my-example5#}',\r\n ' * {@link @scope#}',\r\n ' */'\r\n ].join('\\n')\r\n );\r\n TestHelpers.parseAndMatchNodeParserSnapshot(\r\n ['/**', ' * {@link @#}', ' * {@link #}', ' * {@link #Button}', ' */'].join('\\n')\r\n );\r\n});\r\n\r\ntest('06 Declaration reference with import path only: positive examples', () => {\r\n TestHelpers.parseAndMatchNodeParserSnapshot(\r\n ['/**', ' * {@link ../path1#}', ' * {@link ./path2#}', ' * {@link ./path3/../path4#}', ' */'].join('\\n')\r\n );\r\n});\r\n\r\ntest('07 Declaration reference with import path only: negative examples', () => {\r\n TestHelpers.parseAndMatchNodeParserSnapshot(\r\n ['/**', ' * {@link /path1#}', ' * {@link /path1 path2#}', ' */'].join('\\n')\r\n );\r\n});\r\n"]}

View File

@ -0,0 +1,2 @@
export {};
//# sourceMappingURL=NodeParserLinkTag2.test.d.ts.map

View File

@ -0,0 +1 @@
{"version":3,"file":"NodeParserLinkTag2.test.d.ts","sourceRoot":"","sources":["../../../src/parser/__tests__/NodeParserLinkTag2.test.ts"],"names":[],"mappings":""}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,2 @@
export {};
//# sourceMappingURL=NodeParserLinkTag3.test.d.ts.map

View File

@ -0,0 +1 @@
{"version":3,"file":"NodeParserLinkTag3.test.d.ts","sourceRoot":"","sources":["../../../src/parser/__tests__/NodeParserLinkTag3.test.ts"],"names":[],"mappings":""}

View File

@ -0,0 +1 @@
{"version":3,"file":"NodeParserLinkTag3.test.js","sourceRoot":"","sources":["../../../src/parser/__tests__/NodeParserLinkTag3.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,IAAI,CAAC,yCAAyC,EAAE;IAC9C,WAAW,CAAC,+BAA+B,CACzC;QACE,KAAK;QACL,wDAAwD;QACxD,sFAAsF;QACtF,KAAK;KACN,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yCAAyC,EAAE;IAC9C,WAAW,CAAC,+BAA+B,CACzC,CAAC,KAAK,EAAE,uDAAuD,EAAE,sBAAsB,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAC3G,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yBAAyB,EAAE;IAC9B,WAAW,CAAC,+BAA+B,CACzC;QACE,KAAK;QACL,qGAAqG;QACrG,KAAK;KACN,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["import { TestHelpers } from './TestHelpers';\r\n\r\ntest('00 Symbol references: positive examples', () => {\r\n TestHelpers.parseAndMatchNodeParserSnapshot(\r\n [\r\n '/**',\r\n ' * {@link Class1.[WellknownSymbols.toStringPrimitive]}',\r\n ' * {@link Class1 . ( [ WellknownSymbols . toStringPrimitive ] : static) | link text}',\r\n ' */'\r\n ].join('\\n')\r\n );\r\n});\r\n\r\ntest('01 Symbol references: negative examples', () => {\r\n TestHelpers.parseAndMatchNodeParserSnapshot(\r\n ['/**', ' * {@link Class1.[WellknownSymbols.toStringPrimitive}', ' * {@link Class1.[]}', ' */'].join('\\n')\r\n );\r\n});\r\n\r\ntest('02 Complicated examples', () => {\r\n TestHelpers.parseAndMatchNodeParserSnapshot(\r\n [\r\n '/**',\r\n ' * {@link ./lib/controls/Button#Button.([(WellknownSymbols:namespace).toStringPrimitive]:instance)}',\r\n ' */'\r\n ].join('\\n')\r\n );\r\n});\r\n"]}

View File

@ -0,0 +1,2 @@
export {};
//# sourceMappingURL=NodeParserTags.test.d.ts.map

View File

@ -0,0 +1 @@
{"version":3,"file":"NodeParserTags.test.d.ts","sourceRoot":"","sources":["../../../src/parser/__tests__/NodeParserTags.test.ts"],"names":[],"mappings":""}

View File

@ -0,0 +1 @@
{"version":3,"file":"NodeParserTags.test.js","sourceRoot":"","sources":["../../../src/parser/__tests__/NodeParserTags.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,IAAI,CAAC,kCAAkC,EAAE;IACvC,WAAW,CAAC,+BAA+B,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAChG,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kCAAkC,EAAE;IACvC,WAAW,CAAC,+BAA+B,CACzC,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CACjE,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kCAAkC,EAAE;IACvC,WAAW,CAAC,+BAA+B,CACzC,CAAC,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,qBAAqB,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CACvG,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kCAAkC,EAAE;IACvC,WAAW,CAAC,+BAA+B,CACzC,CAAC,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CACtF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mCAAmC,EAAE;IACxC,WAAW,CAAC,+BAA+B,CACzC,CAAC,KAAK,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAClF,CAAC;IACF,WAAW,CAAC,+BAA+B,CAAC,CAAC,KAAK,EAAE,sBAAsB,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACjG,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,oCAAoC,EAAE;IACzC,WAAW,CAAC,+BAA+B,CACzC,CAAC,KAAK,EAAE,8CAA8C,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAC1E,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,oCAAoC,EAAE;IACzC,WAAW,CAAC,+BAA+B,CAAC,CAAC,KAAK,EAAE,mBAAmB,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5F,WAAW,CAAC,+BAA+B,CAAC,CAAC,KAAK,EAAE,mBAAmB,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5F,WAAW,CAAC,+BAA+B,CAAC,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACxF,CAAC,CAAC,CAAC","sourcesContent":["import { TestHelpers } from './TestHelpers';\r\n\r\ntest('00 Block tags: positive examples', () => {\r\n TestHelpers.parseAndMatchNodeParserSnapshot(['/**', ' * @one ', ' * @two', ' */'].join('\\n'));\r\n});\r\n\r\ntest('01 Block tags: negative examples', () => {\r\n TestHelpers.parseAndMatchNodeParserSnapshot(\r\n ['/**', ' * @ one ', ' * +@two ', ' * @two+ ', ' */'].join('\\n')\r\n );\r\n});\r\n\r\ntest('02 Inline tags: simple, positive', () => {\r\n TestHelpers.parseAndMatchNodeParserSnapshot(\r\n ['/**', ' * {@one} ', ' * {@two } ', ' * {@three}{@four} ', ' * {@five ', ' * } ', ' */'].join('\\n')\r\n );\r\n});\r\n\r\ntest('03 Inline tags: simple, negative', () => {\r\n TestHelpers.parseAndMatchNodeParserSnapshot(\r\n ['/**', ' * {@ one} ', ' * {@two~} ', ' * { @three} ', ' * {@four', ' */'].join('\\n')\r\n );\r\n});\r\n\r\ntest('04 Inline tags: complex, positive', () => {\r\n TestHelpers.parseAndMatchNodeParserSnapshot(\r\n ['/**', ' * {@one some content}', ' * {@two multi', ' * line}', ' */'].join('\\n')\r\n );\r\n TestHelpers.parseAndMatchNodeParserSnapshot(['/**', ' * {@three @taglike}', ' */'].join('\\n'));\r\n});\r\n\r\ntest('05 Inline tags: escaping, positive', () => {\r\n TestHelpers.parseAndMatchNodeParserSnapshot(\r\n ['/**', ' * {@one left \\\\{ right \\\\} backslash \\\\\\\\ }', ' */'].join('\\n')\r\n );\r\n});\r\n\r\ntest('06 Inline tags: escaping, negative', () => {\r\n TestHelpers.parseAndMatchNodeParserSnapshot(['/**', ' * {@one curly\\\\}', ' */'].join('\\n'));\r\n TestHelpers.parseAndMatchNodeParserSnapshot(['/**', ' * {@two curly{}}', ' */'].join('\\n'));\r\n TestHelpers.parseAndMatchNodeParserSnapshot(['/**', ' * three: }', ' */'].join('\\n'));\r\n});\r\n"]}

View File

@ -0,0 +1,2 @@
export {};
//# sourceMappingURL=NodeParserValidationChecks.test.d.ts.map

View File

@ -0,0 +1 @@
{"version":3,"file":"NodeParserValidationChecks.test.d.ts","sourceRoot":"","sources":["../../../src/parser/__tests__/NodeParserValidationChecks.test.ts"],"names":[],"mappings":""}

View File

@ -0,0 +1 @@
{"version":3,"file":"NodeParserValidationChecks.test.js","sourceRoot":"","sources":["../../../src/parser/__tests__/NodeParserValidationChecks.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,IAAI,CAAC,oCAAoC,EAAE;IACzC,WAAW,CAAC,+BAA+B,CACzC,CAAC,KAAK,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CACtE,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,oCAAoC,EAAE;IACzC,WAAW,CAAC,+BAA+B,CACzC,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CACjE,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["import { TestHelpers } from './TestHelpers';\r\n\r\ntest('00 Deprecated block: positive test', () => {\r\n TestHelpers.parseAndMatchNodeParserSnapshot(\r\n ['/**', ' * @deprecated', ' * Use the other thing', ' */'].join('\\n')\r\n );\r\n});\r\n\r\ntest('01 Deprecated block: negative test', () => {\r\n TestHelpers.parseAndMatchNodeParserSnapshot(\r\n ['/**', ' * @deprecated', ' * ', ' * @public', ' */'].join('\\n')\r\n );\r\n});\r\n"]}

View File

@ -0,0 +1,39 @@
import { TextRange } from '../TextRange';
import { DocNode } from '../../nodes';
import { ParserContext } from '../ParserContext';
import { TSDocConfiguration } from '../../configuration/TSDocConfiguration';
interface ISnapshotItem {
kind: string;
errorMessage?: string;
errorLocation?: string;
errorLocationPrecedingToken?: string;
nodeExcerpt?: string;
nodeSpacing?: string;
nodePlainText?: string;
nodes?: ISnapshotItem[];
}
export declare class TestHelpers {
/**
* Pretty print a line with "<" and ">" markers to indicate a text range.
*/
static formatLineSpan(line: TextRange, range: TextRange): string;
/**
* Workaround various characters that get ugly escapes in Jest snapshots
*/
static getEscaped(s: string): string;
/**
* Main harness for tests under `./parser/*`.
*/
static parseAndMatchNodeParserSnapshot(buffer: string, config?: TSDocConfiguration): void;
/**
* Main harness for tests under `./details/*`.
*/
static parseAndMatchDocCommentSnapshot(buffer: string, configuration?: TSDocConfiguration): ParserContext;
/**
* Render a nice Jest snapshot object for a DocNode tree.
*/
static getDocNodeSnapshot(docNode: DocNode | undefined): ISnapshotItem | undefined;
private static _getTokenCoverageGapsSnapshot;
}
export {};
//# sourceMappingURL=TestHelpers.d.ts.map

View File

@ -0,0 +1 @@
{"version":3,"file":"TestHelpers.d.ts","sourceRoot":"","sources":["../../../src/parser/__tests__/TestHelpers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAgB,OAAO,EAAwC,MAAM,aAAa,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAG5E,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IAIrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,aAAa,EAAE,CAAC;CACzB;AAED,qBAAa,WAAW;IACtB;;OAEG;WACW,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,GAAG,MAAM;IAsCvE;;OAEG;WACW,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAa3C;;OAEG;WACW,+BAA+B,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,IAAI;IAoBhG;;OAEG;WACW,+BAA+B,CAC3C,MAAM,EAAE,MAAM,EACd,aAAa,CAAC,EAAE,kBAAkB,GACjC,aAAa;IAwBhB;;OAEG;WACW,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS;IAyCzF,OAAO,CAAC,MAAM,CAAC,6BAA6B;CAI7C"}

View File

@ -0,0 +1,144 @@
import { TSDocParser } from '../TSDocParser';
import { DocErrorText, DocPlainText, DocExcerpt } from '../../nodes';
import { TSDocConfiguration } from '../../configuration/TSDocConfiguration';
import { TokenCoverageChecker } from './TokenCoverageChecker';
var TestHelpers = /** @class */ (function () {
function TestHelpers() {
}
/**
* Pretty print a line with "<" and ">" markers to indicate a text range.
*/
TestHelpers.formatLineSpan = function (line, range) {
if (range.pos < line.pos || range.end > line.end) {
throw new Error('Range must fall within the associated line');
}
var paddedSpace = ['', ' ', ' ', ' ', ' '];
var paddedLArrow = ['', '>', ' >', ' >', ' >'];
var paddedRArrow = ['', '<', '< ', '< ', '< '];
var buffer = line.buffer;
var span = '';
if (line.end > 0) {
var i = line.pos - 1;
while (i < range.pos - 1) {
span += paddedSpace[TestHelpers.getEscaped(buffer[i]).length];
++i;
}
span += paddedLArrow[TestHelpers.getEscaped(buffer[i]).length];
++i;
while (i < range.end) {
span += paddedSpace[TestHelpers.getEscaped(buffer[i]).length];
++i;
}
if (i === line.end) {
span += '<';
}
else {
span += paddedRArrow[TestHelpers.getEscaped(buffer[i]).length];
++i;
while (i < line.end) {
span += paddedSpace[TestHelpers.getEscaped(buffer[i]).length];
++i;
}
}
}
return span;
};
/**
* Workaround various characters that get ugly escapes in Jest snapshots
*/
TestHelpers.getEscaped = function (s) {
return s
.replace(/\n/g, '[n]')
.replace(/\r/g, '[r]')
.replace(/\t/g, '[t]')
.replace(/\f/g, '[f]')
.replace(/\\/g, '[b]')
.replace(/\"/g, '[q]')
.replace(/`/g, '[c]')
.replace(/\</g, '[<]')
.replace(/\>/g, '[>]');
};
/**
* Main harness for tests under `./parser/*`.
*/
TestHelpers.parseAndMatchNodeParserSnapshot = function (buffer, config) {
var configuration = config !== null && config !== void 0 ? config : new TSDocConfiguration();
// For the parser tests, we use lots of custom tags without bothering to define them
configuration.validation.ignoreUndefinedTags = true;
var tsdocParser = new TSDocParser(configuration);
var parserContext = tsdocParser.parseString(buffer);
expect({
buffer: TestHelpers.getEscaped(buffer),
lines: parserContext.lines.map(function (x) { return TestHelpers.getEscaped(x.toString()); }),
logMessages: parserContext.log.messages.map(function (message) { return message.text; }),
nodes: TestHelpers.getDocNodeSnapshot(parserContext.docComment),
gaps: this._getTokenCoverageGapsSnapshot(parserContext)
}).toMatchSnapshot();
TestHelpers._getTokenCoverageGapsSnapshot(parserContext);
};
/**
* Main harness for tests under `./details/*`.
*/
TestHelpers.parseAndMatchDocCommentSnapshot = function (buffer, configuration) {
var tsdocParser = new TSDocParser(configuration);
var parserContext = tsdocParser.parseString(buffer);
var docComment = parserContext.docComment;
expect({
s00_lines: parserContext.lines.map(function (x) { return TestHelpers.getEscaped(x.toString()); }),
s01_gaps: this._getTokenCoverageGapsSnapshot(parserContext),
s02_summarySection: TestHelpers.getDocNodeSnapshot(docComment.summarySection),
s03_remarksBlock: TestHelpers.getDocNodeSnapshot(docComment.remarksBlock),
s04_privateRemarksBlock: TestHelpers.getDocNodeSnapshot(docComment.privateRemarks),
s05_deprecatedBlock: TestHelpers.getDocNodeSnapshot(docComment.deprecatedBlock),
s06_paramBlocks: docComment.params.blocks.map(function (x) { return TestHelpers.getDocNodeSnapshot(x); }),
s07_typeParamBlocks: docComment.typeParams.blocks.map(function (x) { return TestHelpers.getDocNodeSnapshot(x); }),
s08_returnsBlock: TestHelpers.getDocNodeSnapshot(docComment.returnsBlock),
s09_customBlocks: docComment.customBlocks.map(function (x) { return TestHelpers.getDocNodeSnapshot(x); }),
s10_inheritDocTag: TestHelpers.getDocNodeSnapshot(docComment.inheritDocTag),
s11_modifierTags: docComment.modifierTagSet.nodes.map(function (x) { return TestHelpers.getDocNodeSnapshot(x); }),
s12_logMessages: parserContext.log.messages.map(function (message) { return message.text; })
}).toMatchSnapshot();
return parserContext;
};
/**
* Render a nice Jest snapshot object for a DocNode tree.
*/
TestHelpers.getDocNodeSnapshot = function (docNode) {
if (!docNode) {
return undefined;
}
var item = {
kind: docNode.kind
};
if (docNode instanceof DocExcerpt) {
item.kind += ': ' + docNode.excerptKind;
item.nodeExcerpt = TestHelpers.getEscaped(docNode.content.toString());
}
if (docNode instanceof DocPlainText) {
var docPlainText = docNode;
if (docPlainText.textExcerpt === undefined) {
item.nodePlainText = TestHelpers.getEscaped(docPlainText.text);
}
}
if (docNode instanceof DocErrorText) {
item.errorMessage = TestHelpers.getEscaped(docNode.errorMessage);
item.errorLocation = TestHelpers.getEscaped(docNode.errorLocation.toString());
if (docNode.errorLocation.startIndex > 0) {
// Show the preceding token to provide some context (e.g. is this the opening quote
// or closing quote?)
item.errorLocationPrecedingToken = docNode.errorLocation.parserContext.tokens[docNode.errorLocation.startIndex - 1].toString();
}
}
if (docNode.getChildNodes().length > 0) {
item.nodes = docNode.getChildNodes().map(function (x) { return TestHelpers.getDocNodeSnapshot(x); });
}
return item;
};
TestHelpers._getTokenCoverageGapsSnapshot = function (parserContext) {
var tokenCoverageChecker = new TokenCoverageChecker(parserContext);
return tokenCoverageChecker.getGaps(parserContext.docComment).map(function (x) { return x.toString(); });
};
return TestHelpers;
}());
export { TestHelpers };
//# sourceMappingURL=TestHelpers.js.map

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,2 @@
export {};
//# sourceMappingURL=TextRange.test.d.ts.map

View File

@ -0,0 +1 @@
{"version":3,"file":"TextRange.test.d.ts","sourceRoot":"","sources":["../../../src/parser/__tests__/TextRange.test.ts"],"names":[],"mappings":""}

View File

@ -0,0 +1 @@
{"version":3,"file":"TextRange.test.js","sourceRoot":"","sources":["../../../src/parser/__tests__/TextRange.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,SAAS,aAAa,CAAC,SAAoB;IACzC,KAAK,IAAI,CAAC,GAAW,CAAC,CAAC,EAAE,CAAC,IAAI,SAAS,CAAC,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE;QACpD,6BAA6B;QAC7B,IAAM,CAAC,GAAW,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAErF,yCAAyC;QACzC,IAAM,OAAO,GAAW,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAE5F,MAAM,CAAC;YACL,CAAC,EAAE,CAAC;YACJ,OAAO,EAAE,OAAO;YAChB,CAAC,EAAE,CAAC;YACJ,QAAQ,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;SACnC,CAAC,CAAC,eAAe,EAAE,CAAC;KACtB;AACH,CAAC;AAED,IAAI,CAAC,wBAAwB,EAAE;IAC7B,IAAM,MAAM,GAAW,YAAY,CAAC;IACpC,IAAM,SAAS,GAAc,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC1D,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAE7C,IAAM,QAAQ,GAAc,SAAS,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxD,MAAM,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;AAC/C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qBAAqB,EAAE;IAC1B,IAAM,SAAS,GAAc,SAAS,CAAC,UAAU,CAC/C;QACE,IAAI;QACJ,IAAI;QACJ,EAAE;QACF,IAAI;QACJ,iCAAiC;KAClC,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACF,aAAa,CAAC,SAAS,CAAC,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,4BAA4B,EAAE;IACjC,IAAM,SAAS,GAAc,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACtD,aAAa,CAAC,SAAS,CAAC,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yBAAyB,EAAE;IAC9B,IAAM,SAAS,GAAc,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACxD,aAAa,CAAC,SAAS,CAAC,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yBAAyB,EAAE;IAC9B,IAAM,SAAS,GAAc,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACxD,aAAa,CAAC,SAAS,CAAC,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,8BAA8B,EAAE;IACnC,4CAA4C;IAC5C,IAAM,SAAS,GAAc,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC1D,aAAa,CAAC,SAAS,CAAC,CAAC;AAC3B,CAAC,CAAC,CAAC","sourcesContent":["import { TextRange } from '../TextRange';\r\nimport { TestHelpers } from './TestHelpers';\r\n\r\nfunction matchSnapshot(textRange: TextRange): void {\r\n for (let i: number = -1; i <= textRange.end + 1; ++i) {\r\n // Show the current character\r\n const c: string = TestHelpers.getEscaped(textRange.buffer.substr(Math.max(i, 0), 1));\r\n\r\n // Show the next 10 characters of context\r\n const context: string = TestHelpers.getEscaped(textRange.buffer.substr(Math.max(i, 0), 10));\r\n\r\n expect({\r\n c: c,\r\n context: context,\r\n i: i,\r\n location: textRange.getLocation(i)\r\n }).toMatchSnapshot();\r\n }\r\n}\r\n\r\ntest('construction scenarios', () => {\r\n const buffer: string = '0123456789';\r\n const textRange: TextRange = TextRange.fromString(buffer);\r\n expect(textRange.toString()).toEqual(buffer);\r\n\r\n const subRange: TextRange = textRange.getNewRange(3, 6);\r\n expect(subRange).toMatchSnapshot('subRange');\r\n});\r\n\r\ntest('getLocation() basic', () => {\r\n const textRange: TextRange = TextRange.fromString(\r\n [\r\n 'L1',\r\n 'L2',\r\n '', // (line 3 is blank)\r\n 'L4',\r\n 'L5+CR\\rL5+CRLF\\r\\nL6+LFCR\\n\\rL7'\r\n ].join('\\n')\r\n );\r\n matchSnapshot(textRange);\r\n});\r\n\r\ntest('getLocation() empty string', () => {\r\n const textRange: TextRange = TextRange.fromString('');\r\n matchSnapshot(textRange);\r\n});\r\n\r\ntest('getLocation() CR string', () => {\r\n const textRange: TextRange = TextRange.fromString('\\r');\r\n matchSnapshot(textRange);\r\n});\r\n\r\ntest('getLocation() LF string', () => {\r\n const textRange: TextRange = TextRange.fromString('\\n');\r\n matchSnapshot(textRange);\r\n});\r\n\r\ntest('getLocation() tab characters', () => {\r\n // Tab character advances by only one column\r\n const textRange: TextRange = TextRange.fromString('1\\t3');\r\n matchSnapshot(textRange);\r\n});\r\n"]}

View File

@ -0,0 +1,28 @@
import { DocNode } from '../../nodes';
import { TokenSequence } from '../TokenSequence';
import { ParserContext } from '../ParserContext';
/**
* The TokenCoverageChecker performs two diagnostics to detect parser bugs:
* 1. It checks for two DocNode objects whose excerpt contains overlapping tokens.
* By design, a single character from the input stream should be associated with
* at most one TokenSequence.
* 2. It checks for gaps, i.e. input tokens that were not associated with any DocNode
* (that is reachable from the final DocCommon node tree). In some cases this is
* okay. For example, if `@public` appears twice inside a comment, the second
* redundant instance is ignored. But in general we want to track the gaps in the
* unit test snapshots to ensure in general that every input character is associated
* with an excerpt for a DocNode.
*/
export declare class TokenCoverageChecker {
private readonly _parserContext;
private readonly _tokenAssociations;
constructor(parserContext: ParserContext);
getGaps(rootNode: DocNode): TokenSequence[];
reportGaps(rootNode: DocNode): void;
private _addNodeTree;
private _addSequence;
private _checkForGaps;
private _reportGap;
private _formatTokenAssociation;
}
//# sourceMappingURL=TokenCoverageChecker.d.ts.map

View File

@ -0,0 +1 @@
{"version":3,"file":"TokenCoverageChecker.d.ts","sourceRoot":"","sources":["../../../src/parser/__tests__/TokenCoverageChecker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAc,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAQjD;;;;;;;;;;;GAWG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAC/C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAoC;gBAEpD,aAAa,EAAE,aAAa;IAMxC,OAAO,CAAC,QAAQ,EAAE,OAAO,GAAG,aAAa,EAAE;IAK3C,UAAU,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI;IAK1C,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,YAAY;IAiBpB,OAAO,CAAC,aAAa;IAyDrB,OAAO,CAAC,UAAU;IAmBlB,OAAO,CAAC,uBAAuB;CAGhC"}

View File

@ -0,0 +1,118 @@
import { DocExcerpt } from '../../nodes';
import { TokenSequence } from '../TokenSequence';
import { TokenKind } from '../Token';
/**
* The TokenCoverageChecker performs two diagnostics to detect parser bugs:
* 1. It checks for two DocNode objects whose excerpt contains overlapping tokens.
* By design, a single character from the input stream should be associated with
* at most one TokenSequence.
* 2. It checks for gaps, i.e. input tokens that were not associated with any DocNode
* (that is reachable from the final DocCommon node tree). In some cases this is
* okay. For example, if `@public` appears twice inside a comment, the second
* redundant instance is ignored. But in general we want to track the gaps in the
* unit test snapshots to ensure in general that every input character is associated
* with an excerpt for a DocNode.
*/
var TokenCoverageChecker = /** @class */ (function () {
function TokenCoverageChecker(parserContext) {
this._parserContext = parserContext;
this._tokenAssociations = [];
this._tokenAssociations.length = parserContext.tokens.length;
}
TokenCoverageChecker.prototype.getGaps = function (rootNode) {
this._addNodeTree(rootNode);
return this._checkForGaps(false);
};
TokenCoverageChecker.prototype.reportGaps = function (rootNode) {
this._addNodeTree(rootNode);
this._checkForGaps(true);
};
TokenCoverageChecker.prototype._addNodeTree = function (node) {
if (node instanceof DocExcerpt) {
this._addSequence(node.content, node);
}
for (var _i = 0, _a = node.getChildNodes(); _i < _a.length; _i++) {
var childNode = _a[_i];
this._addNodeTree(childNode);
}
};
TokenCoverageChecker.prototype._addSequence = function (tokenSequence, docNode) {
var newTokenAssociation = { docNode: docNode, tokenSequence: tokenSequence };
for (var i = tokenSequence.startIndex; i < tokenSequence.endIndex; ++i) {
var tokenAssociation = this._tokenAssociations[i];
if (tokenAssociation) {
throw new Error("Overlapping content encountered between" +
(" " + this._formatTokenAssociation(tokenAssociation) + " and") +
(" " + this._formatTokenAssociation(newTokenAssociation)));
}
this._tokenAssociations[i] = newTokenAssociation;
}
};
TokenCoverageChecker.prototype._checkForGaps = function (reportGaps) {
var gaps = [];
var gapStartIndex = undefined;
var tokenAssociationBeforeGap = undefined;
var tokens = this._parserContext.tokens;
if (tokens[tokens.length - 1].kind !== TokenKind.EndOfInput) {
throw new Error('Missing EndOfInput token');
}
for (var i = 0; i < this._parserContext.tokens.length - 1; ++i) {
var tokenAssociation = this._tokenAssociations[i];
if (gapStartIndex === undefined) {
// No gap found yet
if (tokenAssociation) {
tokenAssociationBeforeGap = tokenAssociation;
}
else {
// We found the start of a gap
gapStartIndex = i;
}
}
else {
// Is this the end of the gap?
if (tokenAssociation) {
var gap = new TokenSequence({
parserContext: this._parserContext,
startIndex: gapStartIndex,
endIndex: i
});
if (reportGaps) {
this._reportGap(gap, tokenAssociationBeforeGap, tokenAssociation);
}
gaps.push(gap);
gapStartIndex = undefined;
tokenAssociationBeforeGap = undefined;
}
}
}
if (gapStartIndex) {
var gap = new TokenSequence({
parserContext: this._parserContext,
startIndex: gapStartIndex,
endIndex: this._parserContext.tokens.length
});
if (reportGaps) {
this._reportGap(gap, tokenAssociationBeforeGap, undefined);
}
gaps.push(gap);
}
return gaps;
};
TokenCoverageChecker.prototype._reportGap = function (gap, tokenAssociationBeforeGap, tokenAssociationAfterGap) {
var message = 'Gap encountered';
if (tokenAssociationBeforeGap) {
message += ' before ' + this._formatTokenAssociation(tokenAssociationBeforeGap);
}
if (tokenAssociationAfterGap) {
message += ' after ' + this._formatTokenAssociation(tokenAssociationAfterGap);
}
message += ': ' + JSON.stringify(gap.toString());
throw new Error(message);
};
TokenCoverageChecker.prototype._formatTokenAssociation = function (tokenAssociation) {
return tokenAssociation.docNode.kind + " (" + JSON.stringify(tokenAssociation.tokenSequence.toString()) + ")";
};
return TokenCoverageChecker;
}());
export { TokenCoverageChecker };
//# sourceMappingURL=TokenCoverageChecker.js.map

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,2 @@
export {};
//# sourceMappingURL=Tokenizer.test.d.ts.map

View File

@ -0,0 +1 @@
{"version":3,"file":"Tokenizer.test.d.ts","sourceRoot":"","sources":["../../../src/parser/__tests__/Tokenizer.test.ts"],"names":[],"mappings":""}

File diff suppressed because one or more lines are too long