warpo 2.3.0 → 2.5.0-alpha-1
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/asconfig.schema.json +25 -3
- package/create/index.ts +4 -1
- package/dist/debug_server/dapServer.d.ts +1 -0
- package/dist/debug_server/dapServer.js +27 -0
- package/dist/debug_server/dapServer.js.map +1 -0
- package/dist/debug_server/debugSession.d.ts +19 -0
- package/dist/debug_server/debugSession.js +71 -0
- package/dist/debug_server/debugSession.js.map +1 -0
- package/dist/debug_server/tests/debugSession.test.d.ts +1 -0
- package/dist/debug_server/tests/debugSession.test.js +61 -0
- package/dist/debug_server/tests/debugSession.test.js.map +1 -0
- package/dist/debug_server/tests/launcher.d.ts +10 -0
- package/dist/debug_server/tests/launcher.js +21 -0
- package/dist/debug_server/tests/launcher.js.map +1 -0
- package/dist/scripts/lib.d.ts +7 -0
- package/dist/{lib.js → scripts/lib.js} +20 -6
- package/dist/scripts/lib.js.map +1 -0
- package/dist/test_runner/cli.d.ts +2 -0
- package/dist/test_runner/cli.js +85 -0
- package/dist/test_runner/cli.js.map +1 -0
- package/dist/test_runner/core/analyze.d.ts +13 -0
- package/dist/test_runner/core/analyze.js +58 -0
- package/dist/test_runner/core/analyze.js.map +1 -0
- package/dist/test_runner/core/compile.d.ts +4 -0
- package/dist/test_runner/core/compile.js +23 -0
- package/dist/test_runner/core/compile.js.map +1 -0
- package/dist/test_runner/core/compiler.d.ts +11 -0
- package/dist/test_runner/core/compiler.js +47 -0
- package/dist/test_runner/core/compiler.js.map +1 -0
- package/dist/test_runner/core/covRecorder.d.ts +5 -0
- package/dist/test_runner/core/covRecorder.js +26 -0
- package/dist/test_runner/core/covRecorder.js.map +1 -0
- package/dist/test_runner/core/execute.d.ts +4 -0
- package/dist/test_runner/core/execute.js +76 -0
- package/dist/test_runner/core/execute.js.map +1 -0
- package/dist/test_runner/core/executionRecorder.d.ts +52 -0
- package/dist/test_runner/core/executionRecorder.js +164 -0
- package/dist/test_runner/core/executionRecorder.js.map +1 -0
- package/dist/test_runner/core/mockStatusRecorder.d.ts +10 -0
- package/dist/test_runner/core/mockStatusRecorder.js +62 -0
- package/dist/test_runner/core/mockStatusRecorder.js.map +1 -0
- package/dist/test_runner/executionResult.d.ts +11 -0
- package/dist/test_runner/executionResult.js +112 -0
- package/dist/test_runner/executionResult.js.map +1 -0
- package/dist/test_runner/generator/html-generator/genCode.d.ts +2 -0
- package/dist/test_runner/generator/html-generator/genCode.js +124 -0
- package/dist/test_runner/generator/html-generator/genCode.js.map +1 -0
- package/dist/test_runner/generator/html-generator/genFolder.d.ts +2 -0
- package/dist/test_runner/generator/html-generator/genFolder.js +155 -0
- package/dist/test_runner/generator/html-generator/genFolder.js.map +1 -0
- package/dist/test_runner/generator/html-generator/index.d.ts +2 -0
- package/dist/test_runner/generator/html-generator/index.js +33 -0
- package/dist/test_runner/generator/html-generator/index.js.map +1 -0
- package/dist/test_runner/generator/index.d.ts +9 -0
- package/dist/test_runner/generator/index.js +30 -0
- package/dist/test_runner/generator/index.js.map +1 -0
- package/dist/test_runner/generator/json-generator/index.d.ts +2 -0
- package/dist/test_runner/generator/json-generator/index.js +45 -0
- package/dist/test_runner/generator/json-generator/index.js.map +1 -0
- package/dist/test_runner/generator/table-generator/index.d.ts +2 -0
- package/dist/test_runner/generator/table-generator/index.js +85 -0
- package/dist/test_runner/generator/table-generator/index.js.map +1 -0
- package/dist/test_runner/index.d.ts +3 -0
- package/dist/test_runner/index.js +70 -0
- package/dist/test_runner/index.js.map +1 -0
- package/dist/test_runner/interface.d.ts +36 -0
- package/dist/test_runner/interface.js +12 -0
- package/dist/test_runner/interface.js.map +1 -0
- package/dist/test_runner/parser/index.d.ts +35 -0
- package/dist/test_runner/parser/index.js +146 -0
- package/dist/test_runner/parser/index.js.map +1 -0
- package/dist/test_runner/parser/singleFileAnalysis.d.ts +8 -0
- package/dist/test_runner/parser/singleFileAnalysis.js +51 -0
- package/dist/test_runner/parser/singleFileAnalysis.js.map +1 -0
- package/dist/test_runner/parser/singleFunctionAnalysis.d.ts +16 -0
- package/dist/test_runner/parser/singleFunctionAnalysis.js +97 -0
- package/dist/test_runner/parser/singleFunctionAnalysis.js.map +1 -0
- package/dist/test_runner/testOption.d.ts +16 -0
- package/dist/test_runner/testOption.js +2 -0
- package/dist/test_runner/testOption.js.map +1 -0
- package/dist/test_runner/utils/errorTraceHandler.d.ts +12 -0
- package/dist/test_runner/utils/errorTraceHandler.js +87 -0
- package/dist/test_runner/utils/errorTraceHandler.js.map +1 -0
- package/dist/test_runner/utils/escape.d.ts +1 -0
- package/dist/test_runner/utils/escape.js +14 -0
- package/dist/test_runner/utils/escape.js.map +1 -0
- package/dist/test_runner/utils/index.d.ts +14 -0
- package/dist/test_runner/utils/index.js +88 -0
- package/dist/test_runner/utils/index.js.map +1 -0
- package/dist/test_runner/utils/interface.d.ts +100 -0
- package/dist/test_runner/utils/interface.js +86 -0
- package/dist/test_runner/utils/interface.js.map +1 -0
- package/dist/test_runner/utils/name.d.ts +2 -0
- package/dist/test_runner/utils/name.js +3 -0
- package/dist/test_runner/utils/name.js.map +1 -0
- package/dist/test_runner/utils/pathResolver.d.ts +6 -0
- package/dist/test_runner/utils/pathResolver.js +98 -0
- package/dist/test_runner/utils/pathResolver.js.map +1 -0
- package/dist/test_runner/utils/projectRoot.d.ts +1 -0
- package/dist/test_runner/utils/projectRoot.js +4 -0
- package/dist/test_runner/utils/projectRoot.js.map +1 -0
- package/dist/test_runner/utils/wasm.d.ts +12 -0
- package/dist/test_runner/utils/wasm.js +45 -0
- package/dist/test_runner/utils/wasm.js.map +1 -0
- package/dist/warpo.d.ts +7 -1
- package/dist/warpo.js +83 -3
- package/dist/warpo.js.map +1 -0
- package/package.json +36 -8
- package/tsconfig-warpo.json +2 -3
- package/{assemblyscript/std/assembly → types/std}/index.d.ts +26 -340
- package/types/std/package.json +3 -0
- package/types/std/tsconfig.json +4 -0
- package/types/tsconfig-base.json +15 -0
- package/types/tsconfig-std.json +13 -0
- package/types/warpo/index.d.ts +95 -1
- package/types/wasi_snapshot_preview1/index.d.ts +52 -0
- package/types/wasi_snapshot_preview1/package.json +3 -0
- package/types/wasi_snapshot_preview1/tsconfig.json +4 -0
- package/dist/lib.d.ts +0 -5
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { ASUtil } from "@assemblyscript/loader";
|
|
2
|
+
export declare abstract class UnitTestFramework {
|
|
3
|
+
/**
|
|
4
|
+
* function to redirect log message to unittest framework
|
|
5
|
+
* @param msg: message to log
|
|
6
|
+
*/
|
|
7
|
+
abstract log(msg: string): void;
|
|
8
|
+
}
|
|
9
|
+
export declare class ImportsArgument {
|
|
10
|
+
framework: UnitTestFramework;
|
|
11
|
+
module: WebAssembly.Module | null;
|
|
12
|
+
instance: WebAssembly.Instance | null;
|
|
13
|
+
exports: (ASUtil & Record<string, unknown>) | null;
|
|
14
|
+
constructor(framework: UnitTestFramework);
|
|
15
|
+
}
|
|
16
|
+
export type OutputMode = "html" | "json" | "table";
|
|
17
|
+
export type Imports = ((arg: ImportsArgument) => Record<string, unknown>) | null;
|
|
18
|
+
export declare class Config {
|
|
19
|
+
/** Files to include in testing and coverage statistics */
|
|
20
|
+
include: string[];
|
|
21
|
+
/** Files to exclude from testing and coverage statistics, has higher priority than include */
|
|
22
|
+
exclude?: string[];
|
|
23
|
+
/** entry files for the whole projects, used to collect all source code information. default value is `${include}/index.ts` */
|
|
24
|
+
entryFiles?: string[];
|
|
25
|
+
/** whether to collect coverage information, default is true */
|
|
26
|
+
collectCoverage?: boolean;
|
|
27
|
+
/** create an wasm instance for each test files. default is false (will be true in next major version) */
|
|
28
|
+
isolated?: boolean;
|
|
29
|
+
/** assemblyscript compile flag, default is --exportStart __unit_test_start --sourceMap --debug -O0 */
|
|
30
|
+
flags?: string;
|
|
31
|
+
imports?: Imports;
|
|
32
|
+
/** report folder path, default "./coverage" */
|
|
33
|
+
output?: string;
|
|
34
|
+
/** output report mode, default is "table" */
|
|
35
|
+
mode?: OutputMode | OutputMode[];
|
|
36
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interface.js","sourceRoot":"","sources":["../../tools/test_runner/interface.ts"],"names":[],"mappings":"AAEA,MAAM,OAAgB,iBAAiB;CAMtC;AAED,MAAM,OAAO,eAAe;IAIP;IAHnB,MAAM,GAA8B,IAAI,CAAC;IACzC,QAAQ,GAAgC,IAAI,CAAC;IAC7C,OAAO,GAA8C,IAAI,CAAC;IAC1D,YAAmB,SAA4B;QAA5B,cAAS,GAAT,SAAS,CAAmB;IAAG,CAAC;CACpD"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { FileCoverageResult, CovInfo, FunctionCoverageResult } from "../utils/interface.js";
|
|
2
|
+
import { WebAssemblyModule } from "../utils/wasm.js";
|
|
3
|
+
export declare class Parser {
|
|
4
|
+
fileCoverageResults: FileCoverageResult[];
|
|
5
|
+
functionCoverageResults: FunctionCoverageResult[];
|
|
6
|
+
/** key: functionName, value: CodeSnippetIndex trace */
|
|
7
|
+
functionCovTraceMap: Map<string, number[]>;
|
|
8
|
+
/** key: functionName, value: { branchInfo, lineInfo } */
|
|
9
|
+
functionCovInfoMap: Map<string, CovInfo>;
|
|
10
|
+
parse(wasmModule: WebAssemblyModule, sourceCodePaths: string[]): Promise<FileCoverageResult[]>;
|
|
11
|
+
private getTempCovTraceMap;
|
|
12
|
+
private getDebugInfos;
|
|
13
|
+
/**
|
|
14
|
+
* @brief
|
|
15
|
+
* parse debugInfo and traceInfo to functionCovTraceMap and functionCovInfoMap
|
|
16
|
+
* @param debugInfoFile debugInfo file path generated by instrumentation
|
|
17
|
+
*/
|
|
18
|
+
traceParse(instrumentResult: WebAssemblyModule): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* @brief
|
|
21
|
+
* generate FunctionCoverageInfo for each Function based on CovTrace and CovInfo.
|
|
22
|
+
* FunctionCoverageInfo of Function<T> will be merged into Function:
|
|
23
|
+
* FunctionCoverageInfo of toJson<f64> and toJson<i32> will be merged into toJson.
|
|
24
|
+
*/
|
|
25
|
+
generateFunctionCoverage(): void;
|
|
26
|
+
/**
|
|
27
|
+
* @brief
|
|
28
|
+
* For each sourceFile:
|
|
29
|
+
* First, filter out all functionCoverageResult from this.functionCoverageResults based on checkFunctionName(sourceFilePath, functionName).
|
|
30
|
+
* And then, find out which sourceFunction has been tested and which sourceFunction has not been tested.
|
|
31
|
+
* based on the function name match or lineRange match.
|
|
32
|
+
* Finally, merge the functionCoverageResult to fileCoverageResult.
|
|
33
|
+
*/
|
|
34
|
+
generateFileCoverage(sourceCodePaths: string[]): Promise<void>;
|
|
35
|
+
}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import fs from "fs-extra";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { isFunctionInsideFile, checkGenerics, json2map, checkVarargs } from "../utils/index.js";
|
|
4
|
+
import { SingleFileCoverageAnalysis } from "./singleFileAnalysis.js";
|
|
5
|
+
import { SingleFunctionCoverageAnalysis } from "./singleFunctionAnalysis.js";
|
|
6
|
+
import { FunctionCoverageResult, COVERAGE_DEBUG_INFO_SECTION_NAME, } from "../utils/interface.js";
|
|
7
|
+
export class Parser {
|
|
8
|
+
fileCoverageResults = [];
|
|
9
|
+
functionCoverageResults = [];
|
|
10
|
+
/** key: functionName, value: CodeSnippetIndex trace */
|
|
11
|
+
functionCovTraceMap = new Map();
|
|
12
|
+
/** key: functionName, value: { branchInfo, lineInfo } */
|
|
13
|
+
functionCovInfoMap = new Map();
|
|
14
|
+
async parse(wasmModule, sourceCodePaths) {
|
|
15
|
+
await this.traceParse(wasmModule);
|
|
16
|
+
this.generateFunctionCoverage();
|
|
17
|
+
await this.generateFileCoverage(sourceCodePaths);
|
|
18
|
+
return this.fileCoverageResults;
|
|
19
|
+
}
|
|
20
|
+
async getTempCovTraceMap(traceFile) {
|
|
21
|
+
const traces = (await fs.readJson(traceFile));
|
|
22
|
+
const tempCovTraceMap = new Map();
|
|
23
|
+
for (const trace of traces) {
|
|
24
|
+
const [funIndex, codeSnippetIndex] = trace;
|
|
25
|
+
const codeIndexes = tempCovTraceMap.get(funIndex);
|
|
26
|
+
if (codeIndexes) {
|
|
27
|
+
codeIndexes.push(codeSnippetIndex);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
tempCovTraceMap.set(funIndex, [codeSnippetIndex]);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return tempCovTraceMap;
|
|
34
|
+
}
|
|
35
|
+
async getDebugInfos(instrumentResult) {
|
|
36
|
+
const jsonText = await instrumentResult.getCustomSectionUtf8(COVERAGE_DEBUG_INFO_SECTION_NAME);
|
|
37
|
+
if (jsonText === null) {
|
|
38
|
+
throw new Error(`missing wasm custom section '${COVERAGE_DEBUG_INFO_SECTION_NAME}' in ${instrumentResult.wasm}`);
|
|
39
|
+
}
|
|
40
|
+
const debugInfo = JSON.parse(jsonText);
|
|
41
|
+
const debugInfos = json2map(debugInfo.debugInfos);
|
|
42
|
+
const debugFiles = debugInfo.debugFiles;
|
|
43
|
+
return { debugInfos, debugFiles };
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* @brief
|
|
47
|
+
* parse debugInfo and traceInfo to functionCovTraceMap and functionCovInfoMap
|
|
48
|
+
* @param debugInfoFile debugInfo file path generated by instrumentation
|
|
49
|
+
*/
|
|
50
|
+
async traceParse(instrumentResult) {
|
|
51
|
+
const [tempCovTraceMap, { debugInfos, debugFiles }] = await Promise.all([
|
|
52
|
+
this.getTempCovTraceMap(instrumentResult.traceFile),
|
|
53
|
+
this.getDebugInfos(instrumentResult),
|
|
54
|
+
]);
|
|
55
|
+
for (const [name, info] of debugInfos) {
|
|
56
|
+
const traces = tempCovTraceMap.get(info.index);
|
|
57
|
+
if (traces !== undefined) {
|
|
58
|
+
const originTraces = this.functionCovTraceMap.get(name) ?? [];
|
|
59
|
+
this.functionCovTraceMap.set(name, originTraces.concat(traces));
|
|
60
|
+
}
|
|
61
|
+
const lineInfoMap = new Map();
|
|
62
|
+
info.lineInfo.forEach((ranges, index) => {
|
|
63
|
+
// If instrument return basic block == null, ignore it.
|
|
64
|
+
if (ranges === null)
|
|
65
|
+
return;
|
|
66
|
+
const lineInfoArray = ranges
|
|
67
|
+
.filter((range) => {
|
|
68
|
+
const filename = debugFiles[range[0]];
|
|
69
|
+
if (filename === undefined) {
|
|
70
|
+
throw new Error(`unknown error: not find fileIndex ${range[0]} in ${instrumentResult.wasm}`);
|
|
71
|
+
}
|
|
72
|
+
// if basicBlock is inline function from other files, ignore it
|
|
73
|
+
return isFunctionInsideFile(filename, name);
|
|
74
|
+
})
|
|
75
|
+
.map((range) => range[1]);
|
|
76
|
+
// basic block index start at 0
|
|
77
|
+
lineInfoMap.set(index, new Set(lineInfoArray));
|
|
78
|
+
});
|
|
79
|
+
const covInfo = { branchInfo: info.branchInfo, lineInfo: lineInfoMap };
|
|
80
|
+
this.functionCovInfoMap.set(name, covInfo);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* @brief
|
|
85
|
+
* generate FunctionCoverageInfo for each Function based on CovTrace and CovInfo.
|
|
86
|
+
* FunctionCoverageInfo of Function<T> will be merged into Function:
|
|
87
|
+
* FunctionCoverageInfo of toJson<f64> and toJson<i32> will be merged into toJson.
|
|
88
|
+
*/
|
|
89
|
+
generateFunctionCoverage() {
|
|
90
|
+
const genericFunctionCovInfoMap = new Map();
|
|
91
|
+
for (const [functionName, singleFunctionCovTrace] of this.functionCovTraceMap.entries()) {
|
|
92
|
+
const singleFunctionCovInfo = this.functionCovInfoMap.get(functionName);
|
|
93
|
+
if (singleFunctionCovInfo === undefined) {
|
|
94
|
+
throw new Error(`CovInfo And CovTrace of Function ${functionName} mismatch`);
|
|
95
|
+
}
|
|
96
|
+
const singleFunctionAnalysis = new SingleFunctionCoverageAnalysis(singleFunctionCovInfo, functionName);
|
|
97
|
+
const singleFunctionCoverageInfo = singleFunctionAnalysis.update(singleFunctionCovTrace);
|
|
98
|
+
const functionNameWithoutGeneric = checkGenerics(functionName);
|
|
99
|
+
if (functionNameWithoutGeneric) {
|
|
100
|
+
const genericFunctionCovInfos = genericFunctionCovInfoMap.get(functionNameWithoutGeneric);
|
|
101
|
+
if (genericFunctionCovInfos) {
|
|
102
|
+
genericFunctionCovInfos.push(singleFunctionCoverageInfo);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
genericFunctionCovInfoMap.set(functionNameWithoutGeneric, [singleFunctionCoverageInfo]);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
this.functionCoverageResults.push(singleFunctionCoverageInfo);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
for (const [name, infos] of genericFunctionCovInfoMap) {
|
|
113
|
+
this.functionCoverageResults.push(FunctionCoverageResult.mergeFromGeneric(name, infos));
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* @brief
|
|
118
|
+
* For each sourceFile:
|
|
119
|
+
* First, filter out all functionCoverageResult from this.functionCoverageResults based on checkFunctionName(sourceFilePath, functionName).
|
|
120
|
+
* And then, find out which sourceFunction has been tested and which sourceFunction has not been tested.
|
|
121
|
+
* based on the function name match or lineRange match.
|
|
122
|
+
* Finally, merge the functionCoverageResult to fileCoverageResult.
|
|
123
|
+
*/
|
|
124
|
+
async generateFileCoverage(sourceCodePaths) {
|
|
125
|
+
for (const sourceCodePath of sourceCodePaths) {
|
|
126
|
+
const source = await readFile(sourceCodePath, { encoding: "utf8" });
|
|
127
|
+
const singleFileAnalysis = new SingleFileCoverageAnalysis(sourceCodePath, source);
|
|
128
|
+
const functionCovInfosInCurrentFile = this.functionCoverageResults.filter((result) => isFunctionInsideFile(sourceCodePath, result.functionName));
|
|
129
|
+
singleFileAnalysis.setTotalFunction(getTotalFunctionCount(this.functionCovInfoMap, sourceCodePath));
|
|
130
|
+
singleFileAnalysis.merge(functionCovInfosInCurrentFile);
|
|
131
|
+
this.fileCoverageResults.push(singleFileAnalysis.getResult());
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
function getTotalFunctionCount(functionCovInfoMap, sourceCodePath) {
|
|
136
|
+
const totalFunctionCount = new Set(Array.from(functionCovInfoMap.keys())
|
|
137
|
+
.map((functionName) => cleanupFunctionVariants(functionName) ?? functionName)
|
|
138
|
+
.filter((functionName) => isFunctionInsideFile(sourceCodePath, functionName))).size;
|
|
139
|
+
return totalFunctionCount;
|
|
140
|
+
}
|
|
141
|
+
function cleanupFunctionVariants(functionName) {
|
|
142
|
+
functionName = checkGenerics(functionName) ?? functionName;
|
|
143
|
+
functionName = checkVarargs(functionName) ?? functionName;
|
|
144
|
+
return functionName;
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../tools/test_runner/parser/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { FileCoverageResult, FunctionCoverageResult } from "../utils/interface.js";
|
|
2
|
+
export declare class SingleFileCoverageAnalysis {
|
|
3
|
+
result: FileCoverageResult;
|
|
4
|
+
constructor(fileName: string, source: string);
|
|
5
|
+
setTotalFunction(count: number): void;
|
|
6
|
+
merge(results: FunctionCoverageResult[]): void;
|
|
7
|
+
getResult(): FileCoverageResult;
|
|
8
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { Rate, CodeCoverage, FileCoverageResult } from "../utils/interface.js";
|
|
2
|
+
export class SingleFileCoverageAnalysis {
|
|
3
|
+
result;
|
|
4
|
+
constructor(fileName, source) {
|
|
5
|
+
this.result = new FileCoverageResult(fileName);
|
|
6
|
+
for (const srcLine of source.split(/\r?\n/)) {
|
|
7
|
+
this.result.sourceUsedCount.push(new CodeCoverage(srcLine));
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
setTotalFunction(count) {
|
|
11
|
+
this.result.functionCoverageRate.total = count;
|
|
12
|
+
}
|
|
13
|
+
merge(results) {
|
|
14
|
+
// SingleFileCoverageAnalysis contains FileCoverageResult
|
|
15
|
+
if (results.length === 0)
|
|
16
|
+
return;
|
|
17
|
+
for (const functionCovResult of results) {
|
|
18
|
+
for (const line of functionCovResult.uncoveredLines)
|
|
19
|
+
this.result.uncoveredLines.add(line);
|
|
20
|
+
for (const [lineIndex, count] of functionCovResult.sourceUsedCount.entries()) {
|
|
21
|
+
const srcLineUsedCount = this.result.sourceUsedCount[lineIndex - 1];
|
|
22
|
+
if (srcLineUsedCount === undefined) {
|
|
23
|
+
throw new Error(`unknown error: There is not Line ${lineIndex} in ${JSON.stringify(this.result.sourceUsedCount)}`);
|
|
24
|
+
}
|
|
25
|
+
if (srcLineUsedCount.usedCount === CodeCoverage.default) {
|
|
26
|
+
srcLineUsedCount.usedCount = count;
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
srcLineUsedCount.usedCount += count;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const branchCoverageRates = results.map((result) => result.branchCoverageRate);
|
|
34
|
+
branchCoverageRates.push(this.result.branchCoverageRate);
|
|
35
|
+
this.result.branchCoverageRate = Rate.summarize(branchCoverageRates);
|
|
36
|
+
this.result.functionCoverageRate.used += results.length;
|
|
37
|
+
}
|
|
38
|
+
getResult() {
|
|
39
|
+
for (const cov of this.result.sourceUsedCount) {
|
|
40
|
+
if (cov.usedCount === CodeCoverage.default)
|
|
41
|
+
continue;
|
|
42
|
+
if (cov.usedCount > 0) {
|
|
43
|
+
this.result.lineCoverageRate.used++;
|
|
44
|
+
}
|
|
45
|
+
this.result.lineCoverageRate.total++;
|
|
46
|
+
}
|
|
47
|
+
this.result.statementCoverageRate = this.result.lineCoverageRate;
|
|
48
|
+
return this.result;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=singleFileAnalysis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"singleFileAnalysis.js","sourceRoot":"","sources":["../../../tools/test_runner/parser/singleFileAnalysis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,kBAAkB,EAA0B,MAAM,uBAAuB,CAAC;AAEvG,MAAM,OAAO,0BAA0B;IACrC,MAAM,CAAqB;IAC3B,YAAY,QAAgB,EAAE,MAAc;QAC1C,IAAI,CAAC,MAAM,GAAG,IAAI,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAC/C,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,gBAAgB,CAAC,KAAa;QAC5B,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,KAAK,GAAG,KAAK,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,OAAiC;QACrC,yDAAyD;QACzD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACjC,KAAK,MAAM,iBAAiB,IAAI,OAAO,EAAE,CAAC;YACxC,KAAK,MAAM,IAAI,IAAI,iBAAiB,CAAC,cAAc;gBAAE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC1F,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,iBAAiB,CAAC,eAAe,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC7E,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;gBACpE,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;oBACnC,MAAM,IAAI,KAAK,CACb,oCAAoC,SAAS,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAClG,CAAC;gBACJ,CAAC;gBACD,IAAI,gBAAgB,CAAC,SAAS,KAAK,YAAY,CAAC,OAAO,EAAE,CAAC;oBACxD,gBAAgB,CAAC,SAAS,GAAG,KAAK,CAAC;gBACrC,CAAC;qBAAM,CAAC;oBACN,gBAAgB,CAAC,SAAS,IAAI,KAAK,CAAC;gBACtC,CAAC;YACH,CAAC;QACH,CAAC;QACD,MAAM,mBAAmB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;QAC/E,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QACrE,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IAC1D,CAAC;IAED,SAAS;QACP,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;YAC9C,IAAI,GAAG,CAAC,SAAS,KAAK,YAAY,CAAC,OAAO;gBAAE,SAAS;YACrD,IAAI,GAAG,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;gBACtB,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;YACtC,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QACvC,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,qBAAqB,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC;QAEjE,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { CodeSnippetIndex, CovInfo, FunctionCoverageResult, UncoveredBasicBlocks } from "../utils/interface.js";
|
|
2
|
+
type BranchGraph = Map<number, Map<number, boolean>>;
|
|
3
|
+
export declare class SingleFunctionCoverageAnalysis {
|
|
4
|
+
covInfo: CovInfo;
|
|
5
|
+
result: FunctionCoverageResult;
|
|
6
|
+
branchGraph: BranchGraph;
|
|
7
|
+
notFullyCoveredBasicBlock: UncoveredBasicBlocks;
|
|
8
|
+
constructor(covInfo: CovInfo, name: string);
|
|
9
|
+
update(indexSerialInSingleFunction: CodeSnippetIndex[]): FunctionCoverageResult;
|
|
10
|
+
updateLine(indexSerialInSingleFunction: CodeSnippetIndex[]): void;
|
|
11
|
+
updateBranch(indexSerialInSingleFunction: CodeSnippetIndex[]): void;
|
|
12
|
+
private markCoveredBranches;
|
|
13
|
+
private calculateBranchCoverage;
|
|
14
|
+
private addUncoveredLines;
|
|
15
|
+
}
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import assert from "node:assert";
|
|
2
|
+
import { FunctionCoverageResult } from "../utils/interface.js";
|
|
3
|
+
export class SingleFunctionCoverageAnalysis {
|
|
4
|
+
covInfo;
|
|
5
|
+
result;
|
|
6
|
+
branchGraph = new Map();
|
|
7
|
+
notFullyCoveredBasicBlock = new Set();
|
|
8
|
+
constructor(covInfo, name) {
|
|
9
|
+
this.covInfo = covInfo;
|
|
10
|
+
this.result = new FunctionCoverageResult(name);
|
|
11
|
+
this.result.branchCoverageRate.total = covInfo.branchInfo.length;
|
|
12
|
+
let maxLine = Number.MIN_SAFE_INTEGER, minLine = Number.MAX_SAFE_INTEGER;
|
|
13
|
+
for (const branchInfo of covInfo.branchInfo) {
|
|
14
|
+
const branches = this.branchGraph.get(branchInfo[0]);
|
|
15
|
+
if (branches) {
|
|
16
|
+
branches.set(branchInfo[1], false);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
this.branchGraph.set(branchInfo[0], new Map([[branchInfo[1], false]]));
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
for (const lineIndexSet of covInfo.lineInfo.values()) {
|
|
23
|
+
for (const lineIndex of lineIndexSet.values()) {
|
|
24
|
+
minLine = Math.min(minLine, lineIndex);
|
|
25
|
+
maxLine = Math.max(maxLine, lineIndex);
|
|
26
|
+
this.result.sourceUsedCount.set(lineIndex, 0);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (this.result.sourceUsedCount.size > 0) {
|
|
30
|
+
this.result.lineRange = [minLine, maxLine];
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
update(indexSerialInSingleFunction) {
|
|
34
|
+
this.updateLine(indexSerialInSingleFunction);
|
|
35
|
+
this.updateBranch(indexSerialInSingleFunction);
|
|
36
|
+
return this.result;
|
|
37
|
+
}
|
|
38
|
+
updateLine(indexSerialInSingleFunction) {
|
|
39
|
+
const indexCount = new Map();
|
|
40
|
+
for (const index of indexSerialInSingleFunction) {
|
|
41
|
+
const count = indexCount.get(index);
|
|
42
|
+
indexCount.set(index, count === undefined ? 1 : count + 1);
|
|
43
|
+
}
|
|
44
|
+
for (const [index, count] of indexCount.entries()) {
|
|
45
|
+
const codeLines = this.covInfo.lineInfo.get(index);
|
|
46
|
+
if (codeLines === undefined) {
|
|
47
|
+
throw new Error(`CovInfo And CovTrace of Function ${this.result.functionName} mismatch: Index: ${index}`);
|
|
48
|
+
}
|
|
49
|
+
for (const lineIndex of codeLines) {
|
|
50
|
+
const usedCount = this.result.sourceUsedCount.get(lineIndex);
|
|
51
|
+
this.result.sourceUsedCount.set(lineIndex, usedCount === undefined ? count : usedCount + count);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
updateBranch(indexSerialInSingleFunction) {
|
|
56
|
+
if (this.branchGraph.size === 0) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
this.markCoveredBranches(indexSerialInSingleFunction);
|
|
60
|
+
this.calculateBranchCoverage();
|
|
61
|
+
this.addUncoveredLines();
|
|
62
|
+
}
|
|
63
|
+
markCoveredBranches(indexSerialInSingleFunction) {
|
|
64
|
+
for (let i = 1; i < indexSerialInSingleFunction.length; i++) {
|
|
65
|
+
const first = indexSerialInSingleFunction[i - 1], second = indexSerialInSingleFunction[i];
|
|
66
|
+
assert(first !== undefined);
|
|
67
|
+
assert(second !== undefined);
|
|
68
|
+
const toNodes = this.branchGraph.get(first);
|
|
69
|
+
if (toNodes && toNodes.get(second) === false) {
|
|
70
|
+
toNodes.set(second, true);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
calculateBranchCoverage() {
|
|
75
|
+
for (const [currentBasicBlock, branchesForThatBasicBlock] of this.branchGraph) {
|
|
76
|
+
let used = 0;
|
|
77
|
+
for (const isCovered of branchesForThatBasicBlock.values()) {
|
|
78
|
+
if (isCovered) {
|
|
79
|
+
used++;
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
this.notFullyCoveredBasicBlock.add(currentBasicBlock);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
this.result.branchCoverageRate.used += used;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
addUncoveredLines() {
|
|
89
|
+
for (const block of this.notFullyCoveredBasicBlock) {
|
|
90
|
+
const lineInfo = this.covInfo.lineInfo.get(block);
|
|
91
|
+
if (lineInfo !== undefined && lineInfo.size > 0) {
|
|
92
|
+
this.result.uncoveredLines.add(Math.max(...lineInfo));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=singleFunctionAnalysis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"singleFunctionAnalysis.js","sourceRoot":"","sources":["../../../tools/test_runner/parser/singleFunctionAnalysis.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Imports, OutputMode } from "./interface.js";
|
|
2
|
+
export interface TestOption {
|
|
3
|
+
includes: string[];
|
|
4
|
+
excludes: string[];
|
|
5
|
+
entryFiles: string[] | null;
|
|
6
|
+
testFiles: string[] | null;
|
|
7
|
+
testNamePattern: string | null;
|
|
8
|
+
collectCoverage: boolean;
|
|
9
|
+
onlyFailures: boolean;
|
|
10
|
+
flags: string;
|
|
11
|
+
imports?: Imports;
|
|
12
|
+
outputFolder: string;
|
|
13
|
+
mode: OutputMode | OutputMode[];
|
|
14
|
+
warnLimit?: number;
|
|
15
|
+
errorLimit?: number;
|
|
16
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testOption.js","sourceRoot":"","sources":["../../tools/test_runner/testOption.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { WebAssemblyModule } from "./wasm.js";
|
|
2
|
+
export interface WebAssemblyCallSite {
|
|
3
|
+
functionName: string;
|
|
4
|
+
fileName: string;
|
|
5
|
+
lineNumber: number;
|
|
6
|
+
columnNumber: number;
|
|
7
|
+
}
|
|
8
|
+
export interface ExecutionError {
|
|
9
|
+
message: string;
|
|
10
|
+
stacks: WebAssemblyCallSite[];
|
|
11
|
+
}
|
|
12
|
+
export declare function handleWebAssemblyError(error: WebAssembly.RuntimeError, wasmModule: WebAssemblyModule): Promise<ExecutionError>;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// ref: https://v8.dev/docs/stack-trace-api
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { SourceMapConsumer } from "source-map";
|
|
4
|
+
import chalk from "chalk";
|
|
5
|
+
import { env } from "node:process";
|
|
6
|
+
function getOriginLocationWithSourceMap(line, column, sourceMapConsumer) {
|
|
7
|
+
if (sourceMapConsumer === null || line === null || column === null) {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
const originPosition = sourceMapConsumer.originalPositionFor({
|
|
11
|
+
line: line,
|
|
12
|
+
column: column,
|
|
13
|
+
});
|
|
14
|
+
if (originPosition.source === null || originPosition.line === null || originPosition.column === null) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
fileName: originPosition.source,
|
|
19
|
+
lineNumber: originPosition.line,
|
|
20
|
+
columnNumber: originPosition.column,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function getWebAssemblyFunctionName(callSite) {
|
|
24
|
+
return callSite.getFunctionName() ?? `wasm-function[${callSite.getFunction()?.toString() ?? "unknown"}]`;
|
|
25
|
+
}
|
|
26
|
+
function createWebAssemblyCallSite(callSite, moduleInfo) {
|
|
27
|
+
if (!callSite.getFileName()?.startsWith("wasm")) {
|
|
28
|
+
// ignore non-wasm call sites
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
const line = callSite.getLineNumber();
|
|
32
|
+
const column = callSite.getColumnNumber();
|
|
33
|
+
const originalPosition = getOriginLocationWithSourceMap(line, column, moduleInfo.sourceMapConsumer);
|
|
34
|
+
if (originalPosition) {
|
|
35
|
+
return {
|
|
36
|
+
fileName: originalPosition.fileName,
|
|
37
|
+
functionName: getWebAssemblyFunctionName(callSite),
|
|
38
|
+
lineNumber: originalPosition.lineNumber,
|
|
39
|
+
columnNumber: originalPosition.columnNumber,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
// fallback to the original call site
|
|
43
|
+
return {
|
|
44
|
+
fileName: moduleInfo.wasmPath,
|
|
45
|
+
functionName: getWebAssemblyFunctionName(callSite),
|
|
46
|
+
lineNumber: line ?? -1,
|
|
47
|
+
columnNumber: env["WARPO_TEST"] ? -1 : (column ?? -1),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
async function getSourceMapConsumer(sourceMapPath) {
|
|
51
|
+
const sourceMapContent = await (async () => {
|
|
52
|
+
try {
|
|
53
|
+
return await readFile(sourceMapPath, "utf8");
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
if (error instanceof Error) {
|
|
57
|
+
console.log(chalk.yellow(`Failed to read source map file: ${sourceMapPath} due to ${error}`));
|
|
58
|
+
}
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
})();
|
|
62
|
+
if (sourceMapContent === null) {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
return await new SourceMapConsumer(sourceMapContent, undefined);
|
|
66
|
+
}
|
|
67
|
+
export async function handleWebAssemblyError(error, wasmModule) {
|
|
68
|
+
let stackTrace = [];
|
|
69
|
+
// eslint-disable-next-line @typescript-eslint/unbound-method
|
|
70
|
+
const originalPrepareStackTrace = Error.prepareStackTrace;
|
|
71
|
+
Error.prepareStackTrace = (_, structuredStackTrace) => {
|
|
72
|
+
stackTrace = structuredStackTrace;
|
|
73
|
+
};
|
|
74
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
|
|
75
|
+
error.stack; // trigger prepareStackTrace
|
|
76
|
+
Error.prepareStackTrace = originalPrepareStackTrace;
|
|
77
|
+
let sourceMapConsumer = await getSourceMapConsumer(wasmModule.sourceMap);
|
|
78
|
+
const stacks = stackTrace
|
|
79
|
+
.map((callSite) => createWebAssemblyCallSite(callSite, { wasmPath: wasmModule.wasm, sourceMapConsumer }))
|
|
80
|
+
.filter((callSite) => callSite !== null);
|
|
81
|
+
sourceMapConsumer?.destroy(); // clean up the source map consumer
|
|
82
|
+
return {
|
|
83
|
+
message: error.message,
|
|
84
|
+
stacks,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=errorTraceHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorTraceHandler.js","sourceRoot":"","sources":["../../../tools/test_runner/utils/errorTraceHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function escape(es: string): string;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
const escapeChars = {
|
|
2
|
+
"&": "&",
|
|
3
|
+
"<": "<",
|
|
4
|
+
">": ">",
|
|
5
|
+
"'": "'",
|
|
6
|
+
'"': """,
|
|
7
|
+
};
|
|
8
|
+
const pe = (m) => {
|
|
9
|
+
return escapeChars[m];
|
|
10
|
+
};
|
|
11
|
+
export function escape(es) {
|
|
12
|
+
return es.replaceAll(/["&'<>]/g, pe);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=escape.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escape.js","sourceRoot":"","sources":["../../../tools/test_runner/utils/escape.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,GAAG;IAClB,GAAG,EAAE,OAAO;IACZ,GAAG,EAAE,MAAM;IACX,GAAG,EAAE,MAAM;IACX,GAAG,EAAE,OAAO;IACZ,GAAG,EAAE,QAAQ;CACd,CAAC;AAEF,MAAM,EAAE,GAAG,CAAC,CAAS,EAAE,EAAE;IACvB,OAAO,WAAW,CAAC,CAAQ,CAAC,CAAC;AAC/B,CAAC,CAAC;AAEF,MAAM,UAAU,MAAM,CAAC,EAAU;IAC/B,OAAO,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Imports as ASImports } from "@assemblyscript/loader";
|
|
2
|
+
import { ImportsArgument } from "../interface.js";
|
|
3
|
+
export declare function json2map<V>(json: Record<string, V>): Map<string, V>;
|
|
4
|
+
/**
|
|
5
|
+
* return if the functionName is in fileName.
|
|
6
|
+
* @param fileName example: "assembly/assertCollector.ts"
|
|
7
|
+
* @param functionName example:
|
|
8
|
+
* "start:assembly/assertCollector~anonymous|0"
|
|
9
|
+
* || "assembly/assertCollector/addDescription"
|
|
10
|
+
*/
|
|
11
|
+
export declare function isFunctionInsideFile(fileName: string, functionName: string): boolean;
|
|
12
|
+
export declare function checkGenerics(functionName: string): string | undefined;
|
|
13
|
+
export declare function checkVarargs(functionName: string): string | undefined;
|
|
14
|
+
export declare function injectDefaultFunction(infos: WebAssembly.ModuleImportDescriptor[], importObject: ASImports, importsArg: ImportsArgument): void;
|