jsii-rosetta 5.4.32-dev.4 → 5.5.1-dev.0
Sign up to get free protection for your applications and to get access to all the features.
- 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 +2 -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 +3 -3
- package/releases.json +2 -2
package/lib/translate_all.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"translate_all.js","sourceRoot":"","sources":["../src/translate_all.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"translate_all.js","sourceRoot":"","sources":["../src/translate_all.ts"],"names":[],"mappings":";;AAoBA,oCAsCC;AA1DD,8BAA8B;AAC9B,kCAAkC;AAClC,yCAAyC;AAEzC,qCAAqC;AAErC,+CAAsD;AAItD;;;;;;;;;GASG;AACI,KAAK,UAAU,YAAY,CAChC,QAA6B,EAC7B,0BAAmC;IAEnC,6EAA6E;IAC7E,6EAA6E;IAC7E,qDAAqD;IACrD,2FAA2F;IAC3F,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,6BAA6B;QACjD,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC;QACrD,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxC,OAAO,CAAC,IAAI,CAAC,eAAe,UAAU,CAAC,MAAM,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAE7E,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,yBAAyB,CAAC,EAAE;QAC5E,UAAU,EAAE,CAAC;KACd,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,EAAE,0BAA0B,CAAC,CAAC;QAEvE,MAAM,SAAS,GAA6B,MAAM,OAAO,CAAC,GAAG,CAC3D,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAClE,CAAC;QAEF,MAAM,WAAW,GAAG,IAAI,KAAK,EAAqB,CAAC;QACnD,MAAM,kBAAkB,GAAG,IAAI,KAAK,EAAqB,CAAC;QAE1D,kBAAkB;QAClB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,WAAW,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;YAC1C,kBAAkB,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,iBAAiB,CAAC,GAAG,CAAC,2BAAiB,CAAC,UAAU,CAAC,CAAC,CAAC;QAC3F,CAAC;QACD,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;IAC7C,CAAC;YAAS,CAAC;QACT,yBAAyB;QACzB,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;IACxB,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CACpB,QAA6B,EAC7B,0BAAmC,EACnC,SAAS,GAAG,EAAE;IAEd,MAAM,GAAG,GAAG,EAAE,CAAC;IAEf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;QACpD,GAAG,CAAC,IAAI,CAAC;YACP,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC;YAC1C,0BAA0B;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC","sourcesContent":["import * as os from 'node:os';\nimport * as path from 'node:path';\nimport * as workerpool from 'workerpool';\n\nimport * as logging from './logging';\nimport { TypeScriptSnippet } from './snippet';\nimport { TranslatedSnippet } from './tablets/tablets';\nimport { RosettaDiagnostic } from './translate';\nimport type { TranslateBatchRequest, TranslateBatchResponse } from './translate_all_worker';\n\n/**\n * Divide the work evenly over all processors by running 'translate_all_worker' in Worker Threads, then combine results\n *\n * The workers are fed small queues of work each. We used to divide the entire queue into N\n * but since the work is divided unevenly that led to some workers stopping early, idling while\n * waiting for more work.\n *\n * Never include 'translate_all_worker' directly, only do TypeScript type references (so that in\n * the script we may assume that 'worker_threads' successfully imports).\n */\nexport async function translateAll(\n snippets: TypeScriptSnippet[],\n includeCompilerDiagnostics: boolean,\n): Promise<TranslateAllResult> {\n // Use about half the advertised cores because hyperthreading doesn't seem to\n // help that much, or we become I/O-bound at some point. On my machine, using\n // more than half the cores actually makes it slower.\n // Cap to a reasonable top-level limit to prevent thrash on machines with many, many cores.\n const N = process.env.JSII_ROSETTA_MAX_WORKER_COUNT\n ? parseInt(process.env.JSII_ROSETTA_MAX_WORKER_COUNT)\n : Math.min(16, Math.max(1, Math.ceil(os.cpus().length / 2)));\n const snippetArr = Array.from(snippets);\n logging.info(`Translating ${snippetArr.length} snippets using ${N} workers`);\n\n const pool = workerpool.pool(path.join(__dirname, 'translate_all_worker.js'), {\n maxWorkers: N,\n });\n\n try {\n const requests = batchSnippets(snippetArr, includeCompilerDiagnostics);\n\n const responses: TranslateBatchResponse[] = await Promise.all(\n requests.map((request) => pool.exec('translateBatch', [request])),\n );\n\n const diagnostics = new Array<RosettaDiagnostic>();\n const translatedSnippets = new Array<TranslatedSnippet>();\n\n // Combine results\n for (const response of responses) {\n diagnostics.push(...response.diagnostics);\n translatedSnippets.push(...response.translatedSchemas.map(TranslatedSnippet.fromSchema));\n }\n return { diagnostics, translatedSnippets };\n } finally {\n // Not waiting on purpose\n void pool.terminate();\n }\n}\n\nfunction batchSnippets(\n snippets: TypeScriptSnippet[],\n includeCompilerDiagnostics: boolean,\n batchSize = 10,\n): TranslateBatchRequest[] {\n const ret = [];\n\n for (let i = 0; i < snippets.length; i += batchSize) {\n ret.push({\n snippets: snippets.slice(i, i + batchSize),\n includeCompilerDiagnostics,\n });\n }\n\n return ret;\n}\n\nexport interface TranslateAllResult {\n translatedSnippets: TranslatedSnippet[];\n diagnostics: RosettaDiagnostic[];\n}\n"]}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.singleThreadedTranslateAll =
|
3
|
+
exports.singleThreadedTranslateAll = singleThreadedTranslateAll;
|
4
4
|
/**
|
5
5
|
* Pool worker for extract.ts
|
6
6
|
*/
|
@@ -33,6 +33,5 @@ function singleThreadedTranslateAll(snippets, includeCompilerDiagnostics) {
|
|
33
33
|
diagnostics: [...translator.diagnostics, ...failures],
|
34
34
|
};
|
35
35
|
}
|
36
|
-
exports.singleThreadedTranslateAll = singleThreadedTranslateAll;
|
37
36
|
workerpool.worker({ translateBatch });
|
38
37
|
//# sourceMappingURL=translate_all_worker.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"translate_all_worker.js","sourceRoot":"","sources":["../src/translate_all_worker.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"translate_all_worker.js","sourceRoot":"","sources":["../src/translate_all_worker.ts"],"names":[],"mappings":";;AAkCA,gEAuBC;AAzDD;;GAEG;AACH,yCAAyC;AAKzC,2CAAmF;AAcnF,SAAS,cAAc,CAAC,OAA8B;IACpD,MAAM,MAAM,GAAG,0BAA0B,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,0BAA0B,CAAC,CAAC;IAEhG,OAAO;QACL,iBAAiB,EAAE,MAAM,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QAClE,WAAW,EAAE,MAAM,CAAC,WAAW;KAChC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,0BAA0B,CACxC,QAA6B,EAC7B,0BAAmC;IAEnC,MAAM,kBAAkB,GAAG,IAAI,KAAK,EAAqB,CAAC;IAE1D,MAAM,QAAQ,GAAG,IAAI,KAAK,EAAqB,CAAC;IAEhD,MAAM,UAAU,GAAG,IAAI,sBAAU,CAAC,0BAA0B,CAAC,CAAC;IAC9D,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,QAAQ,CAAC,IAAI,CACX,IAAA,iCAAqB,EAAC,IAAI,EAAE,uCAAuC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,cAAc,EAAE,CAAC,CAC7G,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO;QACL,kBAAkB;QAClB,WAAW,EAAE,CAAC,GAAG,UAAU,CAAC,WAAW,EAAE,GAAG,QAAQ,CAAC;KACtD,CAAC;AACJ,CAAC;AAED,UAAU,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC","sourcesContent":["/**\n * Pool worker for extract.ts\n */\nimport * as workerpool from 'workerpool';\n\nimport { TypeScriptSnippet } from './snippet';\nimport { TranslatedSnippetSchema } from './tablets/schema';\nimport { TranslatedSnippet } from './tablets/tablets';\nimport { RosettaDiagnostic, Translator, makeRosettaDiagnostic } from './translate';\nimport { TranslateAllResult } from './translate_all';\n\nexport interface TranslateBatchRequest {\n readonly snippets: TypeScriptSnippet[];\n readonly includeCompilerDiagnostics: boolean;\n}\n\nexport interface TranslateBatchResponse {\n // Cannot be 'TranslatedSnippet' because needs to be serializable\n readonly translatedSchemas: TranslatedSnippetSchema[];\n readonly diagnostics: RosettaDiagnostic[];\n}\n\nfunction translateBatch(request: TranslateBatchRequest): TranslateBatchResponse {\n const result = singleThreadedTranslateAll(request.snippets, request.includeCompilerDiagnostics);\n\n return {\n translatedSchemas: result.translatedSnippets.map((s) => s.snippet),\n diagnostics: result.diagnostics,\n };\n}\n\n/**\n * Translate the given snippets using a single compiler\n */\nexport function singleThreadedTranslateAll(\n snippets: TypeScriptSnippet[],\n includeCompilerDiagnostics: boolean,\n): TranslateAllResult {\n const translatedSnippets = new Array<TranslatedSnippet>();\n\n const failures = new Array<RosettaDiagnostic>();\n\n const translator = new Translator(includeCompilerDiagnostics);\n for (const block of snippets) {\n try {\n translatedSnippets.push(translator.translate(block));\n } catch (e: any) {\n failures.push(\n makeRosettaDiagnostic(true, `rosetta: error translating snippet: ${e}\\n${e.stack}\\n${block.completeSource}`),\n );\n }\n }\n\n return {\n translatedSnippets,\n diagnostics: [...translator.diagnostics, ...failures],\n };\n}\n\nworkerpool.worker({ translateBatch });\n"]}
|
@@ -85,7 +85,7 @@ export declare function voidExpressionString(node: ts.VoidExpression): string |
|
|
85
85
|
export declare function extractVoidExpression(node: ts.Node): ts.VoidExpression | undefined;
|
86
86
|
export declare function quoteStringLiteral(x: string): string;
|
87
87
|
export declare function visibility(x: ts.AccessorDeclaration | ts.FunctionLikeDeclaration | ts.GetAccessorDeclaration | ts.PropertyDeclaration | ts.PropertySignature | ts.SetAccessorDeclaration): "private" | "protected" | "public";
|
88
|
-
export declare const isReadOnly: (x: ts.GetAccessorDeclaration | ts.SetAccessorDeclaration | ts.
|
88
|
+
export declare const isReadOnly: (x: ts.GetAccessorDeclaration | ts.SetAccessorDeclaration | ts.ArrowFunction | ts.ConstructorDeclaration | ts.FunctionDeclaration | ts.FunctionExpression | ts.MethodDeclaration | ts.PropertyDeclaration | ts.PropertySignature) => boolean;
|
89
89
|
export declare const isExported: (x: ts.Declaration) => boolean;
|
90
90
|
export declare const isPrivate: (x: ts.Declaration) => boolean;
|
91
91
|
export declare const isProtected: (x: ts.Declaration) => boolean;
|
@@ -1,6 +1,28 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.
|
3
|
+
exports.isStatic = exports.isProtected = exports.isPrivate = exports.isExported = exports.isReadOnly = exports.DONE = void 0;
|
4
|
+
exports.stripCommentMarkers = stripCommentMarkers;
|
5
|
+
exports.stringFromLiteral = stringFromLiteral;
|
6
|
+
exports.nodeChildren = nodeChildren;
|
7
|
+
exports.nodeOfType = nodeOfType;
|
8
|
+
exports.anyNode = anyNode;
|
9
|
+
exports.allOfType = allOfType;
|
10
|
+
exports.matchAst = matchAst;
|
11
|
+
exports.countNakedNewlines = countNakedNewlines;
|
12
|
+
exports.repeatNewlines = repeatNewlines;
|
13
|
+
exports.extractComments = extractComments;
|
14
|
+
exports.commentRangeFromTextRange = commentRangeFromTextRange;
|
15
|
+
exports.scanText = scanText;
|
16
|
+
exports.extractMaskingVoidExpression = extractMaskingVoidExpression;
|
17
|
+
exports.extractShowingVoidExpression = extractShowingVoidExpression;
|
18
|
+
exports.voidExpressionString = voidExpressionString;
|
19
|
+
exports.extractVoidExpression = extractVoidExpression;
|
20
|
+
exports.quoteStringLiteral = quoteStringLiteral;
|
21
|
+
exports.visibility = visibility;
|
22
|
+
exports.isPublic = isPublic;
|
23
|
+
exports.findSuperCall = findSuperCall;
|
24
|
+
exports.privatePropertyNames = privatePropertyNames;
|
25
|
+
exports.findEnclosingClassDeclaration = findEnclosingClassDeclaration;
|
4
26
|
const ts = require("typescript");
|
5
27
|
function stripCommentMarkers(comment, multiline) {
|
6
28
|
if (multiline) {
|
@@ -16,14 +38,12 @@ function stripCommentMarkers(comment, multiline) {
|
|
16
38
|
// The text *must* start with '//'
|
17
39
|
return comment.replace(/^[/]{2}[ \t]?/gm, '');
|
18
40
|
}
|
19
|
-
exports.stripCommentMarkers = stripCommentMarkers;
|
20
41
|
function stringFromLiteral(expr) {
|
21
42
|
if (ts.isStringLiteral(expr)) {
|
22
43
|
return expr.text;
|
23
44
|
}
|
24
45
|
return '???';
|
25
46
|
}
|
26
|
-
exports.stringFromLiteral = stringFromLiteral;
|
27
47
|
/**
|
28
48
|
* Return AST children of the given node
|
29
49
|
*
|
@@ -40,7 +60,6 @@ function nodeChildren(node) {
|
|
40
60
|
});
|
41
61
|
return ret;
|
42
62
|
}
|
43
|
-
exports.nodeChildren = nodeChildren;
|
44
63
|
// eslint-disable-next-line max-len
|
45
64
|
function nodeOfType(syntaxKindOrCaptureName, nodeTypeOrChildren, children) {
|
46
65
|
const capturing = typeof syntaxKindOrCaptureName === 'string'; // Determine which overload we're in (SyntaxKind is a number)
|
@@ -65,7 +84,6 @@ function nodeOfType(syntaxKindOrCaptureName, nodeTypeOrChildren, children) {
|
|
65
84
|
return undefined;
|
66
85
|
};
|
67
86
|
}
|
68
|
-
exports.nodeOfType = nodeOfType;
|
69
87
|
function anyNode(children) {
|
70
88
|
const realNext = children ?? exports.DONE;
|
71
89
|
return (nodes) => {
|
@@ -78,7 +96,6 @@ function anyNode(children) {
|
|
78
96
|
return undefined;
|
79
97
|
};
|
80
98
|
}
|
81
|
-
exports.anyNode = anyNode;
|
82
99
|
// Does not capture deeper because how would we even represent that?
|
83
100
|
function allOfType(s, name, children) {
|
84
101
|
const realNext = children ?? exports.DONE;
|
@@ -97,7 +114,6 @@ function allOfType(s, name, children) {
|
|
97
114
|
return ret;
|
98
115
|
};
|
99
116
|
}
|
100
|
-
exports.allOfType = allOfType;
|
101
117
|
const DONE = () => ({});
|
102
118
|
exports.DONE = DONE;
|
103
119
|
function matchAst(node, matcher, cb) {
|
@@ -110,7 +126,6 @@ function matchAst(node, matcher, cb) {
|
|
110
126
|
}
|
111
127
|
return matched;
|
112
128
|
}
|
113
|
-
exports.matchAst = matchAst;
|
114
129
|
/**
|
115
130
|
* Count the newlines in a given piece of string that aren't in comment blocks
|
116
131
|
*/
|
@@ -134,11 +149,9 @@ function countNakedNewlines(str) {
|
|
134
149
|
}
|
135
150
|
return ret;
|
136
151
|
}
|
137
|
-
exports.countNakedNewlines = countNakedNewlines;
|
138
152
|
function repeatNewlines(str) {
|
139
153
|
return '\n'.repeat(Math.min(2, countNakedNewlines(str)));
|
140
154
|
}
|
141
|
-
exports.repeatNewlines = repeatNewlines;
|
142
155
|
const WHITESPACE = [' ', '\t', '\r', '\n'];
|
143
156
|
/**
|
144
157
|
* Extract single-line and multi-line comments from the given string
|
@@ -150,7 +163,6 @@ function extractComments(text, start) {
|
|
150
163
|
.filter((s) => s.type === 'blockcomment' || s.type === 'linecomment')
|
151
164
|
.map(commentRangeFromTextRange);
|
152
165
|
}
|
153
|
-
exports.extractComments = extractComments;
|
154
166
|
function commentRangeFromTextRange(rng) {
|
155
167
|
return {
|
156
168
|
kind: rng.type === 'blockcomment' ? ts.SyntaxKind.MultiLineCommentTrivia : ts.SyntaxKind.SingleLineCommentTrivia,
|
@@ -159,7 +171,6 @@ function commentRangeFromTextRange(rng) {
|
|
159
171
|
hasTrailingNewLine: rng.type !== 'blockcomment' && rng.hasTrailingNewLine,
|
160
172
|
};
|
161
173
|
}
|
162
|
-
exports.commentRangeFromTextRange = commentRangeFromTextRange;
|
163
174
|
/**
|
164
175
|
* Extract spans of comments and non-comments out of the string
|
165
176
|
*
|
@@ -251,7 +262,6 @@ function scanText(text, start, end) {
|
|
251
262
|
return f;
|
252
263
|
}
|
253
264
|
}
|
254
|
-
exports.scanText = scanText;
|
255
265
|
const VOID_SHOW_KEYWORD = 'show';
|
256
266
|
function extractMaskingVoidExpression(node) {
|
257
267
|
const expr = extractVoidExpression(node);
|
@@ -263,7 +273,6 @@ function extractMaskingVoidExpression(node) {
|
|
263
273
|
}
|
264
274
|
return expr;
|
265
275
|
}
|
266
|
-
exports.extractMaskingVoidExpression = extractMaskingVoidExpression;
|
267
276
|
function extractShowingVoidExpression(node) {
|
268
277
|
const expr = extractVoidExpression(node);
|
269
278
|
if (!expr) {
|
@@ -274,7 +283,6 @@ function extractShowingVoidExpression(node) {
|
|
274
283
|
}
|
275
284
|
return undefined;
|
276
285
|
}
|
277
|
-
exports.extractShowingVoidExpression = extractShowingVoidExpression;
|
278
286
|
/**
|
279
287
|
* Return the string argument to a void expression if it exists
|
280
288
|
*/
|
@@ -284,7 +292,6 @@ function voidExpressionString(node) {
|
|
284
292
|
}
|
285
293
|
return undefined;
|
286
294
|
}
|
287
|
-
exports.voidExpressionString = voidExpressionString;
|
288
295
|
/**
|
289
296
|
* We use void directives as pragmas. Extract the void directives here
|
290
297
|
*/
|
@@ -303,11 +310,9 @@ function extractVoidExpression(node) {
|
|
303
310
|
}
|
304
311
|
return undefined;
|
305
312
|
}
|
306
|
-
exports.extractVoidExpression = extractVoidExpression;
|
307
313
|
function quoteStringLiteral(x) {
|
308
314
|
return x.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
309
315
|
}
|
310
|
-
exports.quoteStringLiteral = quoteStringLiteral;
|
311
316
|
function visibility(x) {
|
312
317
|
const flags = ts.getCombinedModifierFlags(x);
|
313
318
|
if (flags & ts.ModifierFlags.Private) {
|
@@ -318,7 +323,6 @@ function visibility(x) {
|
|
318
323
|
}
|
319
324
|
return 'public';
|
320
325
|
}
|
321
|
-
exports.visibility = visibility;
|
322
326
|
function hasFlag(flag) {
|
323
327
|
return (x) => {
|
324
328
|
const flags = ts.getCombinedModifierFlags(x);
|
@@ -333,7 +337,6 @@ function isPublic(x) {
|
|
333
337
|
// In TypeScript, anything not explicitly marked private or protected is public.
|
334
338
|
return !(0, exports.isPrivate)(x) && !(0, exports.isProtected)(x);
|
335
339
|
}
|
336
|
-
exports.isPublic = isPublic;
|
337
340
|
exports.isStatic = hasFlag(ts.ModifierFlags.Static);
|
338
341
|
/**
|
339
342
|
* Return the super() call from a method body if found
|
@@ -362,7 +365,6 @@ function findSuperCall(node, renderer) {
|
|
362
365
|
}
|
363
366
|
return undefined;
|
364
367
|
}
|
365
|
-
exports.findSuperCall = findSuperCall;
|
366
368
|
/**
|
367
369
|
* Return the names of all private property declarations
|
368
370
|
*/
|
@@ -370,12 +372,10 @@ function privatePropertyNames(members, renderer) {
|
|
370
372
|
const props = members.filter((m) => ts.isPropertyDeclaration(m));
|
371
373
|
return props.filter((m) => visibility(m) === 'private').map((m) => renderer.textOf(m.name));
|
372
374
|
}
|
373
|
-
exports.privatePropertyNames = privatePropertyNames;
|
374
375
|
function findEnclosingClassDeclaration(node) {
|
375
376
|
while (node && !ts.isClassDeclaration(node)) {
|
376
377
|
node = node.parent;
|
377
378
|
}
|
378
379
|
return node;
|
379
380
|
}
|
380
|
-
exports.findEnclosingClassDeclaration = findEnclosingClassDeclaration;
|
381
381
|
//# sourceMappingURL=ast-utils.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"ast-utils.js","sourceRoot":"","sources":["../../src/typescript/ast-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import * as ts from 'typescript';\n\nimport { AstRenderer } from '../renderer';\n\nexport function stripCommentMarkers(comment: string, multiline: boolean) {\n if (multiline) {\n // The text *must* start with '/*' and end with '*/'.\n // Strip leading '*' from every remaining line (first line because of '**',\n // other lines because of continuations.\n return comment\n .substring(2, comment.length - 2)\n .replace(/^[ \\t]+/g, '') // Strip all leading whitepace\n .replace(/[ \\t]+$/g, '') // Strip all trailing whitepace\n .replace(/^[ \\t]*\\*[ \\t]?/gm, ''); // Strip \"* \" from start of line\n }\n // The text *must* start with '//'\n return comment.replace(/^[/]{2}[ \\t]?/gm, '');\n}\n\nexport function stringFromLiteral(expr: ts.Expression) {\n if (ts.isStringLiteral(expr)) {\n return expr.text;\n }\n return '???';\n}\n\n/**\n * All types of nodes that can be captured using `nodeOfType`, and the type of Node they map to\n */\nexport type CapturableNodes = {\n [ts.SyntaxKind.ImportDeclaration]: ts.ImportDeclaration;\n [ts.SyntaxKind.VariableDeclaration]: ts.VariableDeclaration;\n [ts.SyntaxKind.ExternalModuleReference]: ts.ExternalModuleReference;\n [ts.SyntaxKind.NamespaceImport]: ts.NamespaceImport;\n [ts.SyntaxKind.NamedImports]: ts.NamedImports;\n [ts.SyntaxKind.ImportSpecifier]: ts.ImportSpecifier;\n [ts.SyntaxKind.StringLiteral]: ts.StringLiteral;\n};\n\nexport type AstMatcher<A> = (nodes?: ts.Node[]) => A | undefined;\n\n/**\n * Return AST children of the given node\n *\n * Difference with node.getChildren():\n *\n * - node.getChildren() must take a SourceFile (will fail if it doesn't get it)\n * and returns a mix of abstract and concrete syntax nodes.\n * - This function function will ONLY return abstract syntax nodes.\n */\nexport function nodeChildren(node: ts.Node): ts.Node[] {\n const ret = new Array<ts.Node>();\n node.forEachChild((n) => {\n ret.push(n);\n });\n return ret;\n}\n\n/**\n * Match a single node of a given type\n *\n * Capture name is first so that the IDE can detect eagerly that we're falling into\n * that overload and properly autocomplete the recognized node types from CapturableNodes.\n *\n * Looks like SyntaxList nodes appear in the printed AST, but they don't actually appear\n */\nexport function nodeOfType<A>(syntaxKind: ts.SyntaxKind, children?: AstMatcher<A>): AstMatcher<A>;\n// eslint-disable-next-line max-len\nexport function nodeOfType<S extends keyof CapturableNodes, N extends string, A>(\n capture: N,\n capturableNodeType: S,\n children?: AstMatcher<A>,\n): AstMatcher<Omit<A, N> & { [key in N]: CapturableNodes[S] }>;\n// eslint-disable-next-line max-len\nexport function nodeOfType<S extends keyof CapturableNodes, N extends string, A>(\n syntaxKindOrCaptureName: ts.SyntaxKind | N,\n nodeTypeOrChildren?: S | AstMatcher<A>,\n children?: AstMatcher<A>,\n): AstMatcher<A> | AstMatcher<A & { [key in N]: CapturableNodes[S] }> {\n const capturing = typeof syntaxKindOrCaptureName === 'string'; // Determine which overload we're in (SyntaxKind is a number)\n\n const realNext = (capturing ? children : (nodeTypeOrChildren as AstMatcher<A>)) ?? DONE;\n const realCapture = capturing ? syntaxKindOrCaptureName : undefined;\n const realSyntaxKind = capturing ? nodeTypeOrChildren : syntaxKindOrCaptureName;\n\n return (nodes) => {\n for (const node of nodes ?? []) {\n if (node.kind === realSyntaxKind) {\n const ret = realNext(nodeChildren(node));\n if (!ret) {\n continue;\n }\n\n if (realCapture) {\n return Object.assign(ret, {\n [realCapture]: node as CapturableNodes[S],\n }) as any;\n }\n return ret;\n }\n }\n return undefined;\n };\n}\n\nexport function anyNode(): AstMatcher<Record<string, unknown>>;\nexport function anyNode<A>(children: AstMatcher<A>): AstMatcher<A>;\nexport function anyNode<A>(children?: AstMatcher<A>): AstMatcher<A> | AstMatcher<any> {\n const realNext = children ?? DONE;\n return (nodes) => {\n for (const node of nodes ?? []) {\n const m = realNext(nodeChildren(node));\n if (m) {\n return m;\n }\n }\n return undefined;\n };\n}\n\n// Does not capture deeper because how would we even represent that?\nexport function allOfType<S extends keyof CapturableNodes, N extends string, A>(\n s: S,\n name: N,\n children?: AstMatcher<A>,\n): AstMatcher<{ [key in N]: Array<CapturableNodes[S]> }> {\n type ArrayType = Array<CapturableNodes[S]>;\n type ReturnType = { [key in N]: ArrayType };\n const realNext = children ?? DONE;\n\n return (nodes) => {\n let ret: ReturnType | undefined;\n for (const node of nodes ?? []) {\n if (node.kind === s) {\n if (realNext(nodeChildren(node))) {\n if (!ret) {\n ret = { [name]: new Array<CapturableNodes[S]>() } as ReturnType;\n }\n ret[name].push(node as any);\n }\n }\n }\n return ret;\n };\n}\n\nexport const DONE: AstMatcher<Record<string, unknown>> = () => ({});\n\n/**\n * Run a matcher against a node and return (or invoke a callback with) the accumulated bindings\n */\nexport function matchAst<A>(node: ts.Node, matcher: AstMatcher<A>): A | undefined;\nexport function matchAst<A>(node: ts.Node, matcher: AstMatcher<A>, cb: (bindings: A) => void): boolean;\nexport function matchAst<A>(\n node: ts.Node,\n matcher: AstMatcher<A>,\n cb?: (bindings: A) => void,\n): boolean | A | undefined {\n const matched = matcher([node]);\n if (cb) {\n if (matched) {\n cb(matched);\n }\n return !!matched;\n }\n return matched;\n}\n\n/**\n * Count the newlines in a given piece of string that aren't in comment blocks\n */\nexport function countNakedNewlines(str: string) {\n let ret = 0;\n for (const s of scanText(str, 0, str.length).filter((r) => r.type === 'other' || r.type === 'blockcomment')) {\n if (s.type === 'other') {\n // Count newlines in non-comments\n for (let i = s.pos; i < s.end; i++) {\n if (str[i] === '\\n') {\n ret++;\n }\n }\n } else {\n // Discount newlines at the end of block comments\n if (s.hasTrailingNewLine) {\n ret--;\n }\n }\n }\n return ret;\n}\n\nexport function repeatNewlines(str: string) {\n return '\\n'.repeat(Math.min(2, countNakedNewlines(str)));\n}\n\nconst WHITESPACE = [' ', '\\t', '\\r', '\\n'];\n\n/**\n * Extract single-line and multi-line comments from the given string\n *\n * Rewritten because I can't get ts.getLeadingComments and ts.getTrailingComments to do what I want.\n */\nexport function extractComments(text: string, start: number): ts.CommentRange[] {\n return scanText(text, start)\n .filter((s) => s.type === 'blockcomment' || s.type === 'linecomment')\n .map(commentRangeFromTextRange);\n}\n\nexport function commentRangeFromTextRange(rng: TextRange): ts.CommentRange {\n return {\n kind: rng.type === 'blockcomment' ? ts.SyntaxKind.MultiLineCommentTrivia : ts.SyntaxKind.SingleLineCommentTrivia,\n pos: rng.pos,\n end: rng.end,\n hasTrailingNewLine: rng.type !== 'blockcomment' && rng.hasTrailingNewLine,\n };\n}\n\ninterface TextRange {\n pos: number;\n end: number;\n type: 'linecomment' | 'blockcomment' | 'other' | 'directive';\n hasTrailingNewLine: boolean;\n}\n\n/**\n * Extract spans of comments and non-comments out of the string\n *\n * Stop at 'end' when given, or the first non-whitespace character in a\n * non-comment if not given.\n */\nexport function scanText(text: string, start: number, end?: number): TextRange[] {\n const ret: TextRange[] = [];\n\n let pos = start;\n const stopAtCode = end === undefined;\n if (end === undefined) {\n end = text.length;\n }\n while (pos < end) {\n const ch = text[pos];\n\n if (WHITESPACE.includes(ch)) {\n pos++;\n continue;\n }\n\n if (ch === '/' && text[pos + 1] === '/') {\n accumulateTextBlock();\n scanSinglelineComment();\n continue;\n }\n\n if (ch === '/' && text[pos + 1] === '*') {\n accumulateTextBlock();\n scanMultilineComment();\n continue;\n }\n\n // Non-whitespace, non-comment, must be regular token. End if we're not scanning\n // to a particular location, otherwise continue.\n if (stopAtCode) {\n break;\n }\n\n pos++;\n }\n\n accumulateTextBlock();\n\n return ret;\n\n function scanMultilineComment() {\n const endOfComment = findNext('*/', pos + 2);\n ret.push({\n type: 'blockcomment',\n hasTrailingNewLine: ['\\n', '\\r'].includes(text[endOfComment + 2]),\n pos,\n end: endOfComment + 2,\n });\n pos = endOfComment + 2;\n start = pos;\n }\n\n function scanSinglelineComment() {\n const nl = Math.min(findNext('\\r', pos + 2), findNext('\\n', pos + 2));\n\n if (text[pos + 2] === '/') {\n // Special /// comment\n ret.push({\n type: 'directive',\n hasTrailingNewLine: true,\n pos: pos + 1,\n end: nl,\n });\n } else {\n // Regular // comment\n ret.push({\n type: 'linecomment',\n hasTrailingNewLine: true,\n pos,\n end: nl,\n });\n }\n pos = nl + 1;\n start = pos;\n }\n\n function accumulateTextBlock() {\n if (pos - start > 0) {\n ret.push({\n type: 'other',\n hasTrailingNewLine: false,\n pos: start,\n end: pos,\n });\n start = pos;\n }\n }\n\n function findNext(sub: string, startPos: number) {\n const f = text.indexOf(sub, startPos);\n if (f === -1) {\n return text.length;\n }\n return f;\n }\n}\n\nconst VOID_SHOW_KEYWORD = 'show';\n\nexport function extractMaskingVoidExpression(node: ts.Node): ts.VoidExpression | undefined {\n const expr = extractVoidExpression(node);\n if (!expr) {\n return undefined;\n }\n if (ts.isStringLiteral(expr.expression) && expr.expression.text === VOID_SHOW_KEYWORD) {\n return undefined;\n }\n return expr;\n}\n\nexport function extractShowingVoidExpression(node: ts.Node): ts.VoidExpression | undefined {\n const expr = extractVoidExpression(node);\n if (!expr) {\n return undefined;\n }\n if (ts.isStringLiteral(expr.expression) && expr.expression.text === VOID_SHOW_KEYWORD) {\n return expr;\n }\n return undefined;\n}\n\n/**\n * Return the string argument to a void expression if it exists\n */\nexport function voidExpressionString(node: ts.VoidExpression): string | undefined {\n if (ts.isStringLiteral(node.expression)) {\n return node.expression.text;\n }\n return undefined;\n}\n\n/**\n * We use void directives as pragmas. Extract the void directives here\n */\nexport function extractVoidExpression(node: ts.Node): ts.VoidExpression | undefined {\n if (ts.isVoidExpression(node)) {\n return node;\n }\n if (ts.isExpressionStatement(node)) {\n return extractVoidExpression(node.expression);\n }\n if (ts.isParenthesizedExpression(node)) {\n return extractVoidExpression(node.expression);\n }\n if (ts.isBinaryExpression(node) && node.operatorToken.kind === ts.SyntaxKind.CommaToken) {\n return extractVoidExpression(node.left);\n }\n return undefined;\n}\n\nexport function quoteStringLiteral(x: string) {\n return x.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n}\n\nexport function visibility(\n x:\n | ts.AccessorDeclaration\n | ts.FunctionLikeDeclaration\n | ts.GetAccessorDeclaration\n | ts.PropertyDeclaration\n | ts.PropertySignature\n | ts.SetAccessorDeclaration,\n) {\n const flags = ts.getCombinedModifierFlags(x);\n if (flags & ts.ModifierFlags.Private) {\n return 'private';\n }\n if (flags & ts.ModifierFlags.Protected) {\n return 'protected';\n }\n return 'public';\n}\n\nfunction hasFlag<T extends ts.Declaration>(flag: ts.ModifierFlags) {\n return (x: T) => {\n const flags = ts.getCombinedModifierFlags(x);\n return (flags & flag) !== 0;\n };\n}\n\nexport const isReadOnly = hasFlag<\n | ts.AccessorDeclaration\n | ts.FunctionLikeDeclaration\n | ts.GetAccessorDeclaration\n | ts.PropertyDeclaration\n | ts.PropertySignature\n | ts.SetAccessorDeclaration\n>(ts.ModifierFlags.Readonly);\nexport const isExported = hasFlag(ts.ModifierFlags.Export);\nexport const isPrivate = hasFlag(ts.ModifierFlags.Private);\nexport const isProtected = hasFlag(ts.ModifierFlags.Private);\nexport function isPublic(x: ts.Declaration) {\n // In TypeScript, anything not explicitly marked private or protected is public.\n return !isPrivate(x) && !isProtected(x);\n}\nexport const isStatic = hasFlag(ts.ModifierFlags.Static);\n\n/**\n * Return the super() call from a method body if found\n */\nexport function findSuperCall(\n node: ts.Block | ts.Expression | undefined,\n renderer: AstRenderer<any>,\n): ts.SuperCall | undefined {\n if (node === undefined) {\n return undefined;\n }\n if (ts.isCallExpression(node)) {\n if (renderer.textOf(node.expression) === 'super') {\n return node as unknown as ts.SuperCall;\n }\n }\n if (ts.isExpressionStatement(node)) {\n return findSuperCall(node.expression, renderer);\n }\n if (ts.isBlock(node)) {\n for (const statement of node.statements) {\n if (ts.isExpressionStatement(statement)) {\n const s = findSuperCall(statement.expression, renderer);\n if (s) {\n return s;\n }\n }\n }\n }\n return undefined;\n}\n\n/**\n * Return the names of all private property declarations\n */\nexport function privatePropertyNames(members: readonly ts.ClassElement[], renderer: AstRenderer<any>): string[] {\n const props = members.filter((m) => ts.isPropertyDeclaration(m)) as ts.PropertyDeclaration[];\n return props.filter((m) => visibility(m) === 'private').map((m) => renderer.textOf(m.name));\n}\n\nexport function findEnclosingClassDeclaration(node: ts.Node): ts.ClassDeclaration | undefined {\n while (node && !ts.isClassDeclaration(node)) {\n node = node.parent;\n }\n return node;\n}\n"]}
|
1
|
+
{"version":3,"file":"ast-utils.js","sourceRoot":"","sources":["../../src/typescript/ast-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import * as ts from 'typescript';\n\nimport { AstRenderer } from '../renderer';\n\nexport function stripCommentMarkers(comment: string, multiline: boolean) {\n if (multiline) {\n // The text *must* start with '/*' and end with '*/'.\n // Strip leading '*' from every remaining line (first line because of '**',\n // other lines because of continuations.\n return comment\n .substring(2, comment.length - 2)\n .replace(/^[ \\t]+/g, '') // Strip all leading whitepace\n .replace(/[ \\t]+$/g, '') // Strip all trailing whitepace\n .replace(/^[ \\t]*\\*[ \\t]?/gm, ''); // Strip \"* \" from start of line\n }\n // The text *must* start with '//'\n return comment.replace(/^[/]{2}[ \\t]?/gm, '');\n}\n\nexport function stringFromLiteral(expr: ts.Expression) {\n if (ts.isStringLiteral(expr)) {\n return expr.text;\n }\n return '???';\n}\n\n/**\n * All types of nodes that can be captured using `nodeOfType`, and the type of Node they map to\n */\nexport type CapturableNodes = {\n [ts.SyntaxKind.ImportDeclaration]: ts.ImportDeclaration;\n [ts.SyntaxKind.VariableDeclaration]: ts.VariableDeclaration;\n [ts.SyntaxKind.ExternalModuleReference]: ts.ExternalModuleReference;\n [ts.SyntaxKind.NamespaceImport]: ts.NamespaceImport;\n [ts.SyntaxKind.NamedImports]: ts.NamedImports;\n [ts.SyntaxKind.ImportSpecifier]: ts.ImportSpecifier;\n [ts.SyntaxKind.StringLiteral]: ts.StringLiteral;\n};\n\nexport type AstMatcher<A> = (nodes?: ts.Node[]) => A | undefined;\n\n/**\n * Return AST children of the given node\n *\n * Difference with node.getChildren():\n *\n * - node.getChildren() must take a SourceFile (will fail if it doesn't get it)\n * and returns a mix of abstract and concrete syntax nodes.\n * - This function function will ONLY return abstract syntax nodes.\n */\nexport function nodeChildren(node: ts.Node): ts.Node[] {\n const ret = new Array<ts.Node>();\n node.forEachChild((n) => {\n ret.push(n);\n });\n return ret;\n}\n\n/**\n * Match a single node of a given type\n *\n * Capture name is first so that the IDE can detect eagerly that we're falling into\n * that overload and properly autocomplete the recognized node types from CapturableNodes.\n *\n * Looks like SyntaxList nodes appear in the printed AST, but they don't actually appear\n */\nexport function nodeOfType<A>(syntaxKind: ts.SyntaxKind, children?: AstMatcher<A>): AstMatcher<A>;\n// eslint-disable-next-line max-len\nexport function nodeOfType<S extends keyof CapturableNodes, N extends string, A>(\n capture: N,\n capturableNodeType: S,\n children?: AstMatcher<A>,\n): AstMatcher<Omit<A, N> & { [key in N]: CapturableNodes[S] }>;\n// eslint-disable-next-line max-len\nexport function nodeOfType<S extends keyof CapturableNodes, N extends string, A>(\n syntaxKindOrCaptureName: ts.SyntaxKind | N,\n nodeTypeOrChildren?: S | AstMatcher<A>,\n children?: AstMatcher<A>,\n): AstMatcher<A> | AstMatcher<A & { [key in N]: CapturableNodes[S] }> {\n const capturing = typeof syntaxKindOrCaptureName === 'string'; // Determine which overload we're in (SyntaxKind is a number)\n\n const realNext = (capturing ? children : (nodeTypeOrChildren as AstMatcher<A>)) ?? DONE;\n const realCapture = capturing ? syntaxKindOrCaptureName : undefined;\n const realSyntaxKind = capturing ? nodeTypeOrChildren : syntaxKindOrCaptureName;\n\n return (nodes) => {\n for (const node of nodes ?? []) {\n if (node.kind === realSyntaxKind) {\n const ret = realNext(nodeChildren(node));\n if (!ret) {\n continue;\n }\n\n if (realCapture) {\n return Object.assign(ret, {\n [realCapture]: node as CapturableNodes[S],\n }) as any;\n }\n return ret;\n }\n }\n return undefined;\n };\n}\n\nexport function anyNode(): AstMatcher<Record<string, unknown>>;\nexport function anyNode<A>(children: AstMatcher<A>): AstMatcher<A>;\nexport function anyNode<A>(children?: AstMatcher<A>): AstMatcher<A> | AstMatcher<any> {\n const realNext = children ?? DONE;\n return (nodes) => {\n for (const node of nodes ?? []) {\n const m = realNext(nodeChildren(node));\n if (m) {\n return m;\n }\n }\n return undefined;\n };\n}\n\n// Does not capture deeper because how would we even represent that?\nexport function allOfType<S extends keyof CapturableNodes, N extends string, A>(\n s: S,\n name: N,\n children?: AstMatcher<A>,\n): AstMatcher<{ [key in N]: Array<CapturableNodes[S]> }> {\n type ArrayType = Array<CapturableNodes[S]>;\n type ReturnType = { [key in N]: ArrayType };\n const realNext = children ?? DONE;\n\n return (nodes) => {\n let ret: ReturnType | undefined;\n for (const node of nodes ?? []) {\n if (node.kind === s) {\n if (realNext(nodeChildren(node))) {\n if (!ret) {\n ret = { [name]: new Array<CapturableNodes[S]>() } as ReturnType;\n }\n ret[name].push(node as any);\n }\n }\n }\n return ret;\n };\n}\n\nexport const DONE: AstMatcher<Record<string, unknown>> = () => ({});\n\n/**\n * Run a matcher against a node and return (or invoke a callback with) the accumulated bindings\n */\nexport function matchAst<A>(node: ts.Node, matcher: AstMatcher<A>): A | undefined;\nexport function matchAst<A>(node: ts.Node, matcher: AstMatcher<A>, cb: (bindings: A) => void): boolean;\nexport function matchAst<A>(\n node: ts.Node,\n matcher: AstMatcher<A>,\n cb?: (bindings: A) => void,\n): boolean | A | undefined {\n const matched = matcher([node]);\n if (cb) {\n if (matched) {\n cb(matched);\n }\n return !!matched;\n }\n return matched;\n}\n\n/**\n * Count the newlines in a given piece of string that aren't in comment blocks\n */\nexport function countNakedNewlines(str: string) {\n let ret = 0;\n for (const s of scanText(str, 0, str.length).filter((r) => r.type === 'other' || r.type === 'blockcomment')) {\n if (s.type === 'other') {\n // Count newlines in non-comments\n for (let i = s.pos; i < s.end; i++) {\n if (str[i] === '\\n') {\n ret++;\n }\n }\n } else {\n // Discount newlines at the end of block comments\n if (s.hasTrailingNewLine) {\n ret--;\n }\n }\n }\n return ret;\n}\n\nexport function repeatNewlines(str: string) {\n return '\\n'.repeat(Math.min(2, countNakedNewlines(str)));\n}\n\nconst WHITESPACE = [' ', '\\t', '\\r', '\\n'];\n\n/**\n * Extract single-line and multi-line comments from the given string\n *\n * Rewritten because I can't get ts.getLeadingComments and ts.getTrailingComments to do what I want.\n */\nexport function extractComments(text: string, start: number): ts.CommentRange[] {\n return scanText(text, start)\n .filter((s) => s.type === 'blockcomment' || s.type === 'linecomment')\n .map(commentRangeFromTextRange);\n}\n\nexport function commentRangeFromTextRange(rng: TextRange): ts.CommentRange {\n return {\n kind: rng.type === 'blockcomment' ? ts.SyntaxKind.MultiLineCommentTrivia : ts.SyntaxKind.SingleLineCommentTrivia,\n pos: rng.pos,\n end: rng.end,\n hasTrailingNewLine: rng.type !== 'blockcomment' && rng.hasTrailingNewLine,\n };\n}\n\ninterface TextRange {\n pos: number;\n end: number;\n type: 'linecomment' | 'blockcomment' | 'other' | 'directive';\n hasTrailingNewLine: boolean;\n}\n\n/**\n * Extract spans of comments and non-comments out of the string\n *\n * Stop at 'end' when given, or the first non-whitespace character in a\n * non-comment if not given.\n */\nexport function scanText(text: string, start: number, end?: number): TextRange[] {\n const ret: TextRange[] = [];\n\n let pos = start;\n const stopAtCode = end === undefined;\n if (end === undefined) {\n end = text.length;\n }\n while (pos < end) {\n const ch = text[pos];\n\n if (WHITESPACE.includes(ch)) {\n pos++;\n continue;\n }\n\n if (ch === '/' && text[pos + 1] === '/') {\n accumulateTextBlock();\n scanSinglelineComment();\n continue;\n }\n\n if (ch === '/' && text[pos + 1] === '*') {\n accumulateTextBlock();\n scanMultilineComment();\n continue;\n }\n\n // Non-whitespace, non-comment, must be regular token. End if we're not scanning\n // to a particular location, otherwise continue.\n if (stopAtCode) {\n break;\n }\n\n pos++;\n }\n\n accumulateTextBlock();\n\n return ret;\n\n function scanMultilineComment() {\n const endOfComment = findNext('*/', pos + 2);\n ret.push({\n type: 'blockcomment',\n hasTrailingNewLine: ['\\n', '\\r'].includes(text[endOfComment + 2]),\n pos,\n end: endOfComment + 2,\n });\n pos = endOfComment + 2;\n start = pos;\n }\n\n function scanSinglelineComment() {\n const nl = Math.min(findNext('\\r', pos + 2), findNext('\\n', pos + 2));\n\n if (text[pos + 2] === '/') {\n // Special /// comment\n ret.push({\n type: 'directive',\n hasTrailingNewLine: true,\n pos: pos + 1,\n end: nl,\n });\n } else {\n // Regular // comment\n ret.push({\n type: 'linecomment',\n hasTrailingNewLine: true,\n pos,\n end: nl,\n });\n }\n pos = nl + 1;\n start = pos;\n }\n\n function accumulateTextBlock() {\n if (pos - start > 0) {\n ret.push({\n type: 'other',\n hasTrailingNewLine: false,\n pos: start,\n end: pos,\n });\n start = pos;\n }\n }\n\n function findNext(sub: string, startPos: number) {\n const f = text.indexOf(sub, startPos);\n if (f === -1) {\n return text.length;\n }\n return f;\n }\n}\n\nconst VOID_SHOW_KEYWORD = 'show';\n\nexport function extractMaskingVoidExpression(node: ts.Node): ts.VoidExpression | undefined {\n const expr = extractVoidExpression(node);\n if (!expr) {\n return undefined;\n }\n if (ts.isStringLiteral(expr.expression) && expr.expression.text === VOID_SHOW_KEYWORD) {\n return undefined;\n }\n return expr;\n}\n\nexport function extractShowingVoidExpression(node: ts.Node): ts.VoidExpression | undefined {\n const expr = extractVoidExpression(node);\n if (!expr) {\n return undefined;\n }\n if (ts.isStringLiteral(expr.expression) && expr.expression.text === VOID_SHOW_KEYWORD) {\n return expr;\n }\n return undefined;\n}\n\n/**\n * Return the string argument to a void expression if it exists\n */\nexport function voidExpressionString(node: ts.VoidExpression): string | undefined {\n if (ts.isStringLiteral(node.expression)) {\n return node.expression.text;\n }\n return undefined;\n}\n\n/**\n * We use void directives as pragmas. Extract the void directives here\n */\nexport function extractVoidExpression(node: ts.Node): ts.VoidExpression | undefined {\n if (ts.isVoidExpression(node)) {\n return node;\n }\n if (ts.isExpressionStatement(node)) {\n return extractVoidExpression(node.expression);\n }\n if (ts.isParenthesizedExpression(node)) {\n return extractVoidExpression(node.expression);\n }\n if (ts.isBinaryExpression(node) && node.operatorToken.kind === ts.SyntaxKind.CommaToken) {\n return extractVoidExpression(node.left);\n }\n return undefined;\n}\n\nexport function quoteStringLiteral(x: string) {\n return x.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n}\n\nexport function visibility(\n x:\n | ts.AccessorDeclaration\n | ts.FunctionLikeDeclaration\n | ts.GetAccessorDeclaration\n | ts.PropertyDeclaration\n | ts.PropertySignature\n | ts.SetAccessorDeclaration,\n) {\n const flags = ts.getCombinedModifierFlags(x);\n if (flags & ts.ModifierFlags.Private) {\n return 'private';\n }\n if (flags & ts.ModifierFlags.Protected) {\n return 'protected';\n }\n return 'public';\n}\n\nfunction hasFlag<T extends ts.Declaration>(flag: ts.ModifierFlags) {\n return (x: T) => {\n const flags = ts.getCombinedModifierFlags(x);\n return (flags & flag) !== 0;\n };\n}\n\nexport const isReadOnly = hasFlag<\n | ts.AccessorDeclaration\n | ts.FunctionLikeDeclaration\n | ts.GetAccessorDeclaration\n | ts.PropertyDeclaration\n | ts.PropertySignature\n | ts.SetAccessorDeclaration\n>(ts.ModifierFlags.Readonly);\nexport const isExported = hasFlag(ts.ModifierFlags.Export);\nexport const isPrivate = hasFlag(ts.ModifierFlags.Private);\nexport const isProtected = hasFlag(ts.ModifierFlags.Private);\nexport function isPublic(x: ts.Declaration) {\n // In TypeScript, anything not explicitly marked private or protected is public.\n return !isPrivate(x) && !isProtected(x);\n}\nexport const isStatic = hasFlag(ts.ModifierFlags.Static);\n\n/**\n * Return the super() call from a method body if found\n */\nexport function findSuperCall(\n node: ts.Block | ts.Expression | undefined,\n renderer: AstRenderer<any>,\n): ts.SuperCall | undefined {\n if (node === undefined) {\n return undefined;\n }\n if (ts.isCallExpression(node)) {\n if (renderer.textOf(node.expression) === 'super') {\n return node as unknown as ts.SuperCall;\n }\n }\n if (ts.isExpressionStatement(node)) {\n return findSuperCall(node.expression, renderer);\n }\n if (ts.isBlock(node)) {\n for (const statement of node.statements) {\n if (ts.isExpressionStatement(statement)) {\n const s = findSuperCall(statement.expression, renderer);\n if (s) {\n return s;\n }\n }\n }\n }\n return undefined;\n}\n\n/**\n * Return the names of all private property declarations\n */\nexport function privatePropertyNames(members: readonly ts.ClassElement[], renderer: AstRenderer<any>): string[] {\n const props = members.filter((m) => ts.isPropertyDeclaration(m)) as ts.PropertyDeclaration[];\n return props.filter((m) => visibility(m) === 'private').map((m) => renderer.textOf(m.name));\n}\n\nexport function findEnclosingClassDeclaration(node: ts.Node): ts.ClassDeclaration | undefined {\n while (node && !ts.isClassDeclaration(node)) {\n node = node.parent;\n }\n return node;\n}\n"]}
|
@@ -37,6 +37,6 @@ export interface ImportBinding {
|
|
37
37
|
readonly importedSymbol?: JsiiSymbol;
|
38
38
|
}
|
39
39
|
export declare function analyzeImportEquals(node: ts.ImportEqualsDeclaration, context: AstRenderer<any>): ImportStatement;
|
40
|
-
export declare function analyzeImportDeclaration(node: ts.ImportDeclaration, context: AstRenderer<any>): ImportStatement;
|
41
|
-
export declare function analyzeImportDeclaration(node: ts.ImportDeclaration, context: AstRenderer<any>, submoduleReferences: SubmoduleReferenceMap): ImportStatement[];
|
40
|
+
export declare function analyzeImportDeclaration(node: ts.ImportDeclaration | ts.JSDocImportTag, context: AstRenderer<any>): ImportStatement;
|
41
|
+
export declare function analyzeImportDeclaration(node: ts.ImportDeclaration | ts.JSDocImportTag, context: AstRenderer<any>, submoduleReferences: SubmoduleReferenceMap): ImportStatement[];
|
42
42
|
//# sourceMappingURL=imports.d.ts.map
|
@@ -1,6 +1,7 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.
|
3
|
+
exports.analyzeImportEquals = analyzeImportEquals;
|
4
|
+
exports.analyzeImportDeclaration = analyzeImportDeclaration;
|
4
5
|
const ts = require("typescript");
|
5
6
|
const ast_utils_1 = require("./ast-utils");
|
6
7
|
const jsii_utils_1 = require("../jsii/jsii-utils");
|
@@ -18,7 +19,6 @@ function analyzeImportEquals(node, context) {
|
|
18
19
|
imports: { import: 'full', alias: sourceName, sourceName },
|
19
20
|
};
|
20
21
|
}
|
21
|
-
exports.analyzeImportEquals = analyzeImportEquals;
|
22
22
|
function analyzeImportDeclaration(node, context, submoduleReferences) {
|
23
23
|
const packageName = (0, ast_utils_1.stringFromLiteral)(node.moduleSpecifier);
|
24
24
|
const starBindings = (0, ast_utils_1.matchAst)(node, (0, ast_utils_1.nodeOfType)(ts.SyntaxKind.ImportDeclaration, (0, ast_utils_1.nodeOfType)(ts.SyntaxKind.ImportClause, (0, ast_utils_1.nodeOfType)('namespace', ts.SyntaxKind.NamespaceImport))));
|
@@ -128,5 +128,4 @@ function analyzeImportDeclaration(node, context, submoduleReferences) {
|
|
128
128
|
...extraImports,
|
129
129
|
];
|
130
130
|
}
|
131
|
-
exports.analyzeImportDeclaration = analyzeImportDeclaration;
|
132
131
|
//# sourceMappingURL=imports.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"imports.js","sourceRoot":"","sources":["../../src/typescript/imports.ts"],"names":[],"mappings":"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","sourcesContent":["import * as ts from 'typescript';\n\nimport { allOfType, matchAst, nodeOfType, stringFromLiteral } from './ast-utils';\nimport { JsiiSymbol, parentSymbol, lookupJsiiSymbolFromNode } from '../jsii/jsii-utils';\nimport { AstRenderer } from '../renderer';\nimport { SubmoduleReferenceMap } from '../submodule-reference';\nimport { fmap } from '../util';\n\n/**\n * Our own unification of import statements\n */\nexport interface ImportStatement {\n readonly node: ts.Node;\n readonly packageName: string;\n readonly imports: FullImport | SelectiveImport;\n readonly moduleSymbol?: JsiiSymbol;\n}\n\nexport type FullImport = {\n readonly import: 'full';\n /**\n * The name of the namespace prefix in the source code. Used to strip the\n * prefix in certain languages (e.g: Java).\n */\n readonly sourceName: string;\n /**\n * The name under which this module is imported. Undefined if the module is\n * not aliased (could be the case for namepsace/submodule imports).\n */\n readonly alias?: string;\n};\n\nexport type SelectiveImport = {\n readonly import: 'selective';\n readonly elements: ImportBinding[];\n};\n\nexport interface ImportBinding {\n readonly sourceName: string;\n\n readonly alias?: string;\n\n /**\n * The JSII Symbol the import refers to\n */\n readonly importedSymbol?: JsiiSymbol;\n}\n\nexport function analyzeImportEquals(node: ts.ImportEqualsDeclaration, context: AstRenderer<any>): ImportStatement {\n let moduleName = '???';\n matchAst(node.moduleReference, nodeOfType('ref', ts.SyntaxKind.ExternalModuleReference), (bindings) => {\n moduleName = stringFromLiteral(bindings.ref.expression);\n });\n\n const sourceName = context.textOf(node.name);\n\n return {\n node,\n packageName: moduleName,\n moduleSymbol: lookupJsiiSymbolFromNode(context.typeChecker, node.name),\n imports: { import: 'full', alias: sourceName, sourceName },\n };\n}\n\nexport function analyzeImportDeclaration(node: ts.ImportDeclaration, context: AstRenderer<any>): ImportStatement;\nexport function analyzeImportDeclaration(\n node: ts.ImportDeclaration,\n context: AstRenderer<any>,\n submoduleReferences: SubmoduleReferenceMap,\n): ImportStatement[];\nexport function analyzeImportDeclaration(\n node: ts.ImportDeclaration,\n context: AstRenderer<any>,\n submoduleReferences?: SubmoduleReferenceMap,\n): ImportStatement | ImportStatement[] {\n const packageName = stringFromLiteral(node.moduleSpecifier);\n\n const starBindings = matchAst(\n node,\n nodeOfType(\n ts.SyntaxKind.ImportDeclaration,\n nodeOfType(ts.SyntaxKind.ImportClause, nodeOfType('namespace', ts.SyntaxKind.NamespaceImport)),\n ),\n );\n\n if (starBindings) {\n const sourceName = context.textOf(starBindings.namespace.name);\n const bareImport: ImportStatement = {\n node,\n packageName,\n moduleSymbol: lookupJsiiSymbolFromNode(context.typeChecker, starBindings.namespace.name),\n imports: {\n import: 'full',\n alias: sourceName,\n sourceName,\n },\n };\n if (submoduleReferences == null) {\n return bareImport;\n }\n\n const rootSymbol = context.typeChecker.getSymbolAtLocation(starBindings.namespace.name);\n const refs = rootSymbol && Array.from(submoduleReferences.values()).filter((ref) => ref.root === rootSymbol);\n // No submodule reference, or only 1 where the path is empty (this is used to signal the use of the bare import so it's not erased)\n if (refs == null || refs.length === 0 || (refs.length === 1 && refs[0].path.length === 0)) {\n return [bareImport];\n }\n\n return refs.flatMap(({ lastNode, path, root, submoduleChain }, idx, array): ImportStatement[] => {\n if (\n array\n .slice(0, idx)\n .some(\n (other) => other.root === root && context.textOf(other.submoduleChain) === context.textOf(submoduleChain),\n )\n ) {\n // This would be a duplicate, so we're skipping it\n return [];\n }\n\n const moduleSymbol = lookupJsiiSymbolFromNode(context.typeChecker, lastNode);\n return [\n {\n node,\n packageName: [packageName, ...path.map((n) => context.textOf(n))].join('/'),\n moduleSymbol,\n imports: {\n import: 'full',\n alias: undefined, // No alias exists in the source text for this...\n sourceName: context.textOf(submoduleChain),\n },\n },\n ];\n });\n }\n\n const namedBindings = matchAst(\n node,\n nodeOfType(\n ts.SyntaxKind.ImportDeclaration,\n nodeOfType(\n ts.SyntaxKind.ImportClause,\n nodeOfType(ts.SyntaxKind.NamedImports, allOfType(ts.SyntaxKind.ImportSpecifier, 'specifiers')),\n ),\n ),\n );\n\n const extraImports = new Array<ImportStatement>();\n const elements: ImportBinding[] = (namedBindings?.specifiers ?? []).flatMap(\n ({ name, propertyName }): ImportBinding[] => {\n // regular import { name }\n // renamed import { propertyName as name }\n const directBinding = {\n sourceName: context.textOf(propertyName ?? name),\n alias: propertyName && context.textOf(name),\n importedSymbol: lookupJsiiSymbolFromNode(context.typeChecker, propertyName ?? name),\n } as const;\n\n if (submoduleReferences != null) {\n const symbol = context.typeChecker.getSymbolAtLocation(name);\n let omitDirectBinding = false;\n for (const match of Array.from(submoduleReferences.values()).filter((ref) => ref.root === symbol)) {\n if (match.path.length === 0) {\n // This is a namespace binding that is used as-is (not via a transitive path). It needs to be preserved.\n omitDirectBinding = false;\n continue;\n }\n const subPackageName = [packageName, ...match.path.map((n) => n.getText(n.getSourceFile()))].join('/');\n const importedSymbol = lookupJsiiSymbolFromNode(context.typeChecker, match.lastNode);\n const moduleSymbol = fmap(importedSymbol, parentSymbol);\n const importStatement =\n extraImports.find((stmt) => {\n if (moduleSymbol != null) {\n return stmt.moduleSymbol === moduleSymbol;\n }\n return stmt.packageName === subPackageName;\n }) ??\n extraImports[\n extraImports.push({\n moduleSymbol,\n node: match.lastNode,\n packageName: subPackageName,\n imports: { import: 'selective', elements: [] },\n }) - 1\n ];\n\n (importStatement.imports as SelectiveImport).elements.push({\n sourceName: context.textOf(match.submoduleChain),\n importedSymbol,\n });\n }\n if (omitDirectBinding) {\n return [];\n }\n }\n\n return [directBinding];\n },\n );\n\n if (submoduleReferences == null) {\n return {\n node,\n packageName,\n imports: { import: 'selective', elements },\n moduleSymbol: fmap(elements?.[0]?.importedSymbol, parentSymbol),\n };\n }\n\n return [\n {\n node,\n packageName,\n imports: { import: 'selective', elements },\n moduleSymbol: fmap(elements?.[0]?.importedSymbol, parentSymbol),\n },\n ...extraImports,\n ];\n}\n"]}
|
1
|
+
{"version":3,"file":"imports.js","sourceRoot":"","sources":["../../src/typescript/imports.ts"],"names":[],"mappings":"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","sourcesContent":["import * as ts from 'typescript';\n\nimport { allOfType, matchAst, nodeOfType, stringFromLiteral } from './ast-utils';\nimport { JsiiSymbol, parentSymbol, lookupJsiiSymbolFromNode } from '../jsii/jsii-utils';\nimport { AstRenderer } from '../renderer';\nimport { SubmoduleReferenceMap } from '../submodule-reference';\nimport { fmap } from '../util';\n\n/**\n * Our own unification of import statements\n */\nexport interface ImportStatement {\n readonly node: ts.Node;\n readonly packageName: string;\n readonly imports: FullImport | SelectiveImport;\n readonly moduleSymbol?: JsiiSymbol;\n}\n\nexport type FullImport = {\n readonly import: 'full';\n /**\n * The name of the namespace prefix in the source code. Used to strip the\n * prefix in certain languages (e.g: Java).\n */\n readonly sourceName: string;\n /**\n * The name under which this module is imported. Undefined if the module is\n * not aliased (could be the case for namepsace/submodule imports).\n */\n readonly alias?: string;\n};\n\nexport type SelectiveImport = {\n readonly import: 'selective';\n readonly elements: ImportBinding[];\n};\n\nexport interface ImportBinding {\n readonly sourceName: string;\n\n readonly alias?: string;\n\n /**\n * The JSII Symbol the import refers to\n */\n readonly importedSymbol?: JsiiSymbol;\n}\n\nexport function analyzeImportEquals(node: ts.ImportEqualsDeclaration, context: AstRenderer<any>): ImportStatement {\n let moduleName = '???';\n matchAst(node.moduleReference, nodeOfType('ref', ts.SyntaxKind.ExternalModuleReference), (bindings) => {\n moduleName = stringFromLiteral(bindings.ref.expression);\n });\n\n const sourceName = context.textOf(node.name);\n\n return {\n node,\n packageName: moduleName,\n moduleSymbol: lookupJsiiSymbolFromNode(context.typeChecker, node.name),\n imports: { import: 'full', alias: sourceName, sourceName },\n };\n}\n\nexport function analyzeImportDeclaration(\n node: ts.ImportDeclaration | ts.JSDocImportTag,\n context: AstRenderer<any>,\n): ImportStatement;\nexport function analyzeImportDeclaration(\n node: ts.ImportDeclaration | ts.JSDocImportTag,\n context: AstRenderer<any>,\n submoduleReferences: SubmoduleReferenceMap,\n): ImportStatement[];\nexport function analyzeImportDeclaration(\n node: ts.ImportDeclaration | ts.JSDocImportTag,\n context: AstRenderer<any>,\n submoduleReferences?: SubmoduleReferenceMap,\n): ImportStatement | ImportStatement[] {\n const packageName = stringFromLiteral(node.moduleSpecifier);\n\n const starBindings = matchAst(\n node,\n nodeOfType(\n ts.SyntaxKind.ImportDeclaration,\n nodeOfType(ts.SyntaxKind.ImportClause, nodeOfType('namespace', ts.SyntaxKind.NamespaceImport)),\n ),\n );\n\n if (starBindings) {\n const sourceName = context.textOf(starBindings.namespace.name);\n const bareImport: ImportStatement = {\n node,\n packageName,\n moduleSymbol: lookupJsiiSymbolFromNode(context.typeChecker, starBindings.namespace.name),\n imports: {\n import: 'full',\n alias: sourceName,\n sourceName,\n },\n };\n if (submoduleReferences == null) {\n return bareImport;\n }\n\n const rootSymbol = context.typeChecker.getSymbolAtLocation(starBindings.namespace.name);\n const refs = rootSymbol && Array.from(submoduleReferences.values()).filter((ref) => ref.root === rootSymbol);\n // No submodule reference, or only 1 where the path is empty (this is used to signal the use of the bare import so it's not erased)\n if (refs == null || refs.length === 0 || (refs.length === 1 && refs[0].path.length === 0)) {\n return [bareImport];\n }\n\n return refs.flatMap(({ lastNode, path, root, submoduleChain }, idx, array): ImportStatement[] => {\n if (\n array\n .slice(0, idx)\n .some(\n (other) => other.root === root && context.textOf(other.submoduleChain) === context.textOf(submoduleChain),\n )\n ) {\n // This would be a duplicate, so we're skipping it\n return [];\n }\n\n const moduleSymbol = lookupJsiiSymbolFromNode(context.typeChecker, lastNode);\n return [\n {\n node,\n packageName: [packageName, ...path.map((n) => context.textOf(n))].join('/'),\n moduleSymbol,\n imports: {\n import: 'full',\n alias: undefined, // No alias exists in the source text for this...\n sourceName: context.textOf(submoduleChain),\n },\n },\n ];\n });\n }\n\n const namedBindings = matchAst(\n node,\n nodeOfType(\n ts.SyntaxKind.ImportDeclaration,\n nodeOfType(\n ts.SyntaxKind.ImportClause,\n nodeOfType(ts.SyntaxKind.NamedImports, allOfType(ts.SyntaxKind.ImportSpecifier, 'specifiers')),\n ),\n ),\n );\n\n const extraImports = new Array<ImportStatement>();\n const elements: ImportBinding[] = (namedBindings?.specifiers ?? []).flatMap(\n ({ name, propertyName }): ImportBinding[] => {\n // regular import { name }\n // renamed import { propertyName as name }\n const directBinding = {\n sourceName: context.textOf(propertyName ?? name),\n alias: propertyName && context.textOf(name),\n importedSymbol: lookupJsiiSymbolFromNode(context.typeChecker, propertyName ?? name),\n } as const;\n\n if (submoduleReferences != null) {\n const symbol = context.typeChecker.getSymbolAtLocation(name);\n let omitDirectBinding = false;\n for (const match of Array.from(submoduleReferences.values()).filter((ref) => ref.root === symbol)) {\n if (match.path.length === 0) {\n // This is a namespace binding that is used as-is (not via a transitive path). It needs to be preserved.\n omitDirectBinding = false;\n continue;\n }\n const subPackageName = [packageName, ...match.path.map((n) => n.getText(n.getSourceFile()))].join('/');\n const importedSymbol = lookupJsiiSymbolFromNode(context.typeChecker, match.lastNode);\n const moduleSymbol = fmap(importedSymbol, parentSymbol);\n const importStatement =\n extraImports.find((stmt) => {\n if (moduleSymbol != null) {\n return stmt.moduleSymbol === moduleSymbol;\n }\n return stmt.packageName === subPackageName;\n }) ??\n extraImports[\n extraImports.push({\n moduleSymbol,\n node: match.lastNode,\n packageName: subPackageName,\n imports: { import: 'selective', elements: [] },\n }) - 1\n ];\n\n (importStatement.imports as SelectiveImport).elements.push({\n sourceName: context.textOf(match.submoduleChain),\n importedSymbol,\n });\n }\n if (omitDirectBinding) {\n return [];\n }\n }\n\n return [directBinding];\n },\n );\n\n if (submoduleReferences == null) {\n return {\n node,\n packageName,\n imports: { import: 'selective', elements },\n moduleSymbol: fmap(elements?.[0]?.importedSymbol, parentSymbol),\n };\n }\n\n return [\n {\n node,\n packageName,\n imports: { import: 'selective', elements },\n moduleSymbol: fmap(elements?.[0]?.importedSymbol, parentSymbol),\n },\n ...extraImports,\n ];\n}\n"]}
|
package/lib/typescript/types.js
CHANGED
@@ -1,6 +1,21 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.
|
3
|
+
exports.firstTypeInUnion = firstTypeInUnion;
|
4
|
+
exports.builtInTypeName = builtInTypeName;
|
5
|
+
exports.renderType = renderType;
|
6
|
+
exports.parameterAcceptsUndefined = parameterAcceptsUndefined;
|
7
|
+
exports.typeContainsUndefined = typeContainsUndefined;
|
8
|
+
exports.renderTypeFlags = renderTypeFlags;
|
9
|
+
exports.mapElementType = mapElementType;
|
10
|
+
exports.inferMapElementType = inferMapElementType;
|
11
|
+
exports.arrayElementType = arrayElementType;
|
12
|
+
exports.typeOfExpression = typeOfExpression;
|
13
|
+
exports.inferredTypeOfExpression = inferredTypeOfExpression;
|
14
|
+
exports.isNumber = isNumber;
|
15
|
+
exports.isEnumAccess = isEnumAccess;
|
16
|
+
exports.isStaticReadonlyAccess = isStaticReadonlyAccess;
|
17
|
+
exports.renderFlags = renderFlags;
|
18
|
+
exports.determineReturnType = determineReturnType;
|
4
19
|
const ts = require("typescript");
|
5
20
|
const jsii_utils_1 = require("../jsii/jsii-utils");
|
6
21
|
const util_1 = require("../util");
|
@@ -14,7 +29,6 @@ function firstTypeInUnion(typeChecker, type) {
|
|
14
29
|
}
|
15
30
|
return type.types[0];
|
16
31
|
}
|
17
|
-
exports.firstTypeInUnion = firstTypeInUnion;
|
18
32
|
function builtInTypeName(type) {
|
19
33
|
if ((0, jsii_utils_1.hasAnyFlag)(type.flags, ts.TypeFlags.Any | ts.TypeFlags.Unknown)) {
|
20
34
|
return 'any';
|
@@ -30,7 +44,6 @@ function builtInTypeName(type) {
|
|
30
44
|
}
|
31
45
|
return undefined;
|
32
46
|
}
|
33
|
-
exports.builtInTypeName = builtInTypeName;
|
34
47
|
function renderType(type) {
|
35
48
|
if (type.isClassOrInterface()) {
|
36
49
|
return type.symbol.name;
|
@@ -41,7 +54,6 @@ function renderType(type) {
|
|
41
54
|
}
|
42
55
|
return renderTypeFlags(type);
|
43
56
|
}
|
44
|
-
exports.renderType = renderType;
|
45
57
|
function parameterAcceptsUndefined(param, type) {
|
46
58
|
if (param.initializer !== undefined) {
|
47
59
|
return true;
|
@@ -54,7 +66,6 @@ function parameterAcceptsUndefined(param, type) {
|
|
54
66
|
}
|
55
67
|
return false;
|
56
68
|
}
|
57
|
-
exports.parameterAcceptsUndefined = parameterAcceptsUndefined;
|
58
69
|
/**
|
59
70
|
* This is a simplified check that should be good enough for most purposes
|
60
71
|
*/
|
@@ -67,11 +78,9 @@ function typeContainsUndefined(type) {
|
|
67
78
|
}
|
68
79
|
return false;
|
69
80
|
}
|
70
|
-
exports.typeContainsUndefined = typeContainsUndefined;
|
71
81
|
function renderTypeFlags(type) {
|
72
82
|
return renderFlags(type.flags, ts.TypeFlags);
|
73
83
|
}
|
74
|
-
exports.renderTypeFlags = renderTypeFlags;
|
75
84
|
/**
|
76
85
|
* If this is a map type, return the type mapped *to* (key must always be `string` anyway).
|
77
86
|
*/
|
@@ -96,7 +105,6 @@ function mapElementType(type, typeChecker) {
|
|
96
105
|
}
|
97
106
|
return { result: 'nonMap' };
|
98
107
|
}
|
99
|
-
exports.mapElementType = mapElementType;
|
100
108
|
/**
|
101
109
|
* Try to infer the map element type from the properties if they're all the same
|
102
110
|
*/
|
@@ -104,7 +112,6 @@ function inferMapElementType(elements, typeChecker) {
|
|
104
112
|
const types = elements.map((e) => typeOfObjectLiteralProperty(typeChecker, e)).filter(util_1.isDefined);
|
105
113
|
return types.every((t) => isSameType(types[0], t)) ? types[0] : undefined;
|
106
114
|
}
|
107
|
-
exports.inferMapElementType = inferMapElementType;
|
108
115
|
function typeOfObjectLiteralProperty(typeChecker, el) {
|
109
116
|
if (ts.isPropertyAssignment(el)) {
|
110
117
|
return typeOfExpression(typeChecker, el.initializer);
|
@@ -134,12 +141,10 @@ function arrayElementType(type) {
|
|
134
141
|
}
|
135
142
|
return undefined;
|
136
143
|
}
|
137
|
-
exports.arrayElementType = arrayElementType;
|
138
144
|
function typeOfExpression(typeChecker, node) {
|
139
145
|
const t = typeChecker.getContextualType(node) ?? typeChecker.getTypeAtLocation(node);
|
140
146
|
return (0, jsii_utils_1.resolveEnumLiteral)(typeChecker, t);
|
141
147
|
}
|
142
|
-
exports.typeOfExpression = typeOfExpression;
|
143
148
|
/**
|
144
149
|
* Infer type of expression by the argument it is assigned to
|
145
150
|
*
|
@@ -152,16 +157,13 @@ function inferredTypeOfExpression(typeChecker, node) {
|
|
152
157
|
const type = typeChecker.getContextualType(node);
|
153
158
|
return type ? typeChecker.getNonNullableType(type) : undefined;
|
154
159
|
}
|
155
|
-
exports.inferredTypeOfExpression = inferredTypeOfExpression;
|
156
160
|
function isNumber(x) {
|
157
161
|
return typeof x === 'number';
|
158
162
|
}
|
159
|
-
exports.isNumber = isNumber;
|
160
163
|
function isEnumAccess(typeChecker, access) {
|
161
164
|
const symbol = (0, jsii_utils_1.resolvedSymbolAtLocation)(typeChecker, access.expression);
|
162
165
|
return symbol ? (0, jsii_utils_1.hasAnyFlag)(symbol.flags, ts.SymbolFlags.Enum) : false;
|
163
166
|
}
|
164
|
-
exports.isEnumAccess = isEnumAccess;
|
165
167
|
function isStaticReadonlyAccess(typeChecker, access) {
|
166
168
|
const symbol = (0, jsii_utils_1.resolvedSymbolAtLocation)(typeChecker, access);
|
167
169
|
const decl = symbol?.getDeclarations();
|
@@ -171,7 +173,6 @@ function isStaticReadonlyAccess(typeChecker, access) {
|
|
171
173
|
}
|
172
174
|
return false;
|
173
175
|
}
|
174
|
-
exports.isStaticReadonlyAccess = isStaticReadonlyAccess;
|
175
176
|
function renderFlags(flags, flagObject) {
|
176
177
|
if (flags === undefined) {
|
177
178
|
return '';
|
@@ -182,7 +183,6 @@ function renderFlags(flags, flagObject) {
|
|
182
183
|
.map((f) => flagObject[f])
|
183
184
|
.join(',');
|
184
185
|
}
|
185
|
-
exports.renderFlags = renderFlags;
|
186
186
|
function determineReturnType(typeChecker, node) {
|
187
187
|
const signature = typeChecker.getSignatureFromDeclaration(node);
|
188
188
|
if (!signature) {
|
@@ -190,5 +190,4 @@ function determineReturnType(typeChecker, node) {
|
|
190
190
|
}
|
191
191
|
return typeChecker.getReturnTypeOfSignature(signature);
|
192
192
|
}
|
193
|
-
exports.determineReturnType = determineReturnType;
|
194
193
|
//# sourceMappingURL=types.js.map
|