jsii-rosetta 5.4.32-dev.2 → 5.5.0
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +2 -2
- package/lib/commands/convert.js +1 -2
- package/lib/commands/convert.js.map +1 -1
- package/lib/commands/coverage.js +1 -2
- package/lib/commands/coverage.js.map +1 -1
- package/lib/commands/extract.js +2 -3
- package/lib/commands/extract.js.map +1 -1
- package/lib/commands/infuse.js +2 -2
- package/lib/commands/infuse.js.map +1 -1
- package/lib/commands/read.js +1 -2
- package/lib/commands/read.js.map +1 -1
- package/lib/commands/transliterate.js +1 -2
- package/lib/commands/transliterate.js.map +1 -1
- package/lib/commands/trim-cache.js +1 -2
- package/lib/commands/trim-cache.js.map +1 -1
- package/lib/find-utils.js +4 -5
- package/lib/find-utils.js.map +1 -1
- package/lib/fixtures.js +1 -2
- package/lib/fixtures.js.map +1 -1
- package/lib/jsii/assemblies.js +9 -9
- package/lib/jsii/assemblies.js.map +1 -1
- package/lib/jsii/jsii-types.js +2 -3
- package/lib/jsii/jsii-types.js.map +1 -1
- package/lib/jsii/jsii-utils.js +15 -16
- package/lib/jsii/jsii-utils.js.map +1 -1
- package/lib/jsii/packages.js +1 -2
- package/lib/jsii/packages.js.map +1 -1
- package/lib/json.d.ts +0 -2
- package/lib/json.js +2 -3
- package/lib/json.js.map +1 -1
- package/lib/languages/target-language.js +3 -3
- package/lib/languages/target-language.js.map +1 -1
- package/lib/logging.js +6 -6
- package/lib/logging.js.map +1 -1
- package/lib/markdown/escapes.js +2 -3
- package/lib/markdown/escapes.js.map +1 -1
- package/lib/markdown/extract-snippets.js +1 -2
- package/lib/markdown/extract-snippets.js.map +1 -1
- package/lib/markdown/index.js +3 -4
- package/lib/markdown/index.js.map +1 -1
- package/lib/markdown/markdown-renderer.js +5 -5
- package/lib/markdown/markdown-renderer.js.map +1 -1
- package/lib/markdown/markdown.js +5 -6
- package/lib/markdown/markdown.js.map +1 -1
- package/lib/o-tree.js +2 -2
- package/lib/o-tree.js.map +1 -1
- package/lib/renderer.js +3 -2
- package/lib/renderer.js.map +1 -1
- package/lib/rosetta-reader.d.ts +0 -1
- package/lib/snippet-dependencies.js +5 -6
- package/lib/snippet-dependencies.js.map +1 -1
- package/lib/snippet-selectors.js +4 -5
- package/lib/snippet-selectors.js.map +1 -1
- package/lib/snippet.js +11 -11
- package/lib/snippet.js.map +1 -1
- package/lib/strict.js +1 -2
- package/lib/strict.js.map +1 -1
- package/lib/support.js +1 -2
- package/lib/support.js.map +1 -1
- package/lib/tablets/key.js +1 -2
- package/lib/tablets/key.js.map +1 -1
- package/lib/translate.js +4 -4
- package/lib/translate.js.map +1 -1
- package/lib/translate_all.js +1 -2
- package/lib/translate_all.js.map +1 -1
- package/lib/translate_all_worker.js +1 -2
- package/lib/translate_all_worker.js.map +1 -1
- package/lib/typescript/ast-utils.d.ts +1 -1
- package/lib/typescript/ast-utils.js +23 -23
- package/lib/typescript/ast-utils.js.map +1 -1
- package/lib/typescript/imports.d.ts +2 -2
- package/lib/typescript/imports.js +2 -3
- package/lib/typescript/imports.js.map +1 -1
- package/lib/typescript/types.js +16 -17
- package/lib/typescript/types.js.map +1 -1
- package/lib/typescript/visible-spans.js +4 -4
- package/lib/typescript/visible-spans.js.map +1 -1
- package/lib/util.d.ts +0 -1
- package/lib/util.js +19 -19
- package/lib/util.js.map +1 -1
- package/package.json +4 -4
- package/releases.json +4 -3
package/lib/markdown/escapes.js
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.
|
3
|
+
exports.makeXmlEscaper = makeXmlEscaper;
|
4
|
+
exports.makeJavaEscaper = makeJavaEscaper;
|
4
5
|
/**
|
5
6
|
* Make a generic XML escaper
|
6
7
|
*/
|
@@ -12,7 +13,6 @@ function makeXmlEscaper() {
|
|
12
13
|
text2attr: (x) => escapeText(ATTR_ADDL, x),
|
13
14
|
};
|
14
15
|
}
|
15
|
-
exports.makeXmlEscaper = makeXmlEscaper;
|
16
16
|
/**
|
17
17
|
* Make a Java specific escaper
|
18
18
|
*
|
@@ -28,7 +28,6 @@ function makeJavaEscaper() {
|
|
28
28
|
text2attr: (x) => escapeText(ATTR_ADDL, x),
|
29
29
|
};
|
30
30
|
}
|
31
|
-
exports.makeJavaEscaper = makeJavaEscaper;
|
32
31
|
const TEXT = [
|
33
32
|
[new RegExp('&', 'g'), '&'],
|
34
33
|
[new RegExp('<', 'g'), '<'],
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"escapes.js","sourceRoot":"","sources":["../../src/markdown/escapes.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"escapes.js","sourceRoot":"","sources":["../../src/markdown/escapes.ts"],"names":[],"mappings":";;AAuBA,wCAQC;AAQD,0CASC;AA5BD;;GAEG;AACH,SAAgB,cAAc;IAC5B,MAAM,IAAI,GAAY,CAAC,GAAG,IAAI,EAAE,GAAG,SAAS,CAAC,CAAC;IAE9C,OAAO;QACL,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;QAChC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;QACrC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC;KAC3C,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAgB,eAAe;IAC7B,MAAM,QAAQ,GAAY,CAAC,GAAG,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAY,CAAC,GAAG,QAAQ,EAAE,GAAG,SAAS,CAAC,CAAC;IAEtD,OAAO;QACL,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;QACpC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;QACzC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC;KAC3C,CAAC;AACJ,CAAC;AAID,MAAM,IAAI,GAAY;IACpB,CAAC,IAAI,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IAC/B,CAAC,IAAI,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAC9B,CAAC,IAAI,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF,mGAAmG;AACnG,MAAM,SAAS,GAAY;IACzB,CAAC,IAAI,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC;IAChC,CAAC,IAAI,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC;CACjC,CAAC;AAEF,SAAS,UAAU,CAAC,GAAY,EAAE,IAAmB;IACnD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;QAC7B,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["export interface Escaper {\n /**\n * Escape for use in XML/HTML text\n */\n text(x: string | null): string;\n\n /**\n * Escape for use in XML/HTML attributes\n */\n attribute(x: string | null): string;\n\n /**\n * Re-escape a string that has been escaped for text to be escaped for attributes\n *\n * Conceptually this unescapes text back to raw and re-escapes for attributes,\n * but for speed in practice we just do the additional escapes.\n */\n text2attr(x: string | null): string;\n}\n\n/**\n * Make a generic XML escaper\n */\nexport function makeXmlEscaper(): Escaper {\n const attr: Escapes = [...TEXT, ...ATTR_ADDL];\n\n return {\n text: (x) => escapeText(TEXT, x),\n attribute: (x) => escapeText(attr, x),\n text2attr: (x) => escapeText(ATTR_ADDL, x),\n };\n}\n\n/**\n * Make a Java specific escaper\n *\n * This one also escapes '@' because that triggers parsing of comment directives\n * in Java.\n */\nexport function makeJavaEscaper(): Escaper {\n const javaText: Escapes = [...TEXT, [new RegExp('@', 'g'), '@']];\n const javaAttr: Escapes = [...javaText, ...ATTR_ADDL];\n\n return {\n text: (x) => escapeText(javaText, x),\n attribute: (x) => escapeText(javaAttr, x),\n text2attr: (x) => escapeText(ATTR_ADDL, x),\n };\n}\n\ntype Escapes = Array<[RegExp, string]>;\n\nconst TEXT: Escapes = [\n [new RegExp('&', 'g'), '&'],\n [new RegExp('<', 'g'), '<'],\n [new RegExp('>', 'g'), '>'],\n];\n\n// Additional escapes (in addition to the text escapes) which need to be escaped inside attributes.\nconst ATTR_ADDL: Escapes = [\n [new RegExp('\"', 'g'), '"'],\n [new RegExp(\"'\", 'g'), '''],\n];\n\nfunction escapeText(set: Escapes, what: string | null): string {\n if (!what) {\n return '';\n }\n\n for (const [re, repl] of set) {\n what = what.replace(re, repl);\n }\n\n return what;\n}\n"]}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.extractTypescriptSnippetsFromMarkdown =
|
3
|
+
exports.extractTypescriptSnippetsFromMarkdown = extractTypescriptSnippetsFromMarkdown;
|
4
4
|
const cm = require("commonmark");
|
5
5
|
const replace_typescript_transform_1 = require("./replace-typescript-transform");
|
6
6
|
const markdown_1 = require("../markdown/markdown");
|
@@ -14,5 +14,4 @@ function extractTypescriptSnippetsFromMarkdown(markdown, location, strict) {
|
|
14
14
|
}));
|
15
15
|
return ret;
|
16
16
|
}
|
17
|
-
exports.extractTypescriptSnippetsFromMarkdown = extractTypescriptSnippetsFromMarkdown;
|
18
17
|
//# sourceMappingURL=extract-snippets.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"extract-snippets.js","sourceRoot":"","sources":["../../src/markdown/extract-snippets.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"extract-snippets.js","sourceRoot":"","sources":["../../src/markdown/extract-snippets.ts"],"names":[],"mappings":";;AASA,sFAmBC;AA5BD,iCAAiC;AAEjC,iFAA4E;AAE5E,mDAA2D;AAK3D,SAAgB,qCAAqC,CACnD,QAAgB,EAChB,QAAqB,EACrB,MAAe;IAEf,MAAM,MAAM,GAAG,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;IAC/B,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAEnC,MAAM,GAAG,GAAwB,EAAE,CAAC;IAEpC,IAAA,8BAAmB,EACjB,GAAG,EACH,IAAI,yDAA0B,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE;QACtD,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACb,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CACH,CAAC;IAEF,OAAO,GAAG,CAAC;AACb,CAAC","sourcesContent":["import * as cm from 'commonmark';\n\nimport { ReplaceTypeScriptTransform } from './replace-typescript-transform';\nimport { CodeBlock } from './types';\nimport { visitCommonMarkTree } from '../markdown/markdown';\nimport { TypeScriptSnippet, ApiLocation } from '../snippet';\n\nexport type TypeScriptReplacer = (code: TypeScriptSnippet) => CodeBlock | undefined;\n\nexport function extractTypescriptSnippetsFromMarkdown(\n markdown: string,\n location: ApiLocation,\n strict: boolean,\n): TypeScriptSnippet[] {\n const parser = new cm.Parser();\n const doc = parser.parse(markdown);\n\n const ret: TypeScriptSnippet[] = [];\n\n visitCommonMarkTree(\n doc,\n new ReplaceTypeScriptTransform(location, strict, (ts) => {\n ret.push(ts);\n return undefined;\n }),\n );\n\n return ret;\n}\n"]}
|
package/lib/markdown/index.js
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.
|
3
|
+
exports.markDownToStructure = markDownToStructure;
|
4
|
+
exports.markDownToJavaDoc = markDownToJavaDoc;
|
5
|
+
exports.markDownToXmlDoc = markDownToXmlDoc;
|
4
6
|
const javadoc_renderer_1 = require("./javadoc-renderer");
|
5
7
|
const markdown_1 = require("./markdown");
|
6
8
|
const structure_renderer_1 = require("./structure-renderer");
|
@@ -16,13 +18,10 @@ const xml_comment_renderer_1 = require("./xml-comment-renderer");
|
|
16
18
|
function markDownToStructure(source) {
|
17
19
|
return (0, markdown_1.transformMarkdown)(source, new structure_renderer_1.StructureRenderer());
|
18
20
|
}
|
19
|
-
exports.markDownToStructure = markDownToStructure;
|
20
21
|
function markDownToJavaDoc(source) {
|
21
22
|
return (0, markdown_1.transformMarkdown)(source, new javadoc_renderer_1.JavaDocRenderer());
|
22
23
|
}
|
23
|
-
exports.markDownToJavaDoc = markDownToJavaDoc;
|
24
24
|
function markDownToXmlDoc(source) {
|
25
25
|
return (0, markdown_1.transformMarkdown)(source, new xml_comment_renderer_1.CSharpXmlCommentRenderer());
|
26
26
|
}
|
27
|
-
exports.markDownToXmlDoc = markDownToXmlDoc;
|
28
27
|
//# sourceMappingURL=index.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/markdown/index.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/markdown/index.ts"],"names":[],"mappings":";;AAcA,kDAEC;AAED,8CAEC;AAED,4CAEC;AAxBD,yDAAqD;AACrD,yCAA+C;AAC/C,6DAAyD;AACzD,iEAAkE;AAElE;;;;;;;GAOG;AAEH,SAAgB,mBAAmB,CAAC,MAAc;IAChD,OAAO,IAAA,4BAAiB,EAAC,MAAM,EAAE,IAAI,sCAAiB,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,SAAgB,iBAAiB,CAAC,MAAc;IAC9C,OAAO,IAAA,4BAAiB,EAAC,MAAM,EAAE,IAAI,kCAAe,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED,SAAgB,gBAAgB,CAAC,MAAc;IAC7C,OAAO,IAAA,4BAAiB,EAAC,MAAM,EAAE,IAAI,+CAAwB,EAAE,CAAC,CAAC;AACnE,CAAC","sourcesContent":["import { JavaDocRenderer } from './javadoc-renderer';\nimport { transformMarkdown } from './markdown';\nimport { StructureRenderer } from './structure-renderer';\nimport { CSharpXmlCommentRenderer } from './xml-comment-renderer';\n\n/**\n * All the visitors in this module expose CommonMark types in their API\n *\n * We want to keep CommonMark as a private dependency (so we don't have to\n * mark it as peerDependency and can keep its @types in devDependencies),\n * so we re-expose the main functionality needed by pacmak as functions\n * that operate on basic types here.\n */\n\nexport function markDownToStructure(source: string) {\n return transformMarkdown(source, new StructureRenderer());\n}\n\nexport function markDownToJavaDoc(source: string) {\n return transformMarkdown(source, new JavaDocRenderer());\n}\n\nexport function markDownToXmlDoc(source: string) {\n return transformMarkdown(source, new CSharpXmlCommentRenderer());\n}\n"]}
|
@@ -1,6 +1,10 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.
|
3
|
+
exports.MarkdownRenderer = void 0;
|
4
|
+
exports.para = para;
|
5
|
+
exports.collapsePara = collapsePara;
|
6
|
+
exports.stripPara = stripPara;
|
7
|
+
exports.stripTrailingWhitespace = stripTrailingWhitespace;
|
4
8
|
const markdown_1 = require("./markdown");
|
5
9
|
/**
|
6
10
|
* A renderer that will render a CommonMark tree back to MarkDown
|
@@ -85,7 +89,6 @@ const PARA_BREAK = '\u001d';
|
|
85
89
|
function para(x) {
|
86
90
|
return `${PARA_BREAK}${x}${PARA_BREAK}`;
|
87
91
|
}
|
88
|
-
exports.para = para;
|
89
92
|
/**
|
90
93
|
* Collapse paragraph markers
|
91
94
|
*/
|
@@ -97,7 +100,6 @@ function collapsePara(x, brk = '\n\n') {
|
|
97
100
|
.replace(/\u001d+/g, brk);
|
98
101
|
/* eslint-enable no-control-regex */
|
99
102
|
}
|
100
|
-
exports.collapsePara = collapsePara;
|
101
103
|
/**
|
102
104
|
* Strip paragraph markers from start and end
|
103
105
|
*/
|
@@ -105,7 +107,6 @@ function stripPara(x) {
|
|
105
107
|
/* eslint-disable-next-line no-control-regex */
|
106
108
|
return x.replace(/^\u001d+/, '').replace(/\u001d+$/, '');
|
107
109
|
}
|
108
|
-
exports.stripPara = stripPara;
|
109
110
|
function determineItemPrefix(listNode, index) {
|
110
111
|
if (listNode.listType === 'bullet') {
|
111
112
|
return '* ';
|
@@ -115,5 +116,4 @@ function determineItemPrefix(listNode, index) {
|
|
115
116
|
function stripTrailingWhitespace(x) {
|
116
117
|
return x.replace(/[ \t]+$/gm, '');
|
117
118
|
}
|
118
|
-
exports.stripTrailingWhitespace = stripTrailingWhitespace;
|
119
119
|
//# sourceMappingURL=markdown-renderer.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"markdown-renderer.js","sourceRoot":"","sources":["../../src/markdown/markdown-renderer.ts"],"names":[],"mappings":";;;
|
1
|
+
{"version":3,"file":"markdown-renderer.js","sourceRoot":"","sources":["../../src/markdown/markdown-renderer.ts"],"names":[],"mappings":"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","sourcesContent":["import * as cm from 'commonmark';\n\nimport { cmNodeChildren, CommonMarkRenderer, prefixLines, RendererContext } from './markdown';\n\n/**\n * A renderer that will render a CommonMark tree back to MarkDown\n */\nexport class MarkdownRenderer implements CommonMarkRenderer {\n public block_quote(_node: cm.Node, context: RendererContext) {\n return para(prefixLines('> ', collapsePara(context.content())));\n }\n\n public code(node: cm.Node, _context: RendererContext) {\n return `\\`${node.literal}\\``;\n }\n\n public code_block(node: cm.Node, _context: RendererContext) {\n return para(`\\`\\`\\`${node.info ?? ''}\\n${node.literal}\\`\\`\\``);\n }\n\n public text(node: cm.Node, _context: RendererContext) {\n return node.literal ?? '';\n }\n\n public softbreak(_node: cm.Node, _context: RendererContext) {\n return '\\n';\n }\n\n public linebreak(_node: cm.Node, _context: RendererContext) {\n return '\\\\\\n';\n }\n\n public emph(_node: cm.Node, context: RendererContext) {\n return `*${context.content()}*`;\n }\n\n public strong(_node: cm.Node, context: RendererContext) {\n return `**${context.content()}**`;\n }\n\n public html_inline(node: cm.Node, _context: RendererContext) {\n return node.literal ?? '';\n }\n\n public html_block(node: cm.Node, _context: RendererContext) {\n return node.literal ?? '';\n }\n\n public link(node: cm.Node, context: RendererContext) {\n return `[${context.content()}](${node.destination ?? ''})`;\n }\n\n public image(node: cm.Node, context: RendererContext) {\n return `![${context.content()}](${node.destination ?? ''})`;\n }\n\n public document(_node: cm.Node, context: RendererContext) {\n return stripTrailingWhitespace(collapsePara(context.content()));\n }\n\n public paragraph(_node: cm.Node, context: RendererContext) {\n return para(context.content());\n }\n\n public list(node: cm.Node, context: RendererContext) {\n // A list is not wrapped in a paragraph, but items may contain paragraphs.\n // All elements of a list are definitely 'item's.\n const items = [];\n\n let i = 1;\n for (const item of cmNodeChildren(node)) {\n const firstLinePrefix = determineItemPrefix(node, i);\n const hangingPrefix = ' '.repeat(firstLinePrefix.length);\n\n const rendered = context.recurse(item);\n // Prefix the first line with a different text than subsequent lines\n const prefixed = firstLinePrefix + prefixLines(hangingPrefix, rendered).slice(hangingPrefix.length);\n\n items.push(prefixed);\n\n i += 1;\n }\n\n return para(items.join('\\n'));\n }\n\n public item(_node: cm.Node, context: RendererContext) {\n return collapsePara(context.content());\n }\n\n public heading(node: cm.Node, context: RendererContext) {\n return para(`${'#'.repeat(node.level)} ${context.content()}`);\n }\n\n public thematic_break(_node: cm.Node, _context: RendererContext) {\n return '---\\n';\n }\n\n public custom_block(_node: cm.Node, context: RendererContext) {\n return `<custom>${context.content()}</custom>`;\n }\n\n public custom_inline(_node: cm.Node, context: RendererContext) {\n return `<custom>${context.content()}</custom>`;\n }\n}\n\nconst PARA_BREAK = '\\u001d';\n\nexport function para(x: string) {\n return `${PARA_BREAK}${x}${PARA_BREAK}`;\n}\n\n/**\n * Collapse paragraph markers\n */\nexport function collapsePara(x: string, brk = '\\n\\n') {\n /* eslint-disable no-control-regex */\n return x\n .replace(/^\\u001d+/, '')\n .replace(/\\u001d+$/, '')\n .replace(/\\u001d+/g, brk);\n /* eslint-enable no-control-regex */\n}\n\n/**\n * Strip paragraph markers from start and end\n */\nexport function stripPara(x: string) {\n /* eslint-disable-next-line no-control-regex */\n return x.replace(/^\\u001d+/, '').replace(/\\u001d+$/, '');\n}\n\nfunction determineItemPrefix(listNode: cm.Node, index: number) {\n if (listNode.listType === 'bullet') {\n return '* ';\n }\n return `${index}${listNode.listDelimiter} `;\n}\n\nexport function stripTrailingWhitespace(x: string) {\n return x.replace(/[ \\t]+$/gm, '');\n}\n"]}
|
package/lib/markdown/markdown.js
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.
|
3
|
+
exports.transformMarkdown = transformMarkdown;
|
4
|
+
exports.renderCommonMarkTree = renderCommonMarkTree;
|
5
|
+
exports.visitCommonMarkTree = visitCommonMarkTree;
|
6
|
+
exports.prefixLines = prefixLines;
|
7
|
+
exports.cmNodeChildren = cmNodeChildren;
|
4
8
|
const cm = require("commonmark");
|
5
9
|
function transformMarkdown(source, renderer, transform) {
|
6
10
|
const parser = new cm.Parser();
|
@@ -10,7 +14,6 @@ function transformMarkdown(source, renderer, transform) {
|
|
10
14
|
}
|
11
15
|
return renderCommonMarkTree(doc, renderer);
|
12
16
|
}
|
13
|
-
exports.transformMarkdown = transformMarkdown;
|
14
17
|
function renderCommonMarkTree(node, renderer) {
|
15
18
|
const context = {
|
16
19
|
recurse(n) {
|
@@ -29,25 +32,21 @@ function renderCommonMarkTree(node, renderer) {
|
|
29
32
|
};
|
30
33
|
return renderer[node.type](node, context);
|
31
34
|
}
|
32
|
-
exports.renderCommonMarkTree = renderCommonMarkTree;
|
33
35
|
function visitCommonMarkTree(node, visitor) {
|
34
36
|
visitor[node.type](node);
|
35
37
|
for (const child of cmNodeChildren(node)) {
|
36
38
|
visitCommonMarkTree(child, visitor);
|
37
39
|
}
|
38
40
|
}
|
39
|
-
exports.visitCommonMarkTree = visitCommonMarkTree;
|
40
41
|
function prefixLines(prefix, x) {
|
41
42
|
return x
|
42
43
|
.split('\n')
|
43
44
|
.map((l) => prefix + l)
|
44
45
|
.join('\n');
|
45
46
|
}
|
46
|
-
exports.prefixLines = prefixLines;
|
47
47
|
function* cmNodeChildren(node) {
|
48
48
|
for (let child = node.firstChild; child !== null; child = child.next) {
|
49
49
|
yield child;
|
50
50
|
}
|
51
51
|
}
|
52
|
-
exports.cmNodeChildren = cmNodeChildren;
|
53
52
|
//# sourceMappingURL=markdown.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/markdown/markdown.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/markdown/markdown.ts"],"names":[],"mappings":";;AAEA,8CAOC;AA+BD,oDAoBC;AAED,kDAKC;AAED,kCAKC;AAED,wCAIC;AAhFD,iCAAiC;AAEjC,SAAgB,iBAAiB,CAAC,MAAc,EAAE,QAA4B,EAAE,SAA6B;IAC3G,MAAM,MAAM,GAAG,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;IAC/B,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,SAAS,EAAE,CAAC;QACd,mBAAmB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,oBAAoB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAC7C,CAAC;AA+BD,SAAgB,oBAAoB,CAAC,IAAa,EAAE,QAA4B;IAC9E,MAAM,OAAO,GAAoB;QAC/B,OAAO,CAAC,CAAU;YAChB,OAAO,oBAAoB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC3C,CAAC;QAED,OAAO;YACL,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClC,CAAC;QAED,QAAQ;YACN,MAAM,KAAK,GAAG,EAAE,CAAC;YACjB,KAAK,MAAM,KAAK,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;YACpD,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;IAEF,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED,SAAgB,mBAAmB,CAAC,IAAa,EAAE,OAA0B;IAC3E,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IACzB,KAAK,MAAM,KAAK,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;AACH,CAAC;AAED,SAAgB,WAAW,CAAC,MAAc,EAAE,CAAS;IACnD,OAAO,CAAC;SACL,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;SACtB,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,QAAe,CAAC,CAAC,cAAc,CAAC,IAAa;IAC3C,KAAK,IAAI,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,KAAK,IAAI,EAAE,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QACrE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC","sourcesContent":["import * as cm from 'commonmark';\n\nexport function transformMarkdown(source: string, renderer: CommonMarkRenderer, transform?: CommonMarkVisitor) {\n const parser = new cm.Parser();\n const doc = parser.parse(source);\n if (transform) {\n visitCommonMarkTree(doc, transform);\n }\n return renderCommonMarkTree(doc, renderer);\n}\n\nexport interface RendererContext {\n recurse(node: cm.Node): string;\n children(): string[];\n content(): string;\n}\n\nexport interface CommonMarkRenderer {\n block_quote(node: cm.Node, context: RendererContext): string;\n code(node: cm.Node, context: RendererContext): string;\n code_block(node: cm.Node, context: RendererContext): string;\n text(node: cm.Node, context: RendererContext): string;\n softbreak(node: cm.Node, context: RendererContext): string;\n linebreak(node: cm.Node, context: RendererContext): string;\n emph(node: cm.Node, context: RendererContext): string;\n strong(node: cm.Node, context: RendererContext): string;\n html_inline(node: cm.Node, context: RendererContext): string;\n html_block(node: cm.Node, context: RendererContext): string;\n link(node: cm.Node, context: RendererContext): string;\n image(node: cm.Node, context: RendererContext): string;\n document(node: cm.Node, context: RendererContext): string;\n paragraph(node: cm.Node, context: RendererContext): string;\n list(node: cm.Node, context: RendererContext): string;\n item(node: cm.Node, context: RendererContext): string;\n heading(node: cm.Node, context: RendererContext): string;\n thematic_break(node: cm.Node, context: RendererContext): string;\n custom_block(node: cm.Node, context: RendererContext): string;\n custom_inline(node: cm.Node, context: RendererContext): string;\n}\n\nexport function renderCommonMarkTree(node: cm.Node, renderer: CommonMarkRenderer) {\n const context: RendererContext = {\n recurse(n: cm.Node): string {\n return renderCommonMarkTree(n, renderer);\n },\n\n content() {\n return this.children().join('');\n },\n\n children() {\n const parts = [];\n for (const child of cmNodeChildren(node)) {\n parts.push(renderCommonMarkTree(child, renderer));\n }\n return parts;\n },\n };\n\n return renderer[node.type](node, context);\n}\n\nexport function visitCommonMarkTree(node: cm.Node, visitor: CommonMarkVisitor) {\n visitor[node.type](node);\n for (const child of cmNodeChildren(node)) {\n visitCommonMarkTree(child, visitor);\n }\n}\n\nexport function prefixLines(prefix: string, x: string) {\n return x\n .split('\\n')\n .map((l) => prefix + l)\n .join('\\n');\n}\n\nexport function* cmNodeChildren(node: cm.Node): IterableIterator<cm.Node> {\n for (let child = node.firstChild; child !== null; child = child.next) {\n yield child;\n }\n}\n\nexport interface CommonMarkVisitor {\n block_quote(node: cm.Node): void;\n code(node: cm.Node): void;\n code_block(node: cm.Node): void;\n text(node: cm.Node): void;\n softbreak(node: cm.Node): void;\n linebreak(node: cm.Node): void;\n emph(node: cm.Node): void;\n strong(node: cm.Node): void;\n html_inline(node: cm.Node): void;\n html_block(node: cm.Node): void;\n link(node: cm.Node): void;\n image(node: cm.Node): void;\n document(node: cm.Node): void;\n paragraph(node: cm.Node): void;\n list(node: cm.Node): void;\n item(node: cm.Node): void;\n heading(node: cm.Node): void;\n thematic_break(node: cm.Node): void;\n custom_block(node: cm.Node): void;\n custom_inline(node: cm.Node): void;\n}\n"]}
|
package/lib/o-tree.js
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.
|
3
|
+
exports.OTreeSink = exports.UnknownSyntax = exports.NO_SYNTAX = exports.OTree = void 0;
|
4
|
+
exports.renderTree = renderTree;
|
4
5
|
/**
|
5
6
|
* "Output" Tree
|
6
7
|
*
|
@@ -226,7 +227,6 @@ function renderTree(tree, options) {
|
|
226
227
|
tree.write(sink);
|
227
228
|
return sink.toString();
|
228
229
|
}
|
229
|
-
exports.renderTree = renderTree;
|
230
230
|
function containsNewline(x) {
|
231
231
|
return x.includes('\n');
|
232
232
|
}
|
package/lib/o-tree.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"o-tree.js","sourceRoot":"","sources":["../src/o-tree.ts"],"names":[],"mappings":"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","sourcesContent":["import { Spans } from './typescript/visible-spans';\n\nexport interface OTreeOptions {\n /**\n * Adjust indentation with the given number\n *\n * Indentation affects children.\n *\n * @default 0\n */\n indent?: number;\n\n /**\n * Separate children with the given string\n *\n * @default ''\n */\n separator?: string;\n\n /**\n * Whether trailing separators should be output. This imples children will be\n * writen each on a new line.\n *\n * @default false\n */\n trailingSeparator?: boolean;\n\n /**\n * Suffix the token after outdenting\n *\n * @default ''\n */\n suffix?: string;\n\n /**\n * Whether this part of the generated syntax is okay to insert newlines and comments\n *\n * @default false\n */\n canBreakLine?: boolean;\n\n /**\n * If set, a unique key which will cause only one node with the given key to be rendered.\n *\n * The outermost key is the one that will be rendered.\n *\n * Used to make it easier to keep the state necessary to render comments\n * only once in the output tree, rather than keep the state in the\n * language rendered.\n *\n * @default No conditional rendering\n */\n renderOnce?: string;\n}\n\n/**\n * \"Output\" Tree\n *\n * Tree-like structure that holds sequences of trees and strings, which\n * can be rendered to an output sink.\n */\nexport class OTree implements OTree {\n public static simplify(xs: Array<OTree | string | undefined>): Array<OTree | string> {\n return xs.filter(notUndefined).filter(notEmpty);\n }\n\n public readonly attachComment: boolean;\n\n private readonly prefix: Array<OTree | string>;\n private readonly children: Array<OTree | string>;\n private span?: Span;\n\n public constructor(\n prefix: Array<OTree | string | undefined>,\n children?: Array<OTree | string | undefined>,\n private readonly options: OTreeOptions = {},\n ) {\n this.prefix = OTree.simplify(prefix);\n this.children = OTree.simplify(children ?? []);\n this.attachComment = !!options.canBreakLine;\n }\n\n /**\n * Set the span in the source file this tree node relates to\n */\n public setSpan(start: number, end: number) {\n this.span = { start, end };\n }\n\n public write(sink: OTreeSink) {\n if (!sink.tagOnce(this.options.renderOnce)) {\n return;\n }\n\n const meVisible = sink.renderingForSpan(this.span);\n\n for (const x of this.prefix) {\n sink.write(x);\n }\n\n const popIndent = sink.requestIndentChange(meVisible ? this.options.indent ?? 0 : 0);\n let mark = sink.mark();\n\n for (const child of this.children ?? []) {\n if (this.options.separator) {\n if (this.options.trailingSeparator) {\n sink.ensureNewLine();\n } else if (mark.wroteNonWhitespaceSinceMark) {\n sink.write(this.options.separator);\n }\n }\n mark = sink.mark();\n\n sink.write(child);\n\n if (this.options.separator && this.options.trailingSeparator) {\n sink.write(this.options.separator.trimEnd());\n }\n }\n\n popIndent();\n\n if (this.options.suffix) {\n if (this.options.separator && this.options.trailingSeparator) {\n sink.ensureNewLine();\n }\n sink.renderingForSpan(this.span);\n sink.write(this.options.suffix);\n }\n }\n\n public get isEmpty() {\n return this.prefix.length + this.children.length === 0;\n }\n\n public toString() {\n return `<INCORRECTLY STRINGIFIED ${this.prefix.toString()}>`;\n }\n}\n\nexport const NO_SYNTAX = new OTree([]);\n\nexport class UnknownSyntax extends OTree {}\n\nexport interface SinkMark {\n readonly wroteNonWhitespaceSinceMark: boolean;\n}\n\nexport interface OTreeSinkOptions {\n /**\n * @default ' '\n */\n indentChar?: ' ' | '\\t';\n visibleSpans?: Spans;\n}\n\ninterface ConditionalNewLine {\n readonly conditionalNewLine: {\n readonly indent: number;\n };\n}\n\n/**\n * Output sink for OTree objects\n *\n * Maintains state about what has been rendered supports suppressing code\n * fragments based on their tagged source location.\n *\n * Basically: manages the state that was too hard to manage in the\n * tree :).\n */\nexport class OTreeSink {\n private readonly indentChar: ' ' | '\\t';\n private readonly indentLevels: number[] = [0];\n private readonly fragments = new Array<string | ConditionalNewLine>();\n private readonly singletonsRendered = new Set<string>();\n private pendingIndentChange = 0;\n private rendering = true;\n\n public constructor(private readonly options: OTreeSinkOptions = {}) {\n this.indentChar = options.indentChar ?? ' ';\n }\n\n public tagOnce(key: string | undefined): boolean {\n if (key === undefined) {\n return true;\n }\n if (this.singletonsRendered.has(key)) {\n return false;\n }\n this.singletonsRendered.add(key);\n return true;\n }\n\n /**\n * Get a mark for the current sink output location\n *\n * Marks can be used to query about things that have been written to output.\n */\n public mark(): SinkMark {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n const markIndex = this.fragments.length;\n\n return {\n get wroteNonWhitespaceSinceMark(): boolean {\n return self.fragments.slice(markIndex).some((s) => typeof s !== 'object' && /[^\\s]/.exec(s) != null);\n },\n };\n }\n\n public write(text: string | OTree) {\n if (text instanceof OTree) {\n text.write(this);\n } else {\n if (!this.rendering) {\n return;\n }\n\n if (containsNewline(text)) {\n this.applyPendingIndentChange();\n }\n this.append(text.replace(/\\n/g, `\\n${this.indentChar.repeat(this.currentIndent)}`));\n }\n }\n\n /**\n * Ensures the following tokens will be output on a new line (emits a new line\n * and indent unless immediately preceded or followed by a newline, ignoring\n * surrounding white space).\n */\n public ensureNewLine(): void {\n this.applyPendingIndentChange();\n this.fragments.push({ conditionalNewLine: { indent: this.currentIndent } });\n }\n\n public renderingForSpan(span?: Span): boolean {\n if (span && this.options.visibleSpans) {\n this.rendering = this.options.visibleSpans.fullyContainsSpan(span);\n }\n return this.rendering;\n }\n\n public requestIndentChange(x: number): () => void {\n if (x === 0) {\n return () => undefined;\n }\n\n this.pendingIndentChange = x;\n const currentIndentState = this.indentLevels.length;\n\n // Return a pop function which will reset to the current indent state,\n // regardless of whether the indent was actually applied or not.\n return () => {\n this.indentLevels.splice(currentIndentState);\n this.pendingIndentChange = 0;\n };\n }\n\n public toString() {\n // Strip trailing whitespace from every line, and empty lines from the start and end\n return this.fragments\n .map((item, index, fragments) => {\n if (typeof item !== 'object') {\n return item;\n }\n const ignore = '';\n\n const leading = fragments.slice(0, index).reverse();\n for (const fragment of leading) {\n if (typeof fragment === 'object') {\n // We don't emit if there was already a conditional newline just before\n return ignore;\n }\n // If there's a trailing newline, then we don't emit this one\n if (/\\n\\s*$/m.exec(fragment)) {\n return ignore;\n }\n // If it contained non-whitespace characters, we need to check trailing data...\n if (/[^\\s]/.exec(fragment)) {\n break;\n }\n }\n\n const newlineAndIndent = `\\n${this.indentChar.repeat(item.conditionalNewLine.indent)}`;\n\n const trailing = fragments.slice(index + 1);\n for (const fragment of trailing) {\n if (typeof fragment === 'object') {\n // We're the first of a sequence, so we must emit (unless we returned earlier, of course)\n return newlineAndIndent;\n }\n // If there's a leading newline, then we don't emit this one\n if (/^\\s*\\n/m.exec(fragment)) {\n return ignore;\n }\n // If it contained non-whitespace characters, we emit this one\n if (/[^\\s]/.exec(fragment)) {\n return newlineAndIndent;\n }\n }\n\n return ignore;\n })\n .join('')\n .replace(/[ \\t]+$/gm, '')\n .replace(/^\\n+/, '')\n .replace(/\\n+$/, '');\n }\n\n private append(x: string) {\n this.fragments.push(x);\n }\n\n private applyPendingIndentChange() {\n if (this.pendingIndentChange !== 0) {\n this.indentLevels.push(this.currentIndent + this.pendingIndentChange);\n this.pendingIndentChange = 0;\n }\n }\n\n private get currentIndent() {\n return this.indentLevels[this.indentLevels.length - 1];\n }\n}\n\nfunction notUndefined<T>(x: T | undefined): x is T {\n return x !== undefined;\n}\n\nfunction notEmpty(x: OTree | string) {\n return x instanceof OTree ? !x.isEmpty : x !== '';\n}\n\nexport function renderTree(tree: OTree, options?: OTreeSinkOptions): string {\n const sink = new OTreeSink(options);\n tree.write(sink);\n return sink.toString();\n}\n\nfunction containsNewline(x: string) {\n return x.includes('\\n');\n}\n\nexport interface Span {\n readonly start: number;\n readonly end: number;\n}\n"]}
|
1
|
+
{"version":3,"file":"o-tree.js","sourceRoot":"","sources":["../src/o-tree.ts"],"names":[],"mappings":"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","sourcesContent":["import { Spans } from './typescript/visible-spans';\n\nexport interface OTreeOptions {\n /**\n * Adjust indentation with the given number\n *\n * Indentation affects children.\n *\n * @default 0\n */\n indent?: number;\n\n /**\n * Separate children with the given string\n *\n * @default ''\n */\n separator?: string;\n\n /**\n * Whether trailing separators should be output. This imples children will be\n * writen each on a new line.\n *\n * @default false\n */\n trailingSeparator?: boolean;\n\n /**\n * Suffix the token after outdenting\n *\n * @default ''\n */\n suffix?: string;\n\n /**\n * Whether this part of the generated syntax is okay to insert newlines and comments\n *\n * @default false\n */\n canBreakLine?: boolean;\n\n /**\n * If set, a unique key which will cause only one node with the given key to be rendered.\n *\n * The outermost key is the one that will be rendered.\n *\n * Used to make it easier to keep the state necessary to render comments\n * only once in the output tree, rather than keep the state in the\n * language rendered.\n *\n * @default No conditional rendering\n */\n renderOnce?: string;\n}\n\n/**\n * \"Output\" Tree\n *\n * Tree-like structure that holds sequences of trees and strings, which\n * can be rendered to an output sink.\n */\nexport class OTree implements OTree {\n public static simplify(xs: Array<OTree | string | undefined>): Array<OTree | string> {\n return xs.filter(notUndefined).filter(notEmpty);\n }\n\n public readonly attachComment: boolean;\n\n private readonly prefix: Array<OTree | string>;\n private readonly children: Array<OTree | string>;\n private span?: Span;\n\n public constructor(\n prefix: Array<OTree | string | undefined>,\n children?: Array<OTree | string | undefined>,\n private readonly options: OTreeOptions = {},\n ) {\n this.prefix = OTree.simplify(prefix);\n this.children = OTree.simplify(children ?? []);\n this.attachComment = !!options.canBreakLine;\n }\n\n /**\n * Set the span in the source file this tree node relates to\n */\n public setSpan(start: number, end: number) {\n this.span = { start, end };\n }\n\n public write(sink: OTreeSink) {\n if (!sink.tagOnce(this.options.renderOnce)) {\n return;\n }\n\n const meVisible = sink.renderingForSpan(this.span);\n\n for (const x of this.prefix) {\n sink.write(x);\n }\n\n const popIndent = sink.requestIndentChange(meVisible ? this.options.indent ?? 0 : 0);\n let mark = sink.mark();\n\n for (const child of this.children ?? []) {\n if (this.options.separator) {\n if (this.options.trailingSeparator) {\n sink.ensureNewLine();\n } else if (mark.wroteNonWhitespaceSinceMark) {\n sink.write(this.options.separator);\n }\n }\n mark = sink.mark();\n\n sink.write(child);\n\n if (this.options.separator && this.options.trailingSeparator) {\n sink.write(this.options.separator.trimEnd());\n }\n }\n\n popIndent();\n\n if (this.options.suffix) {\n if (this.options.separator && this.options.trailingSeparator) {\n sink.ensureNewLine();\n }\n sink.renderingForSpan(this.span);\n sink.write(this.options.suffix);\n }\n }\n\n public get isEmpty() {\n return this.prefix.length + this.children.length === 0;\n }\n\n public toString() {\n return `<INCORRECTLY STRINGIFIED ${this.prefix.toString()}>`;\n }\n}\n\nexport const NO_SYNTAX = new OTree([]);\n\nexport class UnknownSyntax extends OTree {}\n\nexport interface SinkMark {\n readonly wroteNonWhitespaceSinceMark: boolean;\n}\n\nexport interface OTreeSinkOptions {\n /**\n * @default ' '\n */\n indentChar?: ' ' | '\\t';\n visibleSpans?: Spans;\n}\n\ninterface ConditionalNewLine {\n readonly conditionalNewLine: {\n readonly indent: number;\n };\n}\n\n/**\n * Output sink for OTree objects\n *\n * Maintains state about what has been rendered supports suppressing code\n * fragments based on their tagged source location.\n *\n * Basically: manages the state that was too hard to manage in the\n * tree :).\n */\nexport class OTreeSink {\n private readonly indentChar: ' ' | '\\t';\n private readonly indentLevels: number[] = [0];\n private readonly fragments = new Array<string | ConditionalNewLine>();\n private readonly singletonsRendered = new Set<string>();\n private pendingIndentChange = 0;\n private rendering = true;\n\n public constructor(private readonly options: OTreeSinkOptions = {}) {\n this.indentChar = options.indentChar ?? ' ';\n }\n\n public tagOnce(key: string | undefined): boolean {\n if (key === undefined) {\n return true;\n }\n if (this.singletonsRendered.has(key)) {\n return false;\n }\n this.singletonsRendered.add(key);\n return true;\n }\n\n /**\n * Get a mark for the current sink output location\n *\n * Marks can be used to query about things that have been written to output.\n */\n public mark(): SinkMark {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n const markIndex = this.fragments.length;\n\n return {\n get wroteNonWhitespaceSinceMark(): boolean {\n return self.fragments.slice(markIndex).some((s) => typeof s !== 'object' && /[^\\s]/.exec(s) != null);\n },\n };\n }\n\n public write(text: string | OTree) {\n if (text instanceof OTree) {\n text.write(this);\n } else {\n if (!this.rendering) {\n return;\n }\n\n if (containsNewline(text)) {\n this.applyPendingIndentChange();\n }\n this.append(text.replace(/\\n/g, `\\n${this.indentChar.repeat(this.currentIndent)}`));\n }\n }\n\n /**\n * Ensures the following tokens will be output on a new line (emits a new line\n * and indent unless immediately preceded or followed by a newline, ignoring\n * surrounding white space).\n */\n public ensureNewLine(): void {\n this.applyPendingIndentChange();\n this.fragments.push({ conditionalNewLine: { indent: this.currentIndent } });\n }\n\n public renderingForSpan(span?: Span): boolean {\n if (span && this.options.visibleSpans) {\n this.rendering = this.options.visibleSpans.fullyContainsSpan(span);\n }\n return this.rendering;\n }\n\n public requestIndentChange(x: number): () => void {\n if (x === 0) {\n return () => undefined;\n }\n\n this.pendingIndentChange = x;\n const currentIndentState = this.indentLevels.length;\n\n // Return a pop function which will reset to the current indent state,\n // regardless of whether the indent was actually applied or not.\n return () => {\n this.indentLevels.splice(currentIndentState);\n this.pendingIndentChange = 0;\n };\n }\n\n public toString() {\n // Strip trailing whitespace from every line, and empty lines from the start and end\n return this.fragments\n .map((item, index, fragments) => {\n if (typeof item !== 'object') {\n return item;\n }\n const ignore = '';\n\n const leading = fragments.slice(0, index).reverse();\n for (const fragment of leading) {\n if (typeof fragment === 'object') {\n // We don't emit if there was already a conditional newline just before\n return ignore;\n }\n // If there's a trailing newline, then we don't emit this one\n if (/\\n\\s*$/m.exec(fragment)) {\n return ignore;\n }\n // If it contained non-whitespace characters, we need to check trailing data...\n if (/[^\\s]/.exec(fragment)) {\n break;\n }\n }\n\n const newlineAndIndent = `\\n${this.indentChar.repeat(item.conditionalNewLine.indent)}`;\n\n const trailing = fragments.slice(index + 1);\n for (const fragment of trailing) {\n if (typeof fragment === 'object') {\n // We're the first of a sequence, so we must emit (unless we returned earlier, of course)\n return newlineAndIndent;\n }\n // If there's a leading newline, then we don't emit this one\n if (/^\\s*\\n/m.exec(fragment)) {\n return ignore;\n }\n // If it contained non-whitespace characters, we emit this one\n if (/[^\\s]/.exec(fragment)) {\n return newlineAndIndent;\n }\n }\n\n return ignore;\n })\n .join('')\n .replace(/[ \\t]+$/gm, '')\n .replace(/^\\n+/, '')\n .replace(/\\n+$/, '');\n }\n\n private append(x: string) {\n this.fragments.push(x);\n }\n\n private applyPendingIndentChange() {\n if (this.pendingIndentChange !== 0) {\n this.indentLevels.push(this.currentIndent + this.pendingIndentChange);\n this.pendingIndentChange = 0;\n }\n }\n\n private get currentIndent() {\n return this.indentLevels[this.indentLevels.length - 1];\n }\n}\n\nfunction notUndefined<T>(x: T | undefined): x is T {\n return x !== undefined;\n}\n\nfunction notEmpty(x: OTree | string) {\n return x instanceof OTree ? !x.isEmpty : x !== '';\n}\n\nexport function renderTree(tree: OTree, options?: OTreeSinkOptions): string {\n const sink = new OTreeSink(options);\n tree.write(sink);\n return sink.toString();\n}\n\nfunction containsNewline(x: string) {\n return x.includes('\\n');\n}\n\nexport interface Span {\n readonly start: number;\n readonly end: number;\n}\n"]}
|
package/lib/renderer.js
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.
|
3
|
+
exports.AstRenderer = void 0;
|
4
|
+
exports.nimpl = nimpl;
|
4
5
|
const ts = require("typescript");
|
5
6
|
const o_tree_1 = require("./o-tree");
|
6
7
|
const ast_utils_1 = require("./typescript/ast-utils");
|
@@ -292,6 +293,7 @@ class AstRenderer {
|
|
292
293
|
return visitor.parenthesizedExpression(tree, this);
|
293
294
|
case ts.SyntaxKind.VoidExpression:
|
294
295
|
return visitor.maskingVoidExpression(tree, this);
|
296
|
+
case ts.SyntaxKind.JSDoc:
|
295
297
|
case ts.SyntaxKind.JSDocComment:
|
296
298
|
return visitor.jsDoc(tree, this);
|
297
299
|
default:
|
@@ -367,7 +369,6 @@ function nimpl(node, context, options = {}) {
|
|
367
369
|
canBreakLine: true,
|
368
370
|
});
|
369
371
|
}
|
370
|
-
exports.nimpl = nimpl;
|
371
372
|
function filterVisible(nodes) {
|
372
373
|
return assignVisibility(nodes)
|
373
374
|
.map((c) => (c.visible ? c.node : c.maskingVoid))
|
package/lib/renderer.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":";;;AAAA,iCAAiC;AAGjC,qCAAiE;AAEjE,sDAOgC;AAChC,kDAAsG;AACtG,8CAAgF;AAEhF;;;;;;;GAOG;AACH,MAAa,WAAW;IAItB,YACmB,UAAyB,EAC1B,WAA2B,EAC1B,OAAsB,EACtB,UAA8B,EAAE,EACjC,sBAA6C,IAAI,GAAG,EAAE;QAJrD,eAAU,GAAV,UAAU,CAAe;QAC1B,gBAAW,GAAX,WAAW,CAAgB;QAC1B,YAAO,GAAP,OAAO,CAAe;QACtB,YAAO,GAAP,OAAO,CAAyB;QACjC,wBAAmB,GAAnB,mBAAmB,CAAmC;QARxD,gBAAW,GAAG,IAAI,KAAK,EAAiB,CAAC;QAUvD,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAC/C,CAAC;IAED;;OAEG;IACI,aAAa,CAAC,aAAyB;QAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;QAEjF,yEAAyE;QACzE,+BAA+B;QAC/B,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;YACxC,cAAc,EAAE,UAAU;SAC3B,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACI,OAAO,CAAC,IAAyB;QACtC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,kBAAS,CAAC;QACnB,CAAC;QAED,0BAA0B;QAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACxC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC;YAC/B,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC/D,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAClE,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;OAEG;IACI,UAAU,CAAC,KAAyB;QACzC,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3D,CAAC;IAEM,mBAAmB,CACxB,KAAyB,EACzB,WAA4E;QAE5E,MAAM,GAAG,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,KAAK,EAAS,CAAC;QAClC,KAAK,MAAM,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;YAClE,MAAM,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC;YAClD,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC;gBACrD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACI,sBAAsB,CAAC,KAAyB,EAAE,WAAc;QACrE,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QAEtD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAE9D,MAAM,GAAG,GAAY,EAAE,CAAC;QAExB,MAAM,GAAG,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,MAAM,YAAY,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC;YAElE,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;YAC/D,IAAI,IAAI,EAAE,CAAC;gBACT,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAEM,WAAW,CAAC,IAAa;QAC9B,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;YACrC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE;SACnB,CAAC;IACJ,CAAC;IAEM,MAAM,CAAC,IAAa;QACzB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC;IAEM,MAAM,CAAC,GAAW,EAAE,GAAW;QACpC,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAClD,CAAC;IAED;;;;;;;;;OASG;IACI,wBAAwB,CAAC,IAAmB;QACjD,OAAO,IAAA,gCAAwB,EAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAC1D,CAAC;IAED;;;;;;OAMG;IACI,gBAAgB,CAAC,IAAmB;QACzC,OAAO,IAAA,wBAAgB,EAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC;IAEM,UAAU,CAAC,IAAiB;QACjC,OAAO,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC;IAEM,YAAY,CAAC,IAAa;QAC/B,OAAO,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;IAEM,MAAM,CAAC,IAAa,EAAE,WAAmB,EAAE,WAAkC,EAAE,CAAC,kBAAkB,CAAC,KAAK;QAC7G,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;YACpB,QAAQ;YACR,IAAI,EAAE,CAAC;YACP,MAAM,EAAE,SAAS;YACjB,WAAW;YACX,IAAI,EAAE,IAAI,CAAC,UAAU;YACrB,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;YACrC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;SACvC,CAAC,CAAC;IACL,CAAC;IAEM,iBAAiB,CAAC,IAAa,EAAE,QAAoC;QAC1E,MAAM,QAAQ,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,2CAA2C;QAC3C,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CACT,IAAI,EACJ,4BAA4B,QAAQ,oEAAoE,QAAQ,gCAAgC,CACjJ,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CACT,IAAI,EACJ,4BAA4B,QAAQ,8DAA8D,CACnG,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACI,gBAAgB,CAAC,GAAW;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAClC,OAAO,GAAG,GAAG,CAAC,EAAE,CAAC;YACf,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;YACtB,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;gBACf,OAAO,KAAK,CAAC;YACf,CAAC;YACD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC1C,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;OAIG;IACI,mBAAmB,CAAC,GAAa,EAAE,MAAM,GAAG,EAAE,EAAE,SAAS,GAAG,EAAE;QACnE,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,6DAA6D;QAC7D,MAAM,aAAa,GAAG,IAAA,oBAAQ,EAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,YAAY,EAAE,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QACxG,MAAM,QAAQ,GAAG,EAAE,CAAC;QAEpB,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;YAClC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC3B,QAAQ,CAAC,IAAI,CAAC,IAAA,0BAAc,EAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACtF,CAAC;QACH,CAAC;QAED,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC;IACpE,CAAC;IAED;;OAEG;IACK,QAAQ,CAAC,IAAa;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAE7B,+FAA+F;QAC/F,gGAAgG;QAChG,gGAAgG;QAChG,mEAAmE;QACnE,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,EAAE,CAAC,UAAU,CAAC,cAAc;gBAC/B,gDAAgD;gBAChD,OAAO,kBAAS,CAAC;YACnB,KAAK,EAAE,CAAC,UAAU,CAAC,UAAU;gBAC3B,OAAO,OAAO,CAAC,UAAU,CAAC,IAAqB,EAAE,IAAI,CAAC,CAAC;YACzD,KAAK,EAAE,CAAC,UAAU,CAAC,uBAAuB;gBACxC,OAAO,OAAO,CAAC,eAAe,CAAC,IAAA,6BAAmB,EAAC,IAAkC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;YACtG,KAAK,EAAE,CAAC,UAAU,CAAC,iBAAiB;gBAClC,OAAO,IAAI,cAAK,CACd,EAAE,EACF,IAAA,kCAAwB,EAAC,IAA4B,EAAE,IAAI,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CACrG,OAAO,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CACvC,EACD,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CACxC,CAAC;YACJ,KAAK,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC;YACjC,KAAK,EAAE,CAAC,UAAU,CAAC,6BAA6B;gBAC9C,OAAO,OAAO,CAAC,aAAa,CAAC,IAA2D,EAAE,IAAI,CAAC,CAAC;YAClG,KAAK,EAAE,CAAC,UAAU,CAAC,cAAc;gBAC/B,OAAO,OAAO,CAAC,cAAc,CAAC,IAAyB,EAAE,IAAI,CAAC,CAAC;YACjE,KAAK,EAAE,CAAC,UAAU,CAAC,mBAAmB;gBACpC,OAAO,OAAO,CAAC,mBAAmB,CAAC,IAA8B,EAAE,IAAI,CAAC,CAAC;YAC3E,KAAK,EAAE,CAAC,UAAU,CAAC,UAAU;gBAC3B,OAAO,OAAO,CAAC,UAAU,CAAC,IAAqB,EAAE,IAAI,CAAC,CAAC;YACzD,KAAK,EAAE,CAAC,UAAU,CAAC,KAAK;gBACtB,OAAO,OAAO,CAAC,KAAK,CAAC,IAAgB,EAAE,IAAI,CAAC,CAAC;YAC/C,KAAK,EAAE,CAAC,UAAU,CAAC,SAAS;gBAC1B,OAAO,OAAO,CAAC,oBAAoB,CAAC,IAA+B,EAAE,IAAI,CAAC,CAAC;YAC7E,KAAK,EAAE,CAAC,UAAU,CAAC,eAAe;gBAChC,OAAO,OAAO,CAAC,eAAe,CAAC,IAA0B,EAAE,IAAI,CAAC,CAAC;YACnE,KAAK,EAAE,CAAC,UAAU,CAAC,gBAAgB;gBACjC,OAAO,OAAO,CAAC,gBAAgB,CAAC,IAA2B,EAAE,IAAI,CAAC,CAAC;YACrE,KAAK,EAAE,CAAC,UAAU,CAAC,WAAW;gBAC5B,OAAO,OAAO,CAAC,WAAW,CAAC,IAAsB,EAAE,IAAI,CAAC,CAAC;YAC3D,KAAK,EAAE,CAAC,UAAU,CAAC,wBAAwB;gBACzC,MAAM,kBAAkB,GAAG,IAAI,CAAC,mBAAmB,EAAE,GAAG,CAAC,IAAmC,CAAC,CAAC;gBAC9F,OAAO,OAAO,CAAC,wBAAwB,CAAC,IAAmC,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAC;YACzG,KAAK,EAAE,CAAC,UAAU,CAAC,eAAe;gBAChC,OAAO,OAAO,CAAC,eAAe,CAAC,IAA0B,EAAE,IAAI,CAAC,CAAC;YACnE,KAAK,EAAE,CAAC,UAAU,CAAC,cAAc;gBAC/B,OAAO,OAAO,CAAC,cAAc,CAAC,IAAyB,EAAE,IAAI,CAAC,CAAC;YACjE,KAAK,EAAE,CAAC,UAAU,CAAC,mBAAmB;gBACpC,OAAO,OAAO,CAAC,mBAAmB,CAAC,IAA8B,EAAE,IAAI,CAAC,CAAC;YAC3E,KAAK,EAAE,CAAC,UAAU,CAAC,uBAAuB;gBACxC,OAAO,OAAO,CAAC,uBAAuB,CAAC,IAAkC,EAAE,IAAI,CAAC,CAAC;YACnF,KAAK,EAAE,CAAC,UAAU,CAAC,aAAa;gBAC9B,OAAO,OAAO,CAAC,aAAa,CAAC,IAAwB,EAAE,IAAI,CAAC,CAAC;YAC/D,KAAK,EAAE,CAAC,UAAU,CAAC,kBAAkB;gBACnC,OAAO,OAAO,CAAC,kBAAkB,CAAC,IAA6B,EAAE,IAAI,CAAC,CAAC;YACzE,KAAK,EAAE,CAAC,UAAU,CAAC,iBAAiB;gBAClC,OAAO,OAAO,CAAC,iBAAiB,CAAC,IAA4B,EAAE,IAAI,CAAC,CAAC;YACvE,KAAK,EAAE,CAAC,UAAU,CAAC,uBAAuB;gBACxC,OAAO,OAAO,CAAC,uBAAuB,CAAC,IAAkC,EAAE,IAAI,CAAC,CAAC;YACnF,KAAK,EAAE,CAAC,UAAU,CAAC,mBAAmB;gBACpC,OAAO,OAAO,CAAC,mBAAmB,CAAC,IAA8B,EAAE,IAAI,CAAC,CAAC;YAC3E,KAAK,EAAE,CAAC,UAAU,CAAC,sBAAsB;gBACvC,OAAO,OAAO,CAAC,sBAAsB,CAAC,IAAiC,EAAE,IAAI,CAAC,CAAC;YACjF,KAAK,EAAE,CAAC,UAAU,CAAC,2BAA2B;gBAC5C,OAAO,OAAO,CAAC,2BAA2B,CAAC,IAAsC,EAAE,IAAI,CAAC,CAAC;YAC3F,KAAK,EAAE,CAAC,UAAU,CAAC,cAAc;gBAC/B,OAAO,OAAO,CAAC,cAAc,CAAC,IAAyB,EAAE,IAAI,CAAC,CAAC;YACjE,KAAK,EAAE,CAAC,UAAU,CAAC,gBAAgB;gBACjC,OAAO,OAAO,CAAC,gBAAgB,CAAC,IAA2B,EAAE,IAAI,CAAC,CAAC;YACrE,KAAK,EAAE,CAAC,UAAU,CAAC,WAAW;gBAC5B,OAAO,OAAO,CAAC,sBAAsB,CAAC,IAAiC,EAAE,IAAI,CAAC,CAAC;YACjF,KAAK,EAAE,CAAC,UAAU,CAAC,mBAAmB;gBACpC,OAAO,OAAO,CAAC,mBAAmB,CAAC,IAA8B,EAAE,IAAI,CAAC,CAAC;YAC3E,KAAK,EAAE,CAAC,UAAU,CAAC,oBAAoB;gBACrC,OAAO,OAAO,CAAC,oBAAoB,CAAE,IAAgC,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YAC1F,KAAK,EAAE,CAAC,UAAU,CAAC,iBAAiB;gBAClC,OAAO,OAAO,CAAC,iBAAiB,CAAC,IAA4B,EAAE,IAAI,CAAC,CAAC;YACvE,KAAK,EAAE,CAAC,UAAU,CAAC,oBAAoB;gBACrC,OAAO,OAAO,CAAC,oBAAoB,CAAC,IAA+B,EAAE,IAAI,CAAC,CAAC;YAC7E,KAAK,EAAE,CAAC,UAAU,CAAC,iBAAiB;gBAClC,OAAO,OAAO,CAAC,iBAAiB,CAAC,IAA4B,EAAE,IAAI,CAAC,CAAC;YACvE,KAAK,EAAE,CAAC,UAAU,CAAC,eAAe;gBAChC,OAAO,OAAO,CAAC,eAAe,CAAC,IAA0B,EAAE,IAAI,CAAC,CAAC;YACnE,KAAK,EAAE,CAAC,UAAU,CAAC,YAAY;gBAC7B,OAAO,OAAO,CAAC,YAAY,CAAC,IAAuB,EAAE,IAAI,CAAC,CAAC;YAC7D,KAAK,EAAE,CAAC,UAAU,CAAC,qBAAqB;gBACtC,OAAO,OAAO,CAAC,qBAAqB,CAAC,IAAgC,EAAE,IAAI,CAAC,CAAC;YAC/E,KAAK,EAAE,CAAC,UAAU,CAAC,gBAAgB;gBACjC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;oBAChC,OAAO,OAAO,CAAC,QAAQ,CAAC,IAA2B,EAAE,IAAI,CAAC,CAAC;gBAC7D,CAAC;gBACD,OAAO,OAAO,CAAC,gBAAgB,CAAC,IAA2B,EAAE,IAAI,CAAC,CAAC;YACrE,KAAK,EAAE,CAAC,UAAU,CAAC,aAAa;gBAC9B,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;oBAChC,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAwB,EAAE,IAAI,CAAC,CAAC;gBAC1D,CAAC;gBACD,OAAO,OAAO,CAAC,aAAa,CAAC,IAAwB,EAAE,IAAI,CAAC,CAAC;YAC/D,KAAK,EAAE,CAAC,UAAU,CAAC,uBAAuB;gBACxC,OAAO,OAAO,CAAC,uBAAuB,CAAC,IAAkC,EAAE,IAAI,CAAC,CAAC;YACnF,KAAK,EAAE,CAAC,UAAU,CAAC,kBAAkB;gBACnC,OAAO,OAAO,CAAC,kBAAkB,CAAC,IAA6B,EAAE,IAAI,CAAC,CAAC;YACzE,KAAK,EAAE,CAAC,UAAU,CAAC,iBAAiB;gBAClC,OAAO,OAAO,CAAC,iBAAiB,CAAC,IAA4B,EAAE,IAAI,CAAC,CAAC;YACvE,KAAK,EAAE,CAAC,UAAU,CAAC,uBAAuB;gBACxC,OAAO,OAAO,CAAC,uBAAuB,CAAC,IAAkC,EAAE,IAAI,CAAC,CAAC;YACnF,KAAK,EAAE,CAAC,UAAU,CAAC,cAAc;gBAC/B,OAAO,OAAO,CAAC,qBAAqB,CAAC,IAAyB,EAAE,IAAI,CAAC,CAAC;YACxE,KAAK,EAAE,CAAC,UAAU,CAAC,YAAY;gBAC7B,OAAO,OAAO,CAAC,KAAK,CAAC,IAAgB,EAAE,IAAI,CAAC,CAAC;YAC/C;gBACE,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;oBACrB,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACnC,CAAC;gBACD,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;YACtC,qHAAqH;YACrH,OAAO,IAAI,cAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxC,CAAC;QACD,uEAAuE;QACvE,MAAM,QAAQ,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,OAAO,IAAI,sBAAa,CACtB,CAAC,IAAI,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EACtC,CAAC,IAAI,EAAE,GAAG,IAAA,wBAAY,EAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAC1D;YACE,MAAM,EAAE,CAAC;SACV,CACF,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACK,mBAAmB,CAAC,IAAa,EAAE,WAAkB;QAC3D,sCAAsC;QACtC,MAAM,aAAa,GAAG,IAAA,oBAAQ,EAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAE1G,MAAM,OAAO,GAAY,EAAE,CAAC;QAC5B,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;YAClC,IAAI,MAAM,GAAsB,SAAS,CAAC;YAC1C,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;gBACnB,KAAK,OAAO;oBACV,MAAM,GAAG,IAAI,cAAK,CAAC,CAAC,IAAA,0BAAc,EAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE;wBAC7F,UAAU,EAAE,MAAM,KAAK,CAAC,GAAG,EAAE;qBAC9B,CAAC,CAAC;oBACH,MAAM;gBACR,KAAK,aAAa,CAAC;gBACnB,KAAK,cAAc;oBACjB,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAChC,6BAA6B,CAAC,IAAA,qCAAyB,EAAC,KAAK,CAAC,EAAE,IAAI,CAAC,EACrE,IAAI,CACL,CAAC;oBACF,MAAM;gBAER,KAAK,WAAW;oBACd,MAAM;YACV,CAAC;YACD,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;gBACnB,4EAA4E;gBAC5E,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;gBACrC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAED,0DAA0D;QAE1D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YAC/C,OAAO,IAAI,cAAK,CAAC,CAAC,GAAG,OAAO,EAAE,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC;CACF;AAvYD,kCAuYC;AAyED,SAAgB,KAAK,CAAI,IAAa,EAAE,OAAuB,EAAE,UAAuC,EAAE;IACxG,MAAM,QAAQ,GAAG,IAAA,wBAAY,EAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnE,IAAI,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,UAAU,KAAK,kBAAkB,EAAE,CAAC;QACtC,mEAAmE;QACnE,UAAU,GAAG,gBAAgB,CAAC;IAChC,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,IAAI,UAAU,EAAE,CAAC,CAAC;IACjC,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,cAAc,GAAG,CAAC,CAAC;IAC5C,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAEjC,OAAO,IAAI,sBAAa,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;QAC1F,MAAM,EAAE,CAAC;QACT,MAAM,EAAE,GAAG;QACX,SAAS,EAAE,IAAI;QACf,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;AACL,CAAC;AArBD,sBAqBC;AAiBD,SAAS,aAAa,CAAC,KAAyB;IAC9C,OAAO,gBAAgB,CAAC,KAAK,CAAC;SAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;SAChD,MAAM,CAAC,YAAY,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAyB;IACjD,MAAM,GAAG,GAAqB,EAAE,CAAC;IAEjC,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,WAAW,GAAG,IAAA,wCAA4B,EAAC,IAAI,CAAC,CAAC;QACvD,IAAI,OAAO,IAAI,WAAW,EAAE,CAAC;YAC3B,OAAO,GAAG,KAAK,CAAC;QAClB,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;QAEzC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,IAAA,wCAA4B,EAAC,IAAI,CAAC,CAAC;YACnD,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,YAAY,CAAI,CAAgB;IACvC,OAAO,CAAC,KAAK,SAAS,CAAC;AACzB,CAAC;AAmBD,SAAS,6BAA6B,CAAC,GAAoB,EAAE,QAA0B;IACrF,OAAO;QACL,kBAAkB,EAAE,GAAG,CAAC,kBAAkB;QAC1C,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC;QACvC,UAAU,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC;KAC/C,CAAC;AACJ,CAAC","sourcesContent":["import * as ts from 'typescript';\n\nimport { TargetLanguage } from './languages';\nimport { NO_SYNTAX, OTree, UnknownSyntax, Span } from './o-tree';\nimport { SubmoduleReference, SubmoduleReferenceMap } from './submodule-reference';\nimport {\n commentRangeFromTextRange,\n extractMaskingVoidExpression,\n extractShowingVoidExpression,\n nodeChildren,\n repeatNewlines,\n scanText,\n} from './typescript/ast-utils';\nimport { analyzeImportDeclaration, analyzeImportEquals, ImportStatement } from './typescript/imports';\nimport { typeOfExpression, inferredTypeOfExpression } from './typescript/types';\n\n/**\n * Render a TypeScript AST to some other representation (encoded in OTrees)\n *\n * Dispatch the actual conversion to a specific handler which will get the\n * appropriate method called for particular AST nodes. The handler may use\n * context to modify its own operations when traversing the tree hierarchy,\n * the type of which should be expressed via the C parameter.\n */\nexport class AstRenderer<C> {\n public readonly diagnostics = new Array<ts.Diagnostic>();\n public readonly currentContext: C;\n\n public constructor(\n private readonly sourceFile: ts.SourceFile,\n public readonly typeChecker: ts.TypeChecker,\n private readonly handler: AstHandler<C>,\n private readonly options: AstRendererOptions = {},\n public readonly submoduleReferences: SubmoduleReferenceMap = new Map(),\n ) {\n this.currentContext = handler.defaultContext;\n }\n\n /**\n * Merge the new context with the current context and create a new Converter from it\n */\n public updateContext(contextUpdate: Partial<C>): AstRenderer<C> {\n const newContext = this.handler.mergeContext(this.currentContext, contextUpdate);\n\n // Use prototypal inheritance to create a version of 'this' in which only\n // 'currentContext' is updated.\n return Object.assign(Object.create(this), {\n currentContext: newContext,\n });\n }\n\n /**\n * Convert a single node to an OTree\n */\n public convert(node: ts.Node | undefined): OTree {\n if (node === undefined) {\n return NO_SYNTAX;\n }\n\n // Basic transform of node\n const transformed = this.dispatch(node);\n transformed.setSpan(node.getStart(this.sourceFile), node.getEnd());\n if (!transformed.attachComment) {\n return transformed;\n }\n\n const withTrivia = this.attachLeadingTrivia(node, transformed);\n withTrivia.setSpan(node.getStart(this.sourceFile), node.getEnd());\n return withTrivia;\n }\n\n /**\n * Convert a set of nodes, filtering out hidden nodes\n */\n public convertAll(nodes: readonly ts.Node[]): OTree[] {\n return filterVisible(nodes).map(this.convert.bind(this));\n }\n\n public convertWithModifier(\n nodes: readonly ts.Node[],\n makeContext: (context: this, node: ts.Node, index: number) => AstRenderer<C>,\n ): OTree[] {\n const vis = assignVisibility(nodes);\n const result = new Array<OTree>();\n for (const [idx, { node, visible, maskingVoid }] of vis.entries()) {\n const renderedNode = visible ? node : maskingVoid;\n if (renderedNode) {\n const context = makeContext(this, renderedNode, idx);\n result.push(context.convert(renderedNode));\n }\n }\n return result;\n }\n\n /**\n * Convert a set of nodes, but update the context for the last one.\n *\n * Takes visibility into account.\n */\n public convertLastDifferently(nodes: readonly ts.Node[], lastContext: C): OTree[] {\n const lastConverter = this.updateContext(lastContext);\n\n const convert = this.convert.bind(this);\n const lastConvert = lastConverter.convert.bind(lastConverter);\n\n const ret: OTree[] = [];\n\n const vis = assignVisibility(nodes);\n for (let i = 0; i < vis.length; i++) {\n const whichConvert = i === vis.length - 1 ? lastConvert : convert;\n\n const node = vis[i].visible ? vis[i].node : vis[i].maskingVoid;\n if (node) {\n ret.push(whichConvert(node));\n }\n }\n\n return ret;\n }\n\n public getPosition(node: ts.Node): Span {\n return {\n start: node.getStart(this.sourceFile),\n end: node.getEnd(),\n };\n }\n\n public textOf(node: ts.Node): string {\n return node.getText(this.sourceFile);\n }\n\n public textAt(pos: number, end: number): string {\n return this.sourceFile.text.substring(pos, end);\n }\n\n /**\n * Infer type of expression by the argument it is assigned to\n *\n * If the type of the expression can include undefined (if the value is\n * optional), `undefined` will be removed from the union.\n *\n * (Will return undefined for object literals not unified with a declared type)\n *\n * @deprecated Use `inferredTypeOfExpression` instead\n */\n public inferredTypeOfExpression(node: ts.Expression) {\n return inferredTypeOfExpression(this.typeChecker, node);\n }\n\n /**\n * Type of expression from the text of the expression\n *\n * (Will return a map type for object literals)\n *\n * @deprecated Use `typeOfExpression` directly\n */\n public typeOfExpression(node: ts.Expression): ts.Type {\n return typeOfExpression(this.typeChecker, node);\n }\n\n public typeOfType(node: ts.TypeNode): ts.Type {\n return this.typeChecker.getTypeFromTypeNode(node);\n }\n\n public typeToString(type: ts.Type) {\n return this.typeChecker.typeToString(type);\n }\n\n public report(node: ts.Node, messageText: string, category: ts.DiagnosticCategory = ts.DiagnosticCategory.Error) {\n this.diagnostics.push({\n category,\n code: 0,\n source: 'rosetta',\n messageText,\n file: this.sourceFile,\n start: node.getStart(this.sourceFile),\n length: node.getWidth(this.sourceFile),\n });\n }\n\n public reportUnsupported(node: ts.Node, language: TargetLanguage | undefined): void {\n const nodeKind = ts.SyntaxKind[node.kind];\n // tslint:disable-next-line:max-line-length\n if (language) {\n this.report(\n node,\n `This TypeScript feature (${nodeKind}) is not supported in examples because we cannot translate it to ${language}. Please rewrite this example.`,\n );\n } else {\n this.report(\n node,\n `This TypeScript feature (${nodeKind}) is not supported in examples. Please rewrite this example.`,\n );\n }\n }\n\n /**\n * Whether there is non-whitespace on the same line before the given position\n */\n public codeOnLineBefore(pos: number) {\n const text = this.sourceFile.text;\n while (pos > 0) {\n const c = text[--pos];\n if (c === '\\n') {\n return false;\n }\n if (c !== ' ' && c !== '\\r' && c !== '\\t') {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Return a newline if the given node is preceded by at least one newline\n *\n * Used to mirror newline use between matchin brackets (such as { ... } and [ ... ]).\n */\n public mirrorNewlineBefore(viz?: ts.Node, suffix = '', otherwise = ''): string {\n if (viz === undefined) {\n return suffix;\n }\n\n // Return a newline if the given node is preceded by newlines\n const leadingRanges = scanText(this.sourceFile.text, viz.getFullStart(), viz.getStart(this.sourceFile));\n const newlines = [];\n\n for (const range of leadingRanges) {\n if (range.type === 'other') {\n newlines.push(repeatNewlines(this.sourceFile.text.substring(range.pos, range.end)));\n }\n }\n\n return (newlines.join('').length > 0 ? '\\n' : otherwise) + suffix;\n }\n\n /**\n * Dispatch node to handler\n */\n private dispatch(tree: ts.Node): OTree {\n const visitor = this.handler;\n\n // Using a switch on tree.kind + forced down-casting, because this is significantly faster than\n // doing a cascade of `if` statements with the `ts.is<NodeType>` functions, since `tree.kind` is\n // effectively integers, and this switch statement is hence optimizable to a jump table. This is\n // a VERY significant enhancement to the debugging experience, too.\n switch (tree.kind) {\n case ts.SyntaxKind.EmptyStatement:\n // Additional semicolon where it doesn't belong.\n return NO_SYNTAX;\n case ts.SyntaxKind.SourceFile:\n return visitor.sourceFile(tree as ts.SourceFile, this);\n case ts.SyntaxKind.ImportEqualsDeclaration:\n return visitor.importStatement(analyzeImportEquals(tree as ts.ImportEqualsDeclaration, this), this);\n case ts.SyntaxKind.ImportDeclaration:\n return new OTree(\n [],\n analyzeImportDeclaration(tree as ts.ImportDeclaration, this, this.submoduleReferences).map((import_) =>\n visitor.importStatement(import_, this),\n ),\n { canBreakLine: true, separator: '\\n' },\n );\n case ts.SyntaxKind.StringLiteral:\n case ts.SyntaxKind.NoSubstitutionTemplateLiteral:\n return visitor.stringLiteral(tree as ts.StringLiteral | ts.NoSubstitutionTemplateLiteral, this);\n case ts.SyntaxKind.NumericLiteral:\n return visitor.numericLiteral(tree as ts.NumericLiteral, this);\n case ts.SyntaxKind.FunctionDeclaration:\n return visitor.functionDeclaration(tree as ts.FunctionDeclaration, this);\n case ts.SyntaxKind.Identifier:\n return visitor.identifier(tree as ts.Identifier, this);\n case ts.SyntaxKind.Block:\n return visitor.block(tree as ts.Block, this);\n case ts.SyntaxKind.Parameter:\n return visitor.parameterDeclaration(tree as ts.ParameterDeclaration, this);\n case ts.SyntaxKind.ReturnStatement:\n return visitor.returnStatement(tree as ts.ReturnStatement, this);\n case ts.SyntaxKind.BinaryExpression:\n return visitor.binaryExpression(tree as ts.BinaryExpression, this);\n case ts.SyntaxKind.IfStatement:\n return visitor.ifStatement(tree as ts.IfStatement, this);\n case ts.SyntaxKind.PropertyAccessExpression:\n const submoduleReference = this.submoduleReferences?.get(tree as ts.PropertyAccessExpression);\n return visitor.propertyAccessExpression(tree as ts.PropertyAccessExpression, this, submoduleReference);\n case ts.SyntaxKind.AwaitExpression:\n return visitor.awaitExpression(tree as ts.AwaitExpression, this);\n case ts.SyntaxKind.CallExpression:\n return visitor.callExpression(tree as ts.CallExpression, this);\n case ts.SyntaxKind.ExpressionStatement:\n return visitor.expressionStatement(tree as ts.ExpressionStatement, this);\n case ts.SyntaxKind.ObjectLiteralExpression:\n return visitor.objectLiteralExpression(tree as ts.ObjectLiteralExpression, this);\n case ts.SyntaxKind.NewExpression:\n return visitor.newExpression(tree as ts.NewExpression, this);\n case ts.SyntaxKind.PropertyAssignment:\n return visitor.propertyAssignment(tree as ts.PropertyAssignment, this);\n case ts.SyntaxKind.VariableStatement:\n return visitor.variableStatement(tree as ts.VariableStatement, this);\n case ts.SyntaxKind.VariableDeclarationList:\n return visitor.variableDeclarationList(tree as ts.VariableDeclarationList, this);\n case ts.SyntaxKind.VariableDeclaration:\n return visitor.variableDeclaration(tree as ts.VariableDeclaration, this);\n case ts.SyntaxKind.ArrayLiteralExpression:\n return visitor.arrayLiteralExpression(tree as ts.ArrayLiteralExpression, this);\n case ts.SyntaxKind.ShorthandPropertyAssignment:\n return visitor.shorthandPropertyAssignment(tree as ts.ShorthandPropertyAssignment, this);\n case ts.SyntaxKind.ForOfStatement:\n return visitor.forOfStatement(tree as ts.ForOfStatement, this);\n case ts.SyntaxKind.ClassDeclaration:\n return visitor.classDeclaration(tree as ts.ClassDeclaration, this);\n case ts.SyntaxKind.Constructor:\n return visitor.constructorDeclaration(tree as ts.ConstructorDeclaration, this);\n case ts.SyntaxKind.PropertyDeclaration:\n return visitor.propertyDeclaration(tree as ts.PropertyDeclaration, this);\n case ts.SyntaxKind.ComputedPropertyName:\n return visitor.computedPropertyName((tree as ts.ComputedPropertyName).expression, this);\n case ts.SyntaxKind.MethodDeclaration:\n return visitor.methodDeclaration(tree as ts.MethodDeclaration, this);\n case ts.SyntaxKind.InterfaceDeclaration:\n return visitor.interfaceDeclaration(tree as ts.InterfaceDeclaration, this);\n case ts.SyntaxKind.PropertySignature:\n return visitor.propertySignature(tree as ts.PropertySignature, this);\n case ts.SyntaxKind.MethodSignature:\n return visitor.methodSignature(tree as ts.MethodSignature, this);\n case ts.SyntaxKind.AsExpression:\n return visitor.asExpression(tree as ts.AsExpression, this);\n case ts.SyntaxKind.PrefixUnaryExpression:\n return visitor.prefixUnaryExpression(tree as ts.PrefixUnaryExpression, this);\n case ts.SyntaxKind.SpreadAssignment:\n if (this.textOf(tree) === '...') {\n return visitor.ellipsis(tree as ts.SpreadAssignment, this);\n }\n return visitor.spreadAssignment(tree as ts.SpreadAssignment, this);\n case ts.SyntaxKind.SpreadElement:\n if (this.textOf(tree) === '...') {\n return visitor.ellipsis(tree as ts.SpreadElement, this);\n }\n return visitor.spreadElement(tree as ts.SpreadElement, this);\n case ts.SyntaxKind.ElementAccessExpression:\n return visitor.elementAccessExpression(tree as ts.ElementAccessExpression, this);\n case ts.SyntaxKind.TemplateExpression:\n return visitor.templateExpression(tree as ts.TemplateExpression, this);\n case ts.SyntaxKind.NonNullExpression:\n return visitor.nonNullExpression(tree as ts.NonNullExpression, this);\n case ts.SyntaxKind.ParenthesizedExpression:\n return visitor.parenthesizedExpression(tree as ts.ParenthesizedExpression, this);\n case ts.SyntaxKind.VoidExpression:\n return visitor.maskingVoidExpression(tree as ts.VoidExpression, this);\n case ts.SyntaxKind.JSDocComment:\n return visitor.jsDoc(tree as ts.JSDoc, this);\n default:\n if (ts.isToken(tree)) {\n return visitor.token(tree, this);\n }\n this.reportUnsupported(tree, undefined);\n }\n\n if (this.options.bestEffort !== false) {\n // When doing best-effort conversion and we don't understand the node type, just return the complete text of it as-is\n return new OTree([this.textOf(tree)]);\n }\n // Otherwise, show a placeholder indicating we don't recognize the type\n const nodeKind = ts.SyntaxKind[tree.kind];\n return new UnknownSyntax(\n [`<${nodeKind} ${this.textOf(tree)}>`],\n ['\\n', ...nodeChildren(tree).map(this.convert.bind(this))],\n {\n indent: 2,\n },\n );\n }\n\n /**\n * Attach any leading whitespace and comments to the given output tree\n *\n * Regardless of whether it's declared to be able to accept such or not.\n */\n private attachLeadingTrivia(node: ts.Node, transformed: OTree): OTree {\n // Add comments and leading whitespace\n const leadingRanges = scanText(this.sourceFile.text, node.getFullStart(), node.getStart(this.sourceFile));\n\n const precede: OTree[] = [];\n for (const range of leadingRanges) {\n let trivia: OTree | undefined = undefined;\n switch (range.type) {\n case 'other':\n trivia = new OTree([repeatNewlines(this.sourceFile.text.substring(range.pos, range.end))], [], {\n renderOnce: `ws-${range.pos}`,\n });\n break;\n case 'linecomment':\n case 'blockcomment':\n trivia = this.handler.commentRange(\n commentSyntaxFromCommentRange(commentRangeFromTextRange(range), this),\n this,\n );\n break;\n\n case 'directive':\n break;\n }\n if (trivia != null) {\n // Set spans on comments to make sure their visibility is toggled correctly.\n trivia.setSpan(range.pos, range.end);\n precede.push(trivia);\n }\n }\n\n // FIXME: No trailing comments for now, they're too tricky\n\n if (precede.length > 0 && !transformed.isEmpty) {\n return new OTree([...precede, transformed], [], { canBreakLine: true });\n }\n return transformed;\n }\n}\n\n/**\n * Interface for AST handlers\n *\n * C is the type of hierarchical context the handler uses. Context\n * needs 2 operations: a constructor for a default context, and a\n * merge operation to combine 2 contexts to yield a new one.\n *\n * Otherwise, the handler should return an OTree for every type\n * of AST node.\n */\nexport interface AstHandler<C> {\n readonly language: TargetLanguage;\n\n readonly defaultContext: C;\n readonly indentChar?: ' ' | '\\t';\n mergeContext(old: C, update: Partial<C>): C;\n\n sourceFile(node: ts.SourceFile, context: AstRenderer<C>): OTree;\n commentRange(node: CommentSyntax, context: AstRenderer<C>): OTree;\n importStatement(node: ImportStatement, context: AstRenderer<C>): OTree;\n stringLiteral(node: ts.StringLiteral | ts.NoSubstitutionTemplateLiteral, children: AstRenderer<C>): OTree;\n numericLiteral(node: ts.NumericLiteral, children: AstRenderer<C>): OTree;\n functionDeclaration(node: ts.FunctionDeclaration, children: AstRenderer<C>): OTree;\n identifier(node: ts.Identifier, children: AstRenderer<C>): OTree;\n block(node: ts.Block, children: AstRenderer<C>): OTree;\n parameterDeclaration(node: ts.ParameterDeclaration, children: AstRenderer<C>): OTree;\n returnStatement(node: ts.ReturnStatement, context: AstRenderer<C>): OTree;\n binaryExpression(node: ts.BinaryExpression, context: AstRenderer<C>): OTree;\n ifStatement(node: ts.IfStatement, context: AstRenderer<C>): OTree;\n propertyAccessExpression(\n node: ts.PropertyAccessExpression,\n context: AstRenderer<C>,\n submoduleReference: SubmoduleReference | undefined,\n ): OTree;\n awaitExpression(node: ts.AwaitExpression, context: AstRenderer<C>): OTree;\n callExpression(node: ts.CallExpression, context: AstRenderer<C>): OTree;\n expressionStatement(node: ts.ExpressionStatement, context: AstRenderer<C>): OTree;\n token<A extends ts.SyntaxKind>(node: ts.Token<A>, context: AstRenderer<C>): OTree;\n objectLiteralExpression(node: ts.ObjectLiteralExpression, context: AstRenderer<C>): OTree;\n newExpression(node: ts.NewExpression, context: AstRenderer<C>): OTree;\n propertyAssignment(node: ts.PropertyAssignment, context: AstRenderer<C>): OTree;\n variableStatement(node: ts.VariableStatement, context: AstRenderer<C>): OTree;\n variableDeclarationList(node: ts.VariableDeclarationList, context: AstRenderer<C>): OTree;\n variableDeclaration(node: ts.VariableDeclaration, context: AstRenderer<C>): OTree;\n jsDoc(node: ts.JSDoc, context: AstRenderer<C>): OTree;\n arrayLiteralExpression(node: ts.ArrayLiteralExpression, context: AstRenderer<C>): OTree;\n shorthandPropertyAssignment(node: ts.ShorthandPropertyAssignment, context: AstRenderer<C>): OTree;\n forOfStatement(node: ts.ForOfStatement, context: AstRenderer<C>): OTree;\n classDeclaration(node: ts.ClassDeclaration, context: AstRenderer<C>): OTree;\n constructorDeclaration(node: ts.ConstructorDeclaration, context: AstRenderer<C>): OTree;\n propertyDeclaration(node: ts.PropertyDeclaration, context: AstRenderer<C>): OTree;\n computedPropertyName(node: ts.Expression, context: AstRenderer<C>): OTree;\n methodDeclaration(node: ts.MethodDeclaration, context: AstRenderer<C>): OTree;\n interfaceDeclaration(node: ts.InterfaceDeclaration, context: AstRenderer<C>): OTree;\n propertySignature(node: ts.PropertySignature, context: AstRenderer<C>): OTree;\n methodSignature(node: ts.MethodSignature, context: AstRenderer<C>): OTree;\n asExpression(node: ts.AsExpression, context: AstRenderer<C>): OTree;\n prefixUnaryExpression(node: ts.PrefixUnaryExpression, context: AstRenderer<C>): OTree;\n spreadElement(node: ts.SpreadElement, context: AstRenderer<C>): OTree;\n spreadAssignment(node: ts.SpreadAssignment, context: AstRenderer<C>): OTree;\n templateExpression(node: ts.TemplateExpression, context: AstRenderer<C>): OTree;\n nonNullExpression(node: ts.NonNullExpression, context: AstRenderer<C>): OTree;\n parenthesizedExpression(node: ts.ParenthesizedExpression, context: AstRenderer<C>): OTree;\n maskingVoidExpression(node: ts.VoidExpression, context: AstRenderer<C>): OTree;\n elementAccessExpression(node: ts.ElementAccessExpression, context: AstRenderer<C>): OTree;\n\n // Not a node, called when we recognize a spread element/assignment that is only\n // '...' and nothing else.\n ellipsis(node: ts.SpreadElement | ts.SpreadAssignment, context: AstRenderer<C>): OTree;\n}\n\nexport function nimpl<C>(node: ts.Node, context: AstRenderer<C>, options: { additionalInfo?: string } = {}) {\n const children = nodeChildren(node).map((c) => context.convert(c));\n\n let syntaxKind = ts.SyntaxKind[node.kind];\n if (syntaxKind === 'FirstPunctuation') {\n // These have the same identifier but this name is more descriptive\n syntaxKind = 'OpenBraceToken';\n }\n\n const parts = [`(${syntaxKind}`];\n if (options.additionalInfo) {\n parts.push(`{${options.additionalInfo}}`);\n }\n parts.push(context.textOf(node));\n\n return new UnknownSyntax([parts.join(' ')], children.length > 0 ? ['\\n', ...children] : [], {\n indent: 2,\n suffix: ')',\n separator: '\\n',\n canBreakLine: true,\n });\n}\n\nexport interface AstRendererOptions {\n /**\n * If enabled, don't translate the text of unknown nodes\n *\n * @default true\n */\n bestEffort?: boolean;\n}\n\ninterface ClassifiedNode {\n node: ts.Node;\n visible: boolean;\n maskingVoid?: ts.VoidExpression;\n}\n\nfunction filterVisible(nodes: readonly ts.Node[]): ts.Node[] {\n return assignVisibility(nodes)\n .map((c) => (c.visible ? c.node : c.maskingVoid))\n .filter(notUndefined);\n}\n\nfunction assignVisibility(nodes: readonly ts.Node[]): ClassifiedNode[] {\n const ret: ClassifiedNode[] = [];\n\n let visible = true;\n for (const node of nodes) {\n const maskingVoid = extractMaskingVoidExpression(node);\n if (visible && maskingVoid) {\n visible = false;\n }\n\n ret.push({ node, maskingVoid, visible });\n\n if (!visible) {\n const showing = extractShowingVoidExpression(node);\n if (showing) {\n visible = true;\n }\n }\n }\n\n return ret;\n}\n\nfunction notUndefined<A>(x: A | undefined): x is A {\n return x !== undefined;\n}\n\n/**\n * Our own representation of comments\n *\n * (So we can synthesize 'em\n */\nexport interface CommentSyntax {\n pos: number;\n text: string;\n hasTrailingNewLine?: boolean;\n kind: ts.CommentKind;\n\n /**\n * Whether it's at the end of a code line (so we can render a separating space)\n */\n isTrailing?: boolean;\n}\n\nfunction commentSyntaxFromCommentRange(rng: ts.CommentRange, renderer: AstRenderer<any>): CommentSyntax {\n return {\n hasTrailingNewLine: rng.hasTrailingNewLine,\n kind: rng.kind,\n pos: rng.pos,\n text: renderer.textAt(rng.pos, rng.end),\n isTrailing: renderer.codeOnLineBefore(rng.pos),\n };\n}\n"]}
|
1
|
+
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"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","sourcesContent":["import * as ts from 'typescript';\n\nimport { TargetLanguage } from './languages';\nimport { NO_SYNTAX, OTree, UnknownSyntax, Span } from './o-tree';\nimport { SubmoduleReference, SubmoduleReferenceMap } from './submodule-reference';\nimport {\n commentRangeFromTextRange,\n extractMaskingVoidExpression,\n extractShowingVoidExpression,\n nodeChildren,\n repeatNewlines,\n scanText,\n} from './typescript/ast-utils';\nimport { analyzeImportDeclaration, analyzeImportEquals, ImportStatement } from './typescript/imports';\nimport { typeOfExpression, inferredTypeOfExpression } from './typescript/types';\n\n/**\n * Render a TypeScript AST to some other representation (encoded in OTrees)\n *\n * Dispatch the actual conversion to a specific handler which will get the\n * appropriate method called for particular AST nodes. The handler may use\n * context to modify its own operations when traversing the tree hierarchy,\n * the type of which should be expressed via the C parameter.\n */\nexport class AstRenderer<C> {\n public readonly diagnostics = new Array<ts.Diagnostic>();\n public readonly currentContext: C;\n\n public constructor(\n private readonly sourceFile: ts.SourceFile,\n public readonly typeChecker: ts.TypeChecker,\n private readonly handler: AstHandler<C>,\n private readonly options: AstRendererOptions = {},\n public readonly submoduleReferences: SubmoduleReferenceMap = new Map(),\n ) {\n this.currentContext = handler.defaultContext;\n }\n\n /**\n * Merge the new context with the current context and create a new Converter from it\n */\n public updateContext(contextUpdate: Partial<C>): AstRenderer<C> {\n const newContext = this.handler.mergeContext(this.currentContext, contextUpdate);\n\n // Use prototypal inheritance to create a version of 'this' in which only\n // 'currentContext' is updated.\n return Object.assign(Object.create(this), {\n currentContext: newContext,\n });\n }\n\n /**\n * Convert a single node to an OTree\n */\n public convert(node: ts.Node | undefined): OTree {\n if (node === undefined) {\n return NO_SYNTAX;\n }\n\n // Basic transform of node\n const transformed = this.dispatch(node);\n transformed.setSpan(node.getStart(this.sourceFile), node.getEnd());\n if (!transformed.attachComment) {\n return transformed;\n }\n\n const withTrivia = this.attachLeadingTrivia(node, transformed);\n withTrivia.setSpan(node.getStart(this.sourceFile), node.getEnd());\n return withTrivia;\n }\n\n /**\n * Convert a set of nodes, filtering out hidden nodes\n */\n public convertAll(nodes: readonly ts.Node[]): OTree[] {\n return filterVisible(nodes).map(this.convert.bind(this));\n }\n\n public convertWithModifier(\n nodes: readonly ts.Node[],\n makeContext: (context: this, node: ts.Node, index: number) => AstRenderer<C>,\n ): OTree[] {\n const vis = assignVisibility(nodes);\n const result = new Array<OTree>();\n for (const [idx, { node, visible, maskingVoid }] of vis.entries()) {\n const renderedNode = visible ? node : maskingVoid;\n if (renderedNode) {\n const context = makeContext(this, renderedNode, idx);\n result.push(context.convert(renderedNode));\n }\n }\n return result;\n }\n\n /**\n * Convert a set of nodes, but update the context for the last one.\n *\n * Takes visibility into account.\n */\n public convertLastDifferently(nodes: readonly ts.Node[], lastContext: C): OTree[] {\n const lastConverter = this.updateContext(lastContext);\n\n const convert = this.convert.bind(this);\n const lastConvert = lastConverter.convert.bind(lastConverter);\n\n const ret: OTree[] = [];\n\n const vis = assignVisibility(nodes);\n for (let i = 0; i < vis.length; i++) {\n const whichConvert = i === vis.length - 1 ? lastConvert : convert;\n\n const node = vis[i].visible ? vis[i].node : vis[i].maskingVoid;\n if (node) {\n ret.push(whichConvert(node));\n }\n }\n\n return ret;\n }\n\n public getPosition(node: ts.Node): Span {\n return {\n start: node.getStart(this.sourceFile),\n end: node.getEnd(),\n };\n }\n\n public textOf(node: ts.Node): string {\n return node.getText(this.sourceFile);\n }\n\n public textAt(pos: number, end: number): string {\n return this.sourceFile.text.substring(pos, end);\n }\n\n /**\n * Infer type of expression by the argument it is assigned to\n *\n * If the type of the expression can include undefined (if the value is\n * optional), `undefined` will be removed from the union.\n *\n * (Will return undefined for object literals not unified with a declared type)\n *\n * @deprecated Use `inferredTypeOfExpression` instead\n */\n public inferredTypeOfExpression(node: ts.Expression) {\n return inferredTypeOfExpression(this.typeChecker, node);\n }\n\n /**\n * Type of expression from the text of the expression\n *\n * (Will return a map type for object literals)\n *\n * @deprecated Use `typeOfExpression` directly\n */\n public typeOfExpression(node: ts.Expression): ts.Type {\n return typeOfExpression(this.typeChecker, node);\n }\n\n public typeOfType(node: ts.TypeNode): ts.Type {\n return this.typeChecker.getTypeFromTypeNode(node);\n }\n\n public typeToString(type: ts.Type) {\n return this.typeChecker.typeToString(type);\n }\n\n public report(node: ts.Node, messageText: string, category: ts.DiagnosticCategory = ts.DiagnosticCategory.Error) {\n this.diagnostics.push({\n category,\n code: 0,\n source: 'rosetta',\n messageText,\n file: this.sourceFile,\n start: node.getStart(this.sourceFile),\n length: node.getWidth(this.sourceFile),\n });\n }\n\n public reportUnsupported(node: ts.Node, language: TargetLanguage | undefined): void {\n const nodeKind = ts.SyntaxKind[node.kind];\n // tslint:disable-next-line:max-line-length\n if (language) {\n this.report(\n node,\n `This TypeScript feature (${nodeKind}) is not supported in examples because we cannot translate it to ${language}. Please rewrite this example.`,\n );\n } else {\n this.report(\n node,\n `This TypeScript feature (${nodeKind}) is not supported in examples. Please rewrite this example.`,\n );\n }\n }\n\n /**\n * Whether there is non-whitespace on the same line before the given position\n */\n public codeOnLineBefore(pos: number) {\n const text = this.sourceFile.text;\n while (pos > 0) {\n const c = text[--pos];\n if (c === '\\n') {\n return false;\n }\n if (c !== ' ' && c !== '\\r' && c !== '\\t') {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Return a newline if the given node is preceded by at least one newline\n *\n * Used to mirror newline use between matchin brackets (such as { ... } and [ ... ]).\n */\n public mirrorNewlineBefore(viz?: ts.Node, suffix = '', otherwise = ''): string {\n if (viz === undefined) {\n return suffix;\n }\n\n // Return a newline if the given node is preceded by newlines\n const leadingRanges = scanText(this.sourceFile.text, viz.getFullStart(), viz.getStart(this.sourceFile));\n const newlines = [];\n\n for (const range of leadingRanges) {\n if (range.type === 'other') {\n newlines.push(repeatNewlines(this.sourceFile.text.substring(range.pos, range.end)));\n }\n }\n\n return (newlines.join('').length > 0 ? '\\n' : otherwise) + suffix;\n }\n\n /**\n * Dispatch node to handler\n */\n private dispatch(tree: ts.Node): OTree {\n const visitor = this.handler;\n\n // Using a switch on tree.kind + forced down-casting, because this is significantly faster than\n // doing a cascade of `if` statements with the `ts.is<NodeType>` functions, since `tree.kind` is\n // effectively integers, and this switch statement is hence optimizable to a jump table. This is\n // a VERY significant enhancement to the debugging experience, too.\n switch (tree.kind) {\n case ts.SyntaxKind.EmptyStatement:\n // Additional semicolon where it doesn't belong.\n return NO_SYNTAX;\n case ts.SyntaxKind.SourceFile:\n return visitor.sourceFile(tree as ts.SourceFile, this);\n case ts.SyntaxKind.ImportEqualsDeclaration:\n return visitor.importStatement(analyzeImportEquals(tree as ts.ImportEqualsDeclaration, this), this);\n case ts.SyntaxKind.ImportDeclaration:\n return new OTree(\n [],\n analyzeImportDeclaration(tree as ts.ImportDeclaration, this, this.submoduleReferences).map((import_) =>\n visitor.importStatement(import_, this),\n ),\n { canBreakLine: true, separator: '\\n' },\n );\n case ts.SyntaxKind.StringLiteral:\n case ts.SyntaxKind.NoSubstitutionTemplateLiteral:\n return visitor.stringLiteral(tree as ts.StringLiteral | ts.NoSubstitutionTemplateLiteral, this);\n case ts.SyntaxKind.NumericLiteral:\n return visitor.numericLiteral(tree as ts.NumericLiteral, this);\n case ts.SyntaxKind.FunctionDeclaration:\n return visitor.functionDeclaration(tree as ts.FunctionDeclaration, this);\n case ts.SyntaxKind.Identifier:\n return visitor.identifier(tree as ts.Identifier, this);\n case ts.SyntaxKind.Block:\n return visitor.block(tree as ts.Block, this);\n case ts.SyntaxKind.Parameter:\n return visitor.parameterDeclaration(tree as ts.ParameterDeclaration, this);\n case ts.SyntaxKind.ReturnStatement:\n return visitor.returnStatement(tree as ts.ReturnStatement, this);\n case ts.SyntaxKind.BinaryExpression:\n return visitor.binaryExpression(tree as ts.BinaryExpression, this);\n case ts.SyntaxKind.IfStatement:\n return visitor.ifStatement(tree as ts.IfStatement, this);\n case ts.SyntaxKind.PropertyAccessExpression:\n const submoduleReference = this.submoduleReferences?.get(tree as ts.PropertyAccessExpression);\n return visitor.propertyAccessExpression(tree as ts.PropertyAccessExpression, this, submoduleReference);\n case ts.SyntaxKind.AwaitExpression:\n return visitor.awaitExpression(tree as ts.AwaitExpression, this);\n case ts.SyntaxKind.CallExpression:\n return visitor.callExpression(tree as ts.CallExpression, this);\n case ts.SyntaxKind.ExpressionStatement:\n return visitor.expressionStatement(tree as ts.ExpressionStatement, this);\n case ts.SyntaxKind.ObjectLiteralExpression:\n return visitor.objectLiteralExpression(tree as ts.ObjectLiteralExpression, this);\n case ts.SyntaxKind.NewExpression:\n return visitor.newExpression(tree as ts.NewExpression, this);\n case ts.SyntaxKind.PropertyAssignment:\n return visitor.propertyAssignment(tree as ts.PropertyAssignment, this);\n case ts.SyntaxKind.VariableStatement:\n return visitor.variableStatement(tree as ts.VariableStatement, this);\n case ts.SyntaxKind.VariableDeclarationList:\n return visitor.variableDeclarationList(tree as ts.VariableDeclarationList, this);\n case ts.SyntaxKind.VariableDeclaration:\n return visitor.variableDeclaration(tree as ts.VariableDeclaration, this);\n case ts.SyntaxKind.ArrayLiteralExpression:\n return visitor.arrayLiteralExpression(tree as ts.ArrayLiteralExpression, this);\n case ts.SyntaxKind.ShorthandPropertyAssignment:\n return visitor.shorthandPropertyAssignment(tree as ts.ShorthandPropertyAssignment, this);\n case ts.SyntaxKind.ForOfStatement:\n return visitor.forOfStatement(tree as ts.ForOfStatement, this);\n case ts.SyntaxKind.ClassDeclaration:\n return visitor.classDeclaration(tree as ts.ClassDeclaration, this);\n case ts.SyntaxKind.Constructor:\n return visitor.constructorDeclaration(tree as ts.ConstructorDeclaration, this);\n case ts.SyntaxKind.PropertyDeclaration:\n return visitor.propertyDeclaration(tree as ts.PropertyDeclaration, this);\n case ts.SyntaxKind.ComputedPropertyName:\n return visitor.computedPropertyName((tree as ts.ComputedPropertyName).expression, this);\n case ts.SyntaxKind.MethodDeclaration:\n return visitor.methodDeclaration(tree as ts.MethodDeclaration, this);\n case ts.SyntaxKind.InterfaceDeclaration:\n return visitor.interfaceDeclaration(tree as ts.InterfaceDeclaration, this);\n case ts.SyntaxKind.PropertySignature:\n return visitor.propertySignature(tree as ts.PropertySignature, this);\n case ts.SyntaxKind.MethodSignature:\n return visitor.methodSignature(tree as ts.MethodSignature, this);\n case ts.SyntaxKind.AsExpression:\n return visitor.asExpression(tree as ts.AsExpression, this);\n case ts.SyntaxKind.PrefixUnaryExpression:\n return visitor.prefixUnaryExpression(tree as ts.PrefixUnaryExpression, this);\n case ts.SyntaxKind.SpreadAssignment:\n if (this.textOf(tree) === '...') {\n return visitor.ellipsis(tree as ts.SpreadAssignment, this);\n }\n return visitor.spreadAssignment(tree as ts.SpreadAssignment, this);\n case ts.SyntaxKind.SpreadElement:\n if (this.textOf(tree) === '...') {\n return visitor.ellipsis(tree as ts.SpreadElement, this);\n }\n return visitor.spreadElement(tree as ts.SpreadElement, this);\n case ts.SyntaxKind.ElementAccessExpression:\n return visitor.elementAccessExpression(tree as ts.ElementAccessExpression, this);\n case ts.SyntaxKind.TemplateExpression:\n return visitor.templateExpression(tree as ts.TemplateExpression, this);\n case ts.SyntaxKind.NonNullExpression:\n return visitor.nonNullExpression(tree as ts.NonNullExpression, this);\n case ts.SyntaxKind.ParenthesizedExpression:\n return visitor.parenthesizedExpression(tree as ts.ParenthesizedExpression, this);\n case ts.SyntaxKind.VoidExpression:\n return visitor.maskingVoidExpression(tree as ts.VoidExpression, this);\n case ts.SyntaxKind.JSDoc:\n case ts.SyntaxKind.JSDocComment:\n return visitor.jsDoc(tree as ts.JSDoc, this);\n default:\n if (ts.isToken(tree)) {\n return visitor.token(tree, this);\n }\n this.reportUnsupported(tree, undefined);\n }\n\n if (this.options.bestEffort !== false) {\n // When doing best-effort conversion and we don't understand the node type, just return the complete text of it as-is\n return new OTree([this.textOf(tree)]);\n }\n // Otherwise, show a placeholder indicating we don't recognize the type\n const nodeKind = ts.SyntaxKind[tree.kind];\n return new UnknownSyntax(\n [`<${nodeKind} ${this.textOf(tree)}>`],\n ['\\n', ...nodeChildren(tree).map(this.convert.bind(this))],\n {\n indent: 2,\n },\n );\n }\n\n /**\n * Attach any leading whitespace and comments to the given output tree\n *\n * Regardless of whether it's declared to be able to accept such or not.\n */\n private attachLeadingTrivia(node: ts.Node, transformed: OTree): OTree {\n // Add comments and leading whitespace\n const leadingRanges = scanText(this.sourceFile.text, node.getFullStart(), node.getStart(this.sourceFile));\n\n const precede: OTree[] = [];\n for (const range of leadingRanges) {\n let trivia: OTree | undefined = undefined;\n switch (range.type) {\n case 'other':\n trivia = new OTree([repeatNewlines(this.sourceFile.text.substring(range.pos, range.end))], [], {\n renderOnce: `ws-${range.pos}`,\n });\n break;\n case 'linecomment':\n case 'blockcomment':\n trivia = this.handler.commentRange(\n commentSyntaxFromCommentRange(commentRangeFromTextRange(range), this),\n this,\n );\n break;\n\n case 'directive':\n break;\n }\n if (trivia != null) {\n // Set spans on comments to make sure their visibility is toggled correctly.\n trivia.setSpan(range.pos, range.end);\n precede.push(trivia);\n }\n }\n\n // FIXME: No trailing comments for now, they're too tricky\n\n if (precede.length > 0 && !transformed.isEmpty) {\n return new OTree([...precede, transformed], [], { canBreakLine: true });\n }\n return transformed;\n }\n}\n\n/**\n * Interface for AST handlers\n *\n * C is the type of hierarchical context the handler uses. Context\n * needs 2 operations: a constructor for a default context, and a\n * merge operation to combine 2 contexts to yield a new one.\n *\n * Otherwise, the handler should return an OTree for every type\n * of AST node.\n */\nexport interface AstHandler<C> {\n readonly language: TargetLanguage;\n\n readonly defaultContext: C;\n readonly indentChar?: ' ' | '\\t';\n mergeContext(old: C, update: Partial<C>): C;\n\n sourceFile(node: ts.SourceFile, context: AstRenderer<C>): OTree;\n commentRange(node: CommentSyntax, context: AstRenderer<C>): OTree;\n importStatement(node: ImportStatement, context: AstRenderer<C>): OTree;\n stringLiteral(node: ts.StringLiteral | ts.NoSubstitutionTemplateLiteral, children: AstRenderer<C>): OTree;\n numericLiteral(node: ts.NumericLiteral, children: AstRenderer<C>): OTree;\n functionDeclaration(node: ts.FunctionDeclaration, children: AstRenderer<C>): OTree;\n identifier(node: ts.Identifier, children: AstRenderer<C>): OTree;\n block(node: ts.Block, children: AstRenderer<C>): OTree;\n parameterDeclaration(node: ts.ParameterDeclaration, children: AstRenderer<C>): OTree;\n returnStatement(node: ts.ReturnStatement, context: AstRenderer<C>): OTree;\n binaryExpression(node: ts.BinaryExpression, context: AstRenderer<C>): OTree;\n ifStatement(node: ts.IfStatement, context: AstRenderer<C>): OTree;\n propertyAccessExpression(\n node: ts.PropertyAccessExpression,\n context: AstRenderer<C>,\n submoduleReference: SubmoduleReference | undefined,\n ): OTree;\n awaitExpression(node: ts.AwaitExpression, context: AstRenderer<C>): OTree;\n callExpression(node: ts.CallExpression, context: AstRenderer<C>): OTree;\n expressionStatement(node: ts.ExpressionStatement, context: AstRenderer<C>): OTree;\n token<A extends ts.SyntaxKind>(node: ts.Token<A>, context: AstRenderer<C>): OTree;\n objectLiteralExpression(node: ts.ObjectLiteralExpression, context: AstRenderer<C>): OTree;\n newExpression(node: ts.NewExpression, context: AstRenderer<C>): OTree;\n propertyAssignment(node: ts.PropertyAssignment, context: AstRenderer<C>): OTree;\n variableStatement(node: ts.VariableStatement, context: AstRenderer<C>): OTree;\n variableDeclarationList(node: ts.VariableDeclarationList, context: AstRenderer<C>): OTree;\n variableDeclaration(node: ts.VariableDeclaration, context: AstRenderer<C>): OTree;\n jsDoc(node: ts.JSDoc, context: AstRenderer<C>): OTree;\n arrayLiteralExpression(node: ts.ArrayLiteralExpression, context: AstRenderer<C>): OTree;\n shorthandPropertyAssignment(node: ts.ShorthandPropertyAssignment, context: AstRenderer<C>): OTree;\n forOfStatement(node: ts.ForOfStatement, context: AstRenderer<C>): OTree;\n classDeclaration(node: ts.ClassDeclaration, context: AstRenderer<C>): OTree;\n constructorDeclaration(node: ts.ConstructorDeclaration, context: AstRenderer<C>): OTree;\n propertyDeclaration(node: ts.PropertyDeclaration, context: AstRenderer<C>): OTree;\n computedPropertyName(node: ts.Expression, context: AstRenderer<C>): OTree;\n methodDeclaration(node: ts.MethodDeclaration, context: AstRenderer<C>): OTree;\n interfaceDeclaration(node: ts.InterfaceDeclaration, context: AstRenderer<C>): OTree;\n propertySignature(node: ts.PropertySignature, context: AstRenderer<C>): OTree;\n methodSignature(node: ts.MethodSignature, context: AstRenderer<C>): OTree;\n asExpression(node: ts.AsExpression, context: AstRenderer<C>): OTree;\n prefixUnaryExpression(node: ts.PrefixUnaryExpression, context: AstRenderer<C>): OTree;\n spreadElement(node: ts.SpreadElement, context: AstRenderer<C>): OTree;\n spreadAssignment(node: ts.SpreadAssignment, context: AstRenderer<C>): OTree;\n templateExpression(node: ts.TemplateExpression, context: AstRenderer<C>): OTree;\n nonNullExpression(node: ts.NonNullExpression, context: AstRenderer<C>): OTree;\n parenthesizedExpression(node: ts.ParenthesizedExpression, context: AstRenderer<C>): OTree;\n maskingVoidExpression(node: ts.VoidExpression, context: AstRenderer<C>): OTree;\n elementAccessExpression(node: ts.ElementAccessExpression, context: AstRenderer<C>): OTree;\n\n // Not a node, called when we recognize a spread element/assignment that is only\n // '...' and nothing else.\n ellipsis(node: ts.SpreadElement | ts.SpreadAssignment, context: AstRenderer<C>): OTree;\n}\n\nexport function nimpl<C>(node: ts.Node, context: AstRenderer<C>, options: { additionalInfo?: string } = {}) {\n const children = nodeChildren(node).map((c) => context.convert(c));\n\n let syntaxKind = ts.SyntaxKind[node.kind];\n if (syntaxKind === 'FirstPunctuation') {\n // These have the same identifier but this name is more descriptive\n syntaxKind = 'OpenBraceToken';\n }\n\n const parts = [`(${syntaxKind}`];\n if (options.additionalInfo) {\n parts.push(`{${options.additionalInfo}}`);\n }\n parts.push(context.textOf(node));\n\n return new UnknownSyntax([parts.join(' ')], children.length > 0 ? ['\\n', ...children] : [], {\n indent: 2,\n suffix: ')',\n separator: '\\n',\n canBreakLine: true,\n });\n}\n\nexport interface AstRendererOptions {\n /**\n * If enabled, don't translate the text of unknown nodes\n *\n * @default true\n */\n bestEffort?: boolean;\n}\n\ninterface ClassifiedNode {\n node: ts.Node;\n visible: boolean;\n maskingVoid?: ts.VoidExpression;\n}\n\nfunction filterVisible(nodes: readonly ts.Node[]): ts.Node[] {\n return assignVisibility(nodes)\n .map((c) => (c.visible ? c.node : c.maskingVoid))\n .filter(notUndefined);\n}\n\nfunction assignVisibility(nodes: readonly ts.Node[]): ClassifiedNode[] {\n const ret: ClassifiedNode[] = [];\n\n let visible = true;\n for (const node of nodes) {\n const maskingVoid = extractMaskingVoidExpression(node);\n if (visible && maskingVoid) {\n visible = false;\n }\n\n ret.push({ node, maskingVoid, visible });\n\n if (!visible) {\n const showing = extractShowingVoidExpression(node);\n if (showing) {\n visible = true;\n }\n }\n }\n\n return ret;\n}\n\nfunction notUndefined<A>(x: A | undefined): x is A {\n return x !== undefined;\n}\n\n/**\n * Our own representation of comments\n *\n * (So we can synthesize 'em\n */\nexport interface CommentSyntax {\n pos: number;\n text: string;\n hasTrailingNewLine?: boolean;\n kind: ts.CommentKind;\n\n /**\n * Whether it's at the end of a code line (so we can render a separating space)\n */\n isTrailing?: boolean;\n}\n\nfunction commentSyntaxFromCommentRange(rng: ts.CommentRange, renderer: AstRenderer<any>): CommentSyntax {\n return {\n hasTrailingNewLine: rng.hasTrailingNewLine,\n kind: rng.kind,\n pos: rng.pos,\n text: renderer.textAt(rng.pos, rng.end),\n isTrailing: renderer.codeOnLineBefore(rng.pos),\n };\n}\n"]}
|
package/lib/rosetta-reader.d.ts
CHANGED