numtypes 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/LICENSE +12 -0
- package/LICENSE-APACHE +201 -0
- package/LICENSE-MIT +21 -0
- package/README.md +652 -0
- package/dist/lib/index.d.ts +22 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +2 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/transformer/analyze/analyze-source-file.d.ts +15 -0
- package/dist/transformer/analyze/analyze-source-file.d.ts.map +1 -0
- package/dist/transformer/analyze/analyze-source-file.js +605 -0
- package/dist/transformer/analyze/analyze-source-file.js.map +1 -0
- package/dist/transformer/analyze/get-contextual-domain.d.ts +19 -0
- package/dist/transformer/analyze/get-contextual-domain.d.ts.map +1 -0
- package/dist/transformer/analyze/get-contextual-domain.js +197 -0
- package/dist/transformer/analyze/get-contextual-domain.js.map +1 -0
- package/dist/transformer/analyze/get-expression-domain.d.ts +26 -0
- package/dist/transformer/analyze/get-expression-domain.d.ts.map +1 -0
- package/dist/transformer/analyze/get-expression-domain.js +804 -0
- package/dist/transformer/analyze/get-expression-domain.js.map +1 -0
- package/dist/transformer/analyze/type-domain.d.ts +41 -0
- package/dist/transformer/analyze/type-domain.d.ts.map +1 -0
- package/dist/transformer/analyze/type-domain.js +260 -0
- package/dist/transformer/analyze/type-domain.js.map +1 -0
- package/dist/transformer/ast.d.ts +10 -0
- package/dist/transformer/ast.d.ts.map +1 -0
- package/dist/transformer/ast.js +115 -0
- package/dist/transformer/ast.js.map +1 -0
- package/dist/transformer/diagnostics.d.ts +17 -0
- package/dist/transformer/diagnostics.d.ts.map +1 -0
- package/dist/transformer/diagnostics.js +30 -0
- package/dist/transformer/diagnostics.js.map +1 -0
- package/dist/transformer/domains.d.ts +11 -0
- package/dist/transformer/domains.d.ts.map +1 -0
- package/dist/transformer/domains.js +32 -0
- package/dist/transformer/domains.js.map +1 -0
- package/dist/transformer/index.d.ts +10 -0
- package/dist/transformer/index.d.ts.map +1 -0
- package/dist/transformer/index.js +60 -0
- package/dist/transformer/index.js.map +1 -0
- package/dist/transformer/operators.d.ts +16 -0
- package/dist/transformer/operators.d.ts.map +1 -0
- package/dist/transformer/operators.js +44 -0
- package/dist/transformer/operators.js.map +1 -0
- package/dist/transformer/options.d.ts +19 -0
- package/dist/transformer/options.d.ts.map +1 -0
- package/dist/transformer/options.js +17 -0
- package/dist/transformer/options.js.map +1 -0
- package/dist/transformer/symbols.d.ts +56 -0
- package/dist/transformer/symbols.d.ts.map +1 -0
- package/dist/transformer/symbols.js +270 -0
- package/dist/transformer/symbols.js.map +1 -0
- package/dist/transformer/transform/erase-imports.d.ts +14 -0
- package/dist/transformer/transform/erase-imports.d.ts.map +1 -0
- package/dist/transformer/transform/erase-imports.js +174 -0
- package/dist/transformer/transform/erase-imports.js.map +1 -0
- package/dist/transformer/transform/generated-coercions.d.ts +9 -0
- package/dist/transformer/transform/generated-coercions.d.ts.map +1 -0
- package/dist/transformer/transform/generated-coercions.js +22 -0
- package/dist/transformer/transform/generated-coercions.js.map +1 -0
- package/dist/transformer/transform/optimize-coercions.d.ts +11 -0
- package/dist/transformer/transform/optimize-coercions.d.ts.map +1 -0
- package/dist/transformer/transform/optimize-coercions.js +1702 -0
- package/dist/transformer/transform/optimize-coercions.js.map +1 -0
- package/dist/transformer/transform/transform-declaration-file.d.ts +9 -0
- package/dist/transformer/transform/transform-declaration-file.d.ts.map +1 -0
- package/dist/transformer/transform/transform-declaration-file.js +376 -0
- package/dist/transformer/transform/transform-declaration-file.js.map +1 -0
- package/dist/transformer/transform/transform-expression.d.ts +24 -0
- package/dist/transformer/transform/transform-expression.d.ts.map +1 -0
- package/dist/transformer/transform/transform-expression.js +545 -0
- package/dist/transformer/transform/transform-expression.js.map +1 -0
- package/dist/transformer/transform/transform-source-file.d.ts +10 -0
- package/dist/transformer/transform/transform-source-file.d.ts.map +1 -0
- package/dist/transformer/transform/transform-source-file.js +52 -0
- package/dist/transformer/transform/transform-source-file.js.map +1 -0
- package/dist/transformer/ts-compat.d.ts +4 -0
- package/dist/transformer/ts-compat.d.ts.map +1 -0
- package/dist/transformer/ts-compat.js +24 -0
- package/dist/transformer/ts-compat.js.map +1 -0
- package/docs/implementation-plan.md +335 -0
- package/docs/lib-implementation.md +77 -0
- package/docs/lowering-optimization-spec.md +1020 -0
- package/docs/project-structure.md +52 -0
- package/docs/transform-spec.md +2114 -0
- package/package.json +83 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as ts from "typescript";
|
|
2
|
+
import type { TransformerDiagnostic } from "../diagnostics.js";
|
|
3
|
+
import type { ExpressionDomainCache } from "./get-expression-domain.js";
|
|
4
|
+
import type { NumtypeSymbolTable } from "../symbols.js";
|
|
5
|
+
export interface AnalyzeSourceFileInput {
|
|
6
|
+
readonly checker: ts.TypeChecker;
|
|
7
|
+
readonly sourceFile: ts.SourceFile;
|
|
8
|
+
}
|
|
9
|
+
export interface SourceFileAnalysisResult {
|
|
10
|
+
readonly diagnostics: readonly TransformerDiagnostic[];
|
|
11
|
+
readonly expressionCache: ExpressionDomainCache;
|
|
12
|
+
readonly symbols: NumtypeSymbolTable;
|
|
13
|
+
}
|
|
14
|
+
export declare function analyzeSourceFile(input: AnalyzeSourceFileInput): SourceFileAnalysisResult;
|
|
15
|
+
//# sourceMappingURL=analyze-source-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze-source-file.d.ts","sourceRoot":"","sources":["../../../src/transformer/analyze/analyze-source-file.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAuBjC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,KAAK,EACV,qBAAqB,EAEtB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,KAAK,EAGV,kBAAkB,EACnB,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC;CACpC;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,WAAW,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACvD,QAAQ,CAAC,eAAe,EAAE,qBAAqB,CAAC;IAChD,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;CACtC;AAgBD,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,sBAAsB,GAC5B,wBAAwB,CAsG1B"}
|
|
@@ -0,0 +1,605 @@
|
|
|
1
|
+
import * as ts from "typescript";
|
|
2
|
+
import { createExpressionDomainCache, getExpressionDomain } from "./get-expression-domain.js";
|
|
3
|
+
import { getContextualDomain } from "./get-contextual-domain.js";
|
|
4
|
+
import { isNumericDomain, sortNumericDomains } from "../domains.js";
|
|
5
|
+
import { getTypeDomain, isNumericTypeDomain } from "./type-domain.js";
|
|
6
|
+
import { isDeclarationName, isImportOrExportName, isInsideTypeNode, isNonComputedPropertyName, isRuntimeExpression, isTransparentDomainWrapper } from "../ast.js";
|
|
7
|
+
import { createDiagnostic } from "../diagnostics.js";
|
|
8
|
+
import { getNumtypeBindingName, numtypesModuleSpecifier, resolveNumtypeSymbols } from "../symbols.js";
|
|
9
|
+
export function analyzeSourceFile(input) {
|
|
10
|
+
const symbols = resolveNumtypeSymbols(input.checker, input.sourceFile);
|
|
11
|
+
const expressionCache = createExpressionDomainCache();
|
|
12
|
+
const diagnostics = [];
|
|
13
|
+
const seenDiagnostics = new Set();
|
|
14
|
+
function addDiagnostic(diagnostic) {
|
|
15
|
+
const key = getDiagnosticKey(diagnostic);
|
|
16
|
+
if (!seenDiagnostics.has(key)) {
|
|
17
|
+
seenDiagnostics.add(key);
|
|
18
|
+
diagnostics.push(diagnostic);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function addDiagnostics(nextDiagnostics) {
|
|
22
|
+
for (const diagnostic of nextDiagnostics) {
|
|
23
|
+
addDiagnostic(diagnostic);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
addDiagnostics(getUnsupportedImportDiagnostics(input.sourceFile));
|
|
27
|
+
addDiagnostics(getNumtypeModuleValueExportDiagnostics(input.sourceFile));
|
|
28
|
+
addDiagnostics(getLocalNumtypeExportDiagnostics({
|
|
29
|
+
checker: input.checker,
|
|
30
|
+
sourceFile: input.sourceFile,
|
|
31
|
+
symbols
|
|
32
|
+
}));
|
|
33
|
+
function visit(node) {
|
|
34
|
+
if (ts.isIdentifier(node)) {
|
|
35
|
+
const runtimeSymbolDiagnostic = getRuntimeNumtypeSymbolUseDiagnostic(input.checker, node, symbols);
|
|
36
|
+
const runtimeNamespaceDiagnostic = getRuntimeNumtypeNamespaceUseDiagnostic(input.checker, node, symbols);
|
|
37
|
+
if (runtimeSymbolDiagnostic !== undefined) {
|
|
38
|
+
addDiagnostic(runtimeSymbolDiagnostic);
|
|
39
|
+
}
|
|
40
|
+
if (runtimeNamespaceDiagnostic !== undefined) {
|
|
41
|
+
addDiagnostic(runtimeNamespaceDiagnostic);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (ts.isPropertyAccessExpression(node)) {
|
|
45
|
+
const propertyAccessDiagnostic = getRuntimeNumtypePropertyAccessUseDiagnostic(node, symbols);
|
|
46
|
+
if (propertyAccessDiagnostic !== undefined) {
|
|
47
|
+
addDiagnostic(propertyAccessDiagnostic);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (isRuntimeExpression(node)) {
|
|
51
|
+
const context = getContextualDomain({
|
|
52
|
+
checker: input.checker,
|
|
53
|
+
node,
|
|
54
|
+
symbols
|
|
55
|
+
});
|
|
56
|
+
const expressionResult = getExpressionDomain({
|
|
57
|
+
cache: expressionCache,
|
|
58
|
+
checker: input.checker,
|
|
59
|
+
contextualDomain: context.domain,
|
|
60
|
+
expression: node,
|
|
61
|
+
symbols
|
|
62
|
+
});
|
|
63
|
+
addDiagnostics(context.diagnostics);
|
|
64
|
+
addDiagnostics(expressionResult.diagnostics);
|
|
65
|
+
const leakDiagnostic = getDomainLeakDiagnostic({
|
|
66
|
+
checker: input.checker,
|
|
67
|
+
context,
|
|
68
|
+
expression: node,
|
|
69
|
+
expressionResult,
|
|
70
|
+
symbols
|
|
71
|
+
});
|
|
72
|
+
if (leakDiagnostic !== undefined) {
|
|
73
|
+
addDiagnostic(leakDiagnostic);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
ts.forEachChild(node, visit);
|
|
77
|
+
}
|
|
78
|
+
visit(input.sourceFile);
|
|
79
|
+
return {
|
|
80
|
+
diagnostics,
|
|
81
|
+
expressionCache,
|
|
82
|
+
symbols
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
function getUnsupportedImportDiagnostics(sourceFile) {
|
|
86
|
+
const diagnostics = [];
|
|
87
|
+
for (const statement of sourceFile.statements) {
|
|
88
|
+
if (!isNumtypesImportDeclaration(statement)) {
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
const importClause = statement.importClause;
|
|
92
|
+
if (importClause === undefined) {
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
if (importClause.name !== undefined) {
|
|
96
|
+
diagnostics.push(createDiagnostic("NUMTYPES_UNSUPPORTED_IMPORT", "unsupported default import from numtypes; use named imports for i32, u32, f32, and f64", getDiagnosticLocation(importClause.name)));
|
|
97
|
+
}
|
|
98
|
+
const namedBindings = importClause.namedBindings;
|
|
99
|
+
if (namedBindings !== undefined && ts.isNamedImports(namedBindings)) {
|
|
100
|
+
for (const specifier of namedBindings.elements) {
|
|
101
|
+
const importedName = getModuleExportNameText(specifier.propertyName ?? specifier.name);
|
|
102
|
+
if (!isNumericDomain(importedName)) {
|
|
103
|
+
diagnostics.push(createDiagnostic("NUMTYPES_UNSUPPORTED_IMPORT", `unsupported named import '${importedName}' from numtypes`, getDiagnosticLocation(specifier)));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return diagnostics;
|
|
109
|
+
}
|
|
110
|
+
function getNumtypeModuleValueExportDiagnostics(sourceFile) {
|
|
111
|
+
const diagnostics = [];
|
|
112
|
+
for (const statement of sourceFile.statements) {
|
|
113
|
+
if (!ts.isExportDeclaration(statement) ||
|
|
114
|
+
!isNumtypesExportDeclaration(statement) ||
|
|
115
|
+
statement.isTypeOnly) {
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
const exportClause = statement.exportClause;
|
|
119
|
+
if (exportClause === undefined || ts.isNamespaceExport(exportClause)) {
|
|
120
|
+
diagnostics.push(createDiagnostic("NUMTYPES_ERASED_CAST_MISUSE", 'cannot re-export numtypes runtime markers from "numtypes" because they are erased; use type-only exports for numtypes types', getDiagnosticLocation(exportClause ?? statement)));
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
for (const specifier of exportClause.elements) {
|
|
124
|
+
if (specifier.isTypeOnly) {
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
const exportedName = getModuleExportNameText(specifier.propertyName ?? specifier.name);
|
|
128
|
+
if (!isNumericDomain(exportedName)) {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
diagnostics.push(createDiagnostic("NUMTYPES_ERASED_CAST_MISUSE", `cannot re-export numtypes cast function '${exportedName}' from "numtypes" because numtypes runtime markers are erased`, getDiagnosticLocation(specifier)));
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return diagnostics;
|
|
135
|
+
}
|
|
136
|
+
function getLocalNumtypeExportDiagnostics(input) {
|
|
137
|
+
const diagnostics = [];
|
|
138
|
+
for (const statement of input.sourceFile.statements) {
|
|
139
|
+
if (!ts.isExportDeclaration(statement) ||
|
|
140
|
+
statement.moduleSpecifier !== undefined ||
|
|
141
|
+
statement.isTypeOnly) {
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
const exportClause = statement.exportClause;
|
|
145
|
+
if (exportClause === undefined || ts.isNamespaceExport(exportClause)) {
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
for (const specifier of exportClause.elements) {
|
|
149
|
+
if (specifier.isTypeOnly) {
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
const localName = specifier.propertyName ?? specifier.name;
|
|
153
|
+
if (!ts.isIdentifier(localName)) {
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
const namespaceImport = getNamespaceImportForLocalExport(input.checker, input.symbols, localName);
|
|
157
|
+
if (namespaceImport !== undefined) {
|
|
158
|
+
diagnostics.push(createDiagnostic("NUMTYPES_ERASED_CAST_MISUSE", `cannot re-export numtypes namespace import '${localName.text}' because numtypes runtime markers are erased`, getDiagnosticLocation(localName)));
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
const binding = getBindingForLocalExport(input.checker, input.symbols, localName);
|
|
162
|
+
if (binding === undefined) {
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
diagnostics.push(createDiagnostic("NUMTYPES_ERASED_CAST_MISUSE", `cannot re-export numtypes cast function '${localName.text}' from a local import because numtypes runtime markers are erased`, getDiagnosticLocation(localName)));
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return diagnostics;
|
|
169
|
+
}
|
|
170
|
+
function getRuntimeNumtypeSymbolUseDiagnostic(checker, identifier, symbols) {
|
|
171
|
+
const binding = getBindingForRuntimeIdentifier(checker, symbols, identifier);
|
|
172
|
+
if (binding === undefined || !isRuntimeNumtypeSymbolUse(identifier)) {
|
|
173
|
+
return undefined;
|
|
174
|
+
}
|
|
175
|
+
if (isNumtypeCastCallCallee(identifier)) {
|
|
176
|
+
return undefined;
|
|
177
|
+
}
|
|
178
|
+
return createDiagnostic("NUMTYPES_ERASED_CAST_MISUSE", `cannot use numtypes cast function '${getNumtypeBindingName(binding)}' as a runtime value; call it directly as ${getNumtypeBindingName(binding)}(value)`, getDiagnosticLocation(identifier));
|
|
179
|
+
}
|
|
180
|
+
function getRuntimeNumtypeNamespaceUseDiagnostic(checker, identifier, symbols) {
|
|
181
|
+
const namespaceImport = getRuntimeNamespaceImportForIdentifier(checker, symbols, identifier);
|
|
182
|
+
if (namespaceImport === undefined ||
|
|
183
|
+
!isRuntimeNumtypeSymbolUse(identifier) ||
|
|
184
|
+
isNumtypeNamespacePropertyAccessReceiver(identifier)) {
|
|
185
|
+
return undefined;
|
|
186
|
+
}
|
|
187
|
+
return createDiagnostic("NUMTYPES_ERASED_CAST_MISUSE", `cannot use numtypes namespace import '${identifier.text}' as a runtime value; call a marker directly as ${identifier.text}.i32(value)`, getDiagnosticLocation(identifier));
|
|
188
|
+
}
|
|
189
|
+
function getRuntimeNumtypePropertyAccessUseDiagnostic(expression, symbols) {
|
|
190
|
+
const binding = symbols.getBindingForPropertyAccessExpression(expression);
|
|
191
|
+
if (binding === undefined ||
|
|
192
|
+
isInsideTypeNode(expression) ||
|
|
193
|
+
isNumtypeCastCallCalleeExpression(expression)) {
|
|
194
|
+
return undefined;
|
|
195
|
+
}
|
|
196
|
+
const bindingName = getNumtypeBindingName(binding);
|
|
197
|
+
return createDiagnostic("NUMTYPES_ERASED_CAST_MISUSE", `cannot use numtypes cast function '${bindingName}' as a runtime value; call it directly as ${bindingName}(value)`, getDiagnosticLocation(expression));
|
|
198
|
+
}
|
|
199
|
+
function getBindingForRuntimeIdentifier(checker, symbols, identifier) {
|
|
200
|
+
const directBinding = symbols.getBindingForIdentifier(identifier);
|
|
201
|
+
if (directBinding !== undefined) {
|
|
202
|
+
return directBinding;
|
|
203
|
+
}
|
|
204
|
+
if (ts.isShorthandPropertyAssignment(identifier.parent)) {
|
|
205
|
+
const valueSymbol = checker.getShorthandAssignmentValueSymbol(identifier.parent);
|
|
206
|
+
if (valueSymbol !== undefined) {
|
|
207
|
+
return symbols.getBindingForSymbol(valueSymbol);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return undefined;
|
|
211
|
+
}
|
|
212
|
+
function getRuntimeNamespaceImportForIdentifier(checker, symbols, identifier) {
|
|
213
|
+
const directNamespaceImport = symbols.getNamespaceImportForIdentifier(identifier);
|
|
214
|
+
if (directNamespaceImport !== undefined) {
|
|
215
|
+
return directNamespaceImport;
|
|
216
|
+
}
|
|
217
|
+
if (ts.isShorthandPropertyAssignment(identifier.parent)) {
|
|
218
|
+
const valueSymbol = checker.getShorthandAssignmentValueSymbol(identifier.parent);
|
|
219
|
+
if (valueSymbol !== undefined) {
|
|
220
|
+
return symbols.getNamespaceImportForSymbol(valueSymbol);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return undefined;
|
|
224
|
+
}
|
|
225
|
+
function getBindingForLocalExport(checker, symbols, identifier) {
|
|
226
|
+
const directBinding = symbols.getBindingForIdentifier(identifier);
|
|
227
|
+
if (directBinding !== undefined) {
|
|
228
|
+
return directBinding;
|
|
229
|
+
}
|
|
230
|
+
const symbol = checker.getSymbolAtLocation(identifier);
|
|
231
|
+
if (symbol === undefined || (symbol.flags & ts.SymbolFlags.Alias) === 0) {
|
|
232
|
+
return undefined;
|
|
233
|
+
}
|
|
234
|
+
return symbols.getBindingForExportedSymbol(checker.getAliasedSymbol(symbol));
|
|
235
|
+
}
|
|
236
|
+
function getNamespaceImportForLocalExport(checker, symbols, identifier) {
|
|
237
|
+
const directNamespaceImport = symbols.getNamespaceImportForIdentifier(identifier);
|
|
238
|
+
if (directNamespaceImport !== undefined) {
|
|
239
|
+
return directNamespaceImport;
|
|
240
|
+
}
|
|
241
|
+
const symbol = checker.getSymbolAtLocation(identifier);
|
|
242
|
+
if (symbol === undefined || (symbol.flags & ts.SymbolFlags.Alias) === 0) {
|
|
243
|
+
return undefined;
|
|
244
|
+
}
|
|
245
|
+
return symbols.getNamespaceImportForSymbol(checker.getAliasedSymbol(symbol));
|
|
246
|
+
}
|
|
247
|
+
function isRuntimeNumtypeSymbolUse(identifier) {
|
|
248
|
+
const parent = identifier.parent;
|
|
249
|
+
if (isInsideTypeNode(identifier)) {
|
|
250
|
+
return false;
|
|
251
|
+
}
|
|
252
|
+
if (isImportOrExportName(identifier, parent)) {
|
|
253
|
+
return false;
|
|
254
|
+
}
|
|
255
|
+
if (isDeclarationName(identifier, parent)) {
|
|
256
|
+
return false;
|
|
257
|
+
}
|
|
258
|
+
if (ts.isShorthandPropertyAssignment(parent) && parent.name === identifier) {
|
|
259
|
+
return true;
|
|
260
|
+
}
|
|
261
|
+
if (isNonComputedPropertyName(identifier, parent)) {
|
|
262
|
+
return false;
|
|
263
|
+
}
|
|
264
|
+
if (ts.isPropertyAccessExpression(parent) && parent.name === identifier) {
|
|
265
|
+
return false;
|
|
266
|
+
}
|
|
267
|
+
return true;
|
|
268
|
+
}
|
|
269
|
+
function isNumtypeCastCallCallee(identifier) {
|
|
270
|
+
const parent = identifier.parent;
|
|
271
|
+
return ts.isCallExpression(parent) && parent.expression === identifier;
|
|
272
|
+
}
|
|
273
|
+
function isNumtypeCastCallCalleeExpression(expression) {
|
|
274
|
+
const parent = expression.parent;
|
|
275
|
+
return ts.isCallExpression(parent) && parent.expression === expression;
|
|
276
|
+
}
|
|
277
|
+
function isNumtypeNamespacePropertyAccessReceiver(identifier) {
|
|
278
|
+
const parent = identifier.parent;
|
|
279
|
+
return (ts.isPropertyAccessExpression(parent) &&
|
|
280
|
+
parent.expression === identifier &&
|
|
281
|
+
isNumericDomain(parent.name.text));
|
|
282
|
+
}
|
|
283
|
+
function getDomainLeakDiagnostic(input) {
|
|
284
|
+
if (!isNumericTypeDomain(input.expressionResult.domain) &&
|
|
285
|
+
input.expressionResult.unionDomains === undefined) {
|
|
286
|
+
return undefined;
|
|
287
|
+
}
|
|
288
|
+
if (input.expressionResult.diagnostics.length > 0) {
|
|
289
|
+
return undefined;
|
|
290
|
+
}
|
|
291
|
+
if (hasTransparentDomainWrapperParent(input.expression)) {
|
|
292
|
+
return undefined;
|
|
293
|
+
}
|
|
294
|
+
const boundary = getEscapeBoundary(input.expression);
|
|
295
|
+
if (boundary === undefined) {
|
|
296
|
+
return undefined;
|
|
297
|
+
}
|
|
298
|
+
if (hasContextualDomain(input.context) &&
|
|
299
|
+
!isImplicitVariableBoundary(boundary)) {
|
|
300
|
+
return undefined;
|
|
301
|
+
}
|
|
302
|
+
if (boundary.kind === "call-argument" &&
|
|
303
|
+
isNumtypesCastCallArgument(input.expression, input.symbols)) {
|
|
304
|
+
return undefined;
|
|
305
|
+
}
|
|
306
|
+
if (boundary.kind === "call-argument" &&
|
|
307
|
+
!isPlainNumberCallArgument(input.checker, input.expression, input.symbols)) {
|
|
308
|
+
return undefined;
|
|
309
|
+
}
|
|
310
|
+
const typeDomainResult = getTypeDomain({
|
|
311
|
+
checker: input.checker,
|
|
312
|
+
node: input.expression,
|
|
313
|
+
symbols: input.symbols,
|
|
314
|
+
type: input.checker.getTypeAtLocation(input.expression)
|
|
315
|
+
});
|
|
316
|
+
if (input.expressionResult.unionDomains !== undefined &&
|
|
317
|
+
input.expressionResult.unionDomains.length > 0) {
|
|
318
|
+
if (isPreservedNumericUnion(input.expressionResult, typeDomainResult)) {
|
|
319
|
+
return undefined;
|
|
320
|
+
}
|
|
321
|
+
return createDiagnostic("NUMTYPES_DOMAIN_LEAK", getUnionDomainLeakMessage(boundary, input.expressionResult.unionDomains, input.expressionResult.hasNonNumericUnionMembers === true), getDiagnosticLocation(input.expression));
|
|
322
|
+
}
|
|
323
|
+
if (typeDomainResult.domain !== "plain-number") {
|
|
324
|
+
return undefined;
|
|
325
|
+
}
|
|
326
|
+
if (!isNumericTypeDomain(input.expressionResult.domain)) {
|
|
327
|
+
return undefined;
|
|
328
|
+
}
|
|
329
|
+
return createDiagnostic("NUMTYPES_DOMAIN_LEAK", getDomainLeakMessage(boundary, input.expressionResult.domain), getDiagnosticLocation(input.expression));
|
|
330
|
+
}
|
|
331
|
+
function getEscapeBoundary(expression) {
|
|
332
|
+
const parent = expression.parent;
|
|
333
|
+
if (isTransparentDomainWrapper(parent)) {
|
|
334
|
+
return getEscapeBoundary(parent);
|
|
335
|
+
}
|
|
336
|
+
if (ts.isVariableDeclaration(parent) && parent.initializer === expression) {
|
|
337
|
+
return {
|
|
338
|
+
isTyped: parent.type !== undefined,
|
|
339
|
+
kind: "variable",
|
|
340
|
+
name: getBindingNameText(parent.name)
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
if (ts.isBinaryExpression(parent) &&
|
|
344
|
+
parent.right === expression &&
|
|
345
|
+
isAssignmentOperator(parent.operatorToken.kind)) {
|
|
346
|
+
return {
|
|
347
|
+
kind: "assignment"
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
if (ts.isReturnStatement(parent) && parent.expression === expression) {
|
|
351
|
+
return {
|
|
352
|
+
kind: "return"
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
if (ts.isArrowFunction(parent) && parent.body === expression) {
|
|
356
|
+
return {
|
|
357
|
+
kind: "return"
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
if (ts.isCallExpression(parent) &&
|
|
361
|
+
parent.expression !== expression &&
|
|
362
|
+
parent.arguments.some((argument) => argument === expression)) {
|
|
363
|
+
return {
|
|
364
|
+
kind: "call-argument"
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
if (ts.isPropertyAssignment(parent) && parent.initializer === expression) {
|
|
368
|
+
return {
|
|
369
|
+
kind: "object-property",
|
|
370
|
+
name: getPropertyNameText(parent.name)
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
if (ts.isArrayLiteralExpression(parent) &&
|
|
374
|
+
parent.elements.some((element) => element === expression)) {
|
|
375
|
+
return {
|
|
376
|
+
kind: "array-element"
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
return undefined;
|
|
380
|
+
}
|
|
381
|
+
function hasTransparentDomainWrapperParent(expression) {
|
|
382
|
+
const parent = expression.parent;
|
|
383
|
+
return isTransparentDomainWrapper(parent);
|
|
384
|
+
}
|
|
385
|
+
function getDomainLeakMessage(boundary, domain) {
|
|
386
|
+
const explicitBoundaryMessage = `use a checked cast such as ${domain}(...) at the boundary or explicitly escape to a non-numtypes type`;
|
|
387
|
+
switch (boundary.kind) {
|
|
388
|
+
case "assignment":
|
|
389
|
+
return `result of ${domain} operation is assigned to plain number target; ${explicitBoundaryMessage}`;
|
|
390
|
+
case "array-element":
|
|
391
|
+
return `result of ${domain} operation initializes an array element without a contextual numtypes element type; ${explicitBoundaryMessage}`;
|
|
392
|
+
case "call-argument":
|
|
393
|
+
return `result of ${domain} operation is passed to number parameter without explicit cast; ${explicitBoundaryMessage}`;
|
|
394
|
+
case "object-property":
|
|
395
|
+
return `result of ${domain} operation initializes object property '${boundary.name ?? "<unknown>"}' without a contextual numtypes property type; ${explicitBoundaryMessage}`;
|
|
396
|
+
case "return":
|
|
397
|
+
return `result of ${domain} operation is returned without an explicit cast; ${explicitBoundaryMessage}`;
|
|
398
|
+
case "variable":
|
|
399
|
+
return `result of ${domain} operation is assigned to untyped variable '${boundary.name ?? "<unknown>"}'; ${explicitBoundaryMessage}`;
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
function getUnionDomainLeakMessage(boundary, domains, hasNonNumericMembers) {
|
|
403
|
+
const domainText = formatNumericDomains(domains);
|
|
404
|
+
const expressionText = hasNonNumericMembers
|
|
405
|
+
? `union containing ${domainText}`
|
|
406
|
+
: domainText;
|
|
407
|
+
const explicitBoundaryMessage = "use a matching union annotation with checked casts for number-typed branches or explicitly escape to a non-numtypes type";
|
|
408
|
+
switch (boundary.kind) {
|
|
409
|
+
case "assignment":
|
|
410
|
+
return `result of ${expressionText} expression is assigned to a target without matching numtypes union annotation; ${explicitBoundaryMessage}`;
|
|
411
|
+
case "array-element":
|
|
412
|
+
return `result of ${expressionText} expression initializes an array element without a matching numtypes union element type; ${explicitBoundaryMessage}`;
|
|
413
|
+
case "call-argument":
|
|
414
|
+
return `result of ${expressionText} expression is passed to number parameter without explicit cast; ${explicitBoundaryMessage}`;
|
|
415
|
+
case "object-property":
|
|
416
|
+
return `result of ${expressionText} expression initializes object property '${boundary.name ?? "<unknown>"}' without a matching numtypes union property type; ${explicitBoundaryMessage}`;
|
|
417
|
+
case "return":
|
|
418
|
+
return `result of ${expressionText} expression is returned without an explicit cast; ${explicitBoundaryMessage}`;
|
|
419
|
+
case "variable":
|
|
420
|
+
return `result of ${expressionText} expression is assigned to untyped variable '${boundary.name ?? "<unknown>"}'; ${explicitBoundaryMessage}`;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
function hasContextualDomain(context) {
|
|
424
|
+
return context.domain !== undefined || context.unionDomains !== undefined;
|
|
425
|
+
}
|
|
426
|
+
function isImplicitVariableBoundary(boundary) {
|
|
427
|
+
return boundary.kind === "variable" && boundary.isTyped !== true;
|
|
428
|
+
}
|
|
429
|
+
function isPreservedNumericUnion(expressionResult, typeDomainResult) {
|
|
430
|
+
if (expressionResult.unionDomains === undefined ||
|
|
431
|
+
typeDomainResult.unionDomains === undefined) {
|
|
432
|
+
return false;
|
|
433
|
+
}
|
|
434
|
+
return (sameNumericDomains(expressionResult.unionDomains, typeDomainResult.unionDomains) &&
|
|
435
|
+
(expressionResult.hasNonNumericUnionMembers === true) ===
|
|
436
|
+
(typeDomainResult.hasNonNumericUnionMembers === true));
|
|
437
|
+
}
|
|
438
|
+
function sameNumericDomains(left, right) {
|
|
439
|
+
const sortedLeft = sortNumericDomains(left);
|
|
440
|
+
const sortedRight = sortNumericDomains(right);
|
|
441
|
+
return (sortedLeft.length === sortedRight.length &&
|
|
442
|
+
sortedLeft.every((domain, index) => domain === sortedRight[index]));
|
|
443
|
+
}
|
|
444
|
+
function isPlainNumberCallArgument(checker, expression, symbols) {
|
|
445
|
+
const contextualType = checker.getContextualType(expression);
|
|
446
|
+
if (contextualType !== undefined) {
|
|
447
|
+
return isPlainNumberLikeCallBoundaryType({
|
|
448
|
+
checker,
|
|
449
|
+
expression,
|
|
450
|
+
symbols,
|
|
451
|
+
type: contextualType
|
|
452
|
+
});
|
|
453
|
+
}
|
|
454
|
+
const parameterType = getCallArgumentParameterType(checker, expression);
|
|
455
|
+
if (parameterType === undefined) {
|
|
456
|
+
return false;
|
|
457
|
+
}
|
|
458
|
+
return isPlainNumberLikeCallBoundaryType({
|
|
459
|
+
checker,
|
|
460
|
+
expression,
|
|
461
|
+
symbols,
|
|
462
|
+
type: parameterType
|
|
463
|
+
});
|
|
464
|
+
}
|
|
465
|
+
function getCallArgumentParameterType(checker, expression) {
|
|
466
|
+
const parent = expression.parent;
|
|
467
|
+
if (!ts.isCallExpression(parent)) {
|
|
468
|
+
return undefined;
|
|
469
|
+
}
|
|
470
|
+
const argumentIndex = parent.arguments.findIndex((argument) => argument === expression);
|
|
471
|
+
if (argumentIndex < 0) {
|
|
472
|
+
return undefined;
|
|
473
|
+
}
|
|
474
|
+
const signature = checker.getResolvedSignature(parent);
|
|
475
|
+
if (signature === undefined) {
|
|
476
|
+
return undefined;
|
|
477
|
+
}
|
|
478
|
+
const parameter = getParameterForArgument(signature, argumentIndex);
|
|
479
|
+
if (parameter === undefined) {
|
|
480
|
+
return undefined;
|
|
481
|
+
}
|
|
482
|
+
const parameterType = checker.getTypeOfSymbolAtLocation(parameter, expression);
|
|
483
|
+
if (!isRestParameterSymbol(parameter)) {
|
|
484
|
+
return parameterType;
|
|
485
|
+
}
|
|
486
|
+
return (checker.getIndexTypeOfType(parameterType, ts.IndexKind.Number) ??
|
|
487
|
+
parameterType);
|
|
488
|
+
}
|
|
489
|
+
function getParameterForArgument(signature, argumentIndex) {
|
|
490
|
+
const parameters = signature.getParameters();
|
|
491
|
+
const directParameter = parameters[argumentIndex];
|
|
492
|
+
if (directParameter !== undefined) {
|
|
493
|
+
return directParameter;
|
|
494
|
+
}
|
|
495
|
+
const lastParameter = parameters.length === 0 ? undefined : parameters[parameters.length - 1];
|
|
496
|
+
if (lastParameter !== undefined && isRestParameterSymbol(lastParameter)) {
|
|
497
|
+
return lastParameter;
|
|
498
|
+
}
|
|
499
|
+
return undefined;
|
|
500
|
+
}
|
|
501
|
+
function isRestParameterSymbol(parameter) {
|
|
502
|
+
const declaration = parameter.valueDeclaration ?? parameter.declarations?.[0];
|
|
503
|
+
return (declaration !== undefined &&
|
|
504
|
+
ts.isParameter(declaration) &&
|
|
505
|
+
declaration.dotDotDotToken !== undefined);
|
|
506
|
+
}
|
|
507
|
+
function isPlainNumberLikeCallBoundaryType(input) {
|
|
508
|
+
const typeDomainResult = getTypeDomain({
|
|
509
|
+
checker: input.checker,
|
|
510
|
+
node: input.expression,
|
|
511
|
+
symbols: input.symbols,
|
|
512
|
+
type: input.type
|
|
513
|
+
});
|
|
514
|
+
if (typeDomainResult.domain === "plain-number") {
|
|
515
|
+
return true;
|
|
516
|
+
}
|
|
517
|
+
if (typeDomainResult.diagnostics.length > 0) {
|
|
518
|
+
return false;
|
|
519
|
+
}
|
|
520
|
+
return containsPlainNumberType(input.type);
|
|
521
|
+
}
|
|
522
|
+
function containsPlainNumberType(type) {
|
|
523
|
+
if ((type.flags & ts.TypeFlags.NumberLike) !== 0) {
|
|
524
|
+
return true;
|
|
525
|
+
}
|
|
526
|
+
if (type.isUnion() || type.isIntersection()) {
|
|
527
|
+
return type.types.some(containsPlainNumberType);
|
|
528
|
+
}
|
|
529
|
+
return false;
|
|
530
|
+
}
|
|
531
|
+
function isNumtypesCastCallArgument(expression, symbols) {
|
|
532
|
+
const parent = expression.parent;
|
|
533
|
+
if (!ts.isCallExpression(parent)) {
|
|
534
|
+
return false;
|
|
535
|
+
}
|
|
536
|
+
if (parent.arguments[0] !== expression) {
|
|
537
|
+
return false;
|
|
538
|
+
}
|
|
539
|
+
const binding = symbols.getBindingForCastCallee(parent.expression);
|
|
540
|
+
return binding !== undefined && !binding.isTypeOnly;
|
|
541
|
+
}
|
|
542
|
+
function getBindingNameText(name) {
|
|
543
|
+
if (ts.isIdentifier(name)) {
|
|
544
|
+
return name.text;
|
|
545
|
+
}
|
|
546
|
+
return undefined;
|
|
547
|
+
}
|
|
548
|
+
function getPropertyNameText(name) {
|
|
549
|
+
if (ts.isIdentifier(name) || ts.isStringLiteralLike(name)) {
|
|
550
|
+
return name.text;
|
|
551
|
+
}
|
|
552
|
+
if (ts.isNumericLiteral(name)) {
|
|
553
|
+
return name.text;
|
|
554
|
+
}
|
|
555
|
+
return undefined;
|
|
556
|
+
}
|
|
557
|
+
function isAssignmentOperator(operator) {
|
|
558
|
+
return (operator === ts.SyntaxKind.EqualsToken ||
|
|
559
|
+
operator === ts.SyntaxKind.PlusEqualsToken ||
|
|
560
|
+
operator === ts.SyntaxKind.MinusEqualsToken ||
|
|
561
|
+
operator === ts.SyntaxKind.AsteriskEqualsToken ||
|
|
562
|
+
operator === ts.SyntaxKind.AsteriskAsteriskEqualsToken ||
|
|
563
|
+
operator === ts.SyntaxKind.SlashEqualsToken ||
|
|
564
|
+
operator === ts.SyntaxKind.PercentEqualsToken ||
|
|
565
|
+
operator === ts.SyntaxKind.LessThanLessThanEqualsToken ||
|
|
566
|
+
operator === ts.SyntaxKind.GreaterThanGreaterThanEqualsToken ||
|
|
567
|
+
operator === ts.SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken ||
|
|
568
|
+
operator === ts.SyntaxKind.AmpersandEqualsToken ||
|
|
569
|
+
operator === ts.SyntaxKind.BarEqualsToken ||
|
|
570
|
+
operator === ts.SyntaxKind.CaretEqualsToken);
|
|
571
|
+
}
|
|
572
|
+
function isNumtypesImportDeclaration(statement) {
|
|
573
|
+
return (ts.isImportDeclaration(statement) &&
|
|
574
|
+
ts.isStringLiteralLike(statement.moduleSpecifier) &&
|
|
575
|
+
statement.moduleSpecifier.text === numtypesModuleSpecifier);
|
|
576
|
+
}
|
|
577
|
+
function isNumtypesExportDeclaration(statement) {
|
|
578
|
+
return (statement.moduleSpecifier !== undefined &&
|
|
579
|
+
ts.isStringLiteralLike(statement.moduleSpecifier) &&
|
|
580
|
+
statement.moduleSpecifier.text === numtypesModuleSpecifier);
|
|
581
|
+
}
|
|
582
|
+
function getModuleExportNameText(name) {
|
|
583
|
+
return name.text;
|
|
584
|
+
}
|
|
585
|
+
function getDiagnosticLocation(node) {
|
|
586
|
+
const sourceFile = node.getSourceFile();
|
|
587
|
+
return {
|
|
588
|
+
fileName: sourceFile.fileName,
|
|
589
|
+
length: node.getWidth(sourceFile),
|
|
590
|
+
start: node.getStart(sourceFile)
|
|
591
|
+
};
|
|
592
|
+
}
|
|
593
|
+
function getDiagnosticKey(diagnostic) {
|
|
594
|
+
return [
|
|
595
|
+
diagnostic.code,
|
|
596
|
+
diagnostic.message,
|
|
597
|
+
diagnostic.location?.fileName ?? "",
|
|
598
|
+
diagnostic.location?.start ?? "",
|
|
599
|
+
diagnostic.location?.length ?? ""
|
|
600
|
+
].join("\u0000");
|
|
601
|
+
}
|
|
602
|
+
function formatNumericDomains(domains) {
|
|
603
|
+
return sortNumericDomains(domains).join(" | ");
|
|
604
|
+
}
|
|
605
|
+
//# sourceMappingURL=analyze-source-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze-source-file.js","sourceRoot":"","sources":["../../../src/transformer/analyze/analyze-source-file.ts"],"names":[],"mappings":"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"}
|