as-test 0.1.7 → 0.1.9

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.
@@ -0,0 +1,417 @@
1
+ import { BlockStatement, ExpressionStatement, Node, } from "assemblyscript/dist/assemblyscript.js";
2
+ import { BaseVisitor, SimpleParser } from "visitor-as/dist/index.js";
3
+ import { RangeTransform } from "visitor-as/dist/transformRange.js";
4
+ import { isStdlib } from "visitor-as/dist/utils.js";
5
+ var CoverType;
6
+ (function (CoverType) {
7
+ CoverType[CoverType["Function"] = 0] = "Function";
8
+ CoverType[CoverType["Expression"] = 1] = "Expression";
9
+ CoverType[CoverType["Block"] = 2] = "Block";
10
+ })(CoverType || (CoverType = {}));
11
+ class CoverPoint {
12
+ file = "";
13
+ hash = "";
14
+ line = 0;
15
+ column = 0;
16
+ type;
17
+ executed = false;
18
+ }
19
+ export class CoverageTransform extends BaseVisitor {
20
+ mustImport = false;
21
+ points = new Map();
22
+ globalStatements = [];
23
+ visitBinaryExpression(node) {
24
+ super.visitBinaryExpression(node);
25
+ if (node.visited)
26
+ return;
27
+ node.visited = true;
28
+ const path = node.range.source.normalizedPath;
29
+ switch (node.operator) {
30
+ case 98:
31
+ case 97: {
32
+ const right = node.right;
33
+ const rightLc = getLineCol(node);
34
+ const point = new CoverPoint();
35
+ point.line = rightLc?.line;
36
+ point.column = rightLc?.column;
37
+ point.file = path;
38
+ point.type = CoverType.Expression;
39
+ point.hash = hash(point);
40
+ const replacer = new RangeTransform(node);
41
+ const registerStmt = SimpleParser.parseTopLevelStatement(`__REGISTER({
42
+ file: "${point.file}",
43
+ hash: "${point.hash}",
44
+ line: ${point.line},
45
+ column: ${point.column},
46
+ type: "Expression",
47
+ executed: false
48
+ });`);
49
+ replacer.visit(registerStmt);
50
+ let coverExpression = SimpleParser.parseExpression(`(__COVER("${point.hash}"), $$REPLACE_ME)`);
51
+ replacer.visit(coverExpression);
52
+ coverExpression.expression.expressions[1] = right;
53
+ node.right = coverExpression;
54
+ this.globalStatements.push(registerStmt);
55
+ break;
56
+ }
57
+ }
58
+ }
59
+ visitMethodDeclaration(node) {
60
+ super.visitMethodDeclaration(node);
61
+ if (node.visited)
62
+ return;
63
+ node.visited = true;
64
+ if (node.body) {
65
+ if (node.body.visited)
66
+ return;
67
+ node.body.visited = true;
68
+ const path = node.range.source.normalizedPath;
69
+ const funcLc = getLineCol(node);
70
+ const point = new CoverPoint();
71
+ point.line = funcLc?.line;
72
+ point.column = funcLc?.column;
73
+ point.file = path;
74
+ point.type = CoverType.Function;
75
+ point.hash = hash(point);
76
+ const replacer = new RangeTransform(node);
77
+ const registerStmt = SimpleParser.parseTopLevelStatement(`__REGISTER({
78
+ file: "${point.file}",
79
+ hash: "${point.hash}",
80
+ line: ${point.line},
81
+ column: ${point.column},
82
+ type: "Function",
83
+ executed: false
84
+ })`);
85
+ replacer.visit(registerStmt);
86
+ const coverStmt = SimpleParser.parseStatement(`__COVER("${point.hash}")`, true);
87
+ replacer.visit(coverStmt);
88
+ const bodyBlock = node.body;
89
+ bodyBlock.statements.unshift(coverStmt);
90
+ this.globalStatements.push(registerStmt);
91
+ }
92
+ }
93
+ visitParameter(node) {
94
+ if (node.visited)
95
+ return;
96
+ node.visited = true;
97
+ const path = node.range.source.normalizedPath;
98
+ if (node.initializer) {
99
+ if (node.initializer.visited)
100
+ return;
101
+ node.initializer.visited = true;
102
+ super.visitParameter(node);
103
+ const paramLc = getLineCol(node.initializer);
104
+ const point = new CoverPoint();
105
+ point.line = paramLc?.line;
106
+ point.column = paramLc?.column;
107
+ point.file = path;
108
+ point.type = CoverType.Expression;
109
+ point.hash = hash(point);
110
+ const replacer = new RangeTransform(node);
111
+ const registerStmt = SimpleParser.parseTopLevelStatement(`__REGISTER({
112
+ file: "${point.file}",
113
+ hash: "${point.hash}",
114
+ line: ${point.line},
115
+ column: ${point.column},
116
+ type: "Expression",
117
+ executed: false
118
+ })`);
119
+ replacer.visit(registerStmt);
120
+ const coverExpression = SimpleParser.parseExpression(`(__COVER("${point.hash}"), $$REPLACE_ME)`);
121
+ replacer.visit(coverExpression);
122
+ coverExpression.expression.expressions[1] =
123
+ node.initializer;
124
+ node.initializer = coverExpression;
125
+ this.globalStatements.push(registerStmt);
126
+ }
127
+ }
128
+ visitFunctionDeclaration(node, isDefault) {
129
+ super.visitFunctionDeclaration(node, isDefault);
130
+ if (node.visited)
131
+ return;
132
+ node.visited = true;
133
+ if (node.body) {
134
+ if (node.body.visited)
135
+ return;
136
+ node.body.visited = true;
137
+ const path = node.range.source.normalizedPath;
138
+ const funcLc = getLineCol(node);
139
+ const point = new CoverPoint();
140
+ point.line = funcLc?.line;
141
+ point.column = funcLc?.column;
142
+ point.file = path;
143
+ point.type = CoverType.Function;
144
+ point.hash = hash(point);
145
+ const replacer = new RangeTransform(node);
146
+ const registerStmt = SimpleParser.parseTopLevelStatement(`__REGISTER({
147
+ file: "${point.file}",
148
+ hash: "${point.hash}",
149
+ line: ${point.line},
150
+ column: ${point.column},
151
+ type: "Function",
152
+ executed: false
153
+ })`);
154
+ replacer.visit(registerStmt);
155
+ this.globalStatements.push(registerStmt);
156
+ if (node.body.kind === 35) {
157
+ const coverStmt = SimpleParser.parseStatement(`{
158
+ __COVER("${point.hash}")
159
+ return $$REPLACE_ME
160
+ }`);
161
+ replacer.visit(coverStmt);
162
+ const bodyReturn = coverStmt.statements[1];
163
+ const body = node.body;
164
+ node.arrowKind = 2;
165
+ bodyReturn.value = body.expression;
166
+ node.body = body;
167
+ }
168
+ else {
169
+ const coverStmt = SimpleParser.parseStatement(`__COVER("${point.hash}")`, true);
170
+ replacer.visit(coverStmt);
171
+ if (node.body instanceof BlockStatement) {
172
+ node.body.statements.unshift(coverStmt);
173
+ }
174
+ else if (node.body instanceof ExpressionStatement) {
175
+ const expression = node.body.expression;
176
+ node.body = Node.createBlockStatement([Node.createReturnStatement(expression, expression.range)], expression.range);
177
+ const bodyBlock = node.body;
178
+ bodyBlock.statements.unshift(coverStmt);
179
+ }
180
+ }
181
+ }
182
+ }
183
+ visitIfStatement(node) {
184
+ if (node.visited)
185
+ return;
186
+ node.visited = true;
187
+ let visitIfTrue = false;
188
+ let visitIfFalse = false;
189
+ const ifTrue = node.ifTrue;
190
+ const ifFalse = node.ifFalse;
191
+ const path = node.range.source.normalizedPath;
192
+ if (ifTrue.kind !== 30) {
193
+ const trueLc = getLineCol(ifTrue);
194
+ const point = new CoverPoint();
195
+ point.line = trueLc?.line;
196
+ point.column = trueLc?.column;
197
+ point.file = path;
198
+ point.type = CoverType.Expression;
199
+ point.hash = hash(point);
200
+ const replacer = new RangeTransform(ifTrue);
201
+ const registerStmt = SimpleParser.parseTopLevelStatement(`__REGISTER({
202
+ file: "${point.file}",
203
+ hash: "${point.hash}",
204
+ line: ${point.line},
205
+ column: ${point.column},
206
+ type: "Expression",
207
+ executed: false
208
+ })`);
209
+ replacer.visit(registerStmt);
210
+ const coverStmt = SimpleParser.parseStatement(`{__COVER("${point.hash}")};`, true);
211
+ replacer.visit(coverStmt);
212
+ coverStmt.statements.push(ifTrue);
213
+ node.ifTrue = coverStmt;
214
+ this.globalStatements.push(registerStmt);
215
+ visitIfTrue = true;
216
+ visitIfFalse = !!ifFalse;
217
+ }
218
+ if (ifFalse && ifFalse.kind !== 30) {
219
+ const falseLc = getLineCol(ifFalse);
220
+ const point = new CoverPoint();
221
+ point.line = falseLc?.line;
222
+ point.column = falseLc?.column;
223
+ point.file = path;
224
+ point.type = CoverType.Expression;
225
+ point.hash = hash(point);
226
+ const replacer = new RangeTransform(ifTrue);
227
+ const registerStmt = SimpleParser.parseTopLevelStatement(`__REGISTER({
228
+ file: "${point.file}",
229
+ hash: "${point.hash}",
230
+ line: ${point.line},
231
+ column: ${point.column},
232
+ type: "Expression",
233
+ executed: false
234
+ })`);
235
+ replacer.visit(registerStmt);
236
+ const coverStmt = SimpleParser.parseStatement(`{__COVER("${point.hash}")};`, true);
237
+ replacer.visit(coverStmt);
238
+ coverStmt.statements.push(ifFalse);
239
+ node.ifFalse = coverStmt;
240
+ this.globalStatements.push(registerStmt);
241
+ visitIfTrue = true;
242
+ visitIfFalse = true;
243
+ }
244
+ if (visitIfTrue || visitIfFalse) {
245
+ if (visitIfTrue) {
246
+ if (ifTrue.visited)
247
+ return;
248
+ ifTrue.visited = true;
249
+ this._visit(ifTrue);
250
+ }
251
+ if (visitIfFalse) {
252
+ if (ifFalse.visited)
253
+ return;
254
+ ifFalse.visited = true;
255
+ this._visit(ifFalse);
256
+ }
257
+ }
258
+ else {
259
+ super.visitIfStatement(node);
260
+ }
261
+ }
262
+ visitTernaryExpression(node) {
263
+ if (node.visited)
264
+ return;
265
+ node.visited = true;
266
+ super.visitTernaryExpression(node);
267
+ const trueExpression = node.ifThen;
268
+ const falseExpression = node.ifElse;
269
+ const path = node.range.source.normalizedPath;
270
+ {
271
+ const trueLc = getLineCol(trueExpression);
272
+ const point = new CoverPoint();
273
+ point.line = trueLc?.line;
274
+ point.column = trueLc?.column;
275
+ point.file = path;
276
+ point.type = CoverType.Expression;
277
+ point.hash = hash(point);
278
+ const replacer = new RangeTransform(trueExpression);
279
+ const registerStmt = SimpleParser.parseTopLevelStatement(`__REGISTER({
280
+ file: "${point.file}",
281
+ hash: "${point.hash}",
282
+ line: ${point.line},
283
+ column: ${point.column},
284
+ type: "Expression",
285
+ executed: false
286
+ })`);
287
+ replacer.visit(registerStmt);
288
+ const coverExpression = SimpleParser.parseExpression(`(__COVER("${point.hash}"), $$REPLACE_ME)`);
289
+ replacer.visit(coverExpression);
290
+ coverExpression.expression.expressions[1] =
291
+ trueExpression;
292
+ node.ifThen = coverExpression;
293
+ this.globalStatements.push(registerStmt);
294
+ }
295
+ {
296
+ const falseLc = getLineCol(falseExpression);
297
+ const point = new CoverPoint();
298
+ point.line = falseLc?.line;
299
+ point.column = falseLc?.column;
300
+ point.file = path;
301
+ point.type = CoverType.Expression;
302
+ point.hash = hash(point);
303
+ const replacer = new RangeTransform(falseExpression);
304
+ const registerStmt = SimpleParser.parseTopLevelStatement(`__REGISTER({
305
+ file: "${point.file}",
306
+ hash: "${point.hash}",
307
+ line: ${point.line},
308
+ column: ${point.column},
309
+ type: "Expression",
310
+ executed: false
311
+ })`);
312
+ replacer.visit(registerStmt);
313
+ const coverExpression = SimpleParser.parseExpression(`(__COVER("${point.hash}"), $$REPLACE_ME)`);
314
+ replacer.visit(coverExpression);
315
+ coverExpression.expression.expressions[1] =
316
+ falseExpression;
317
+ node.ifElse = coverExpression;
318
+ this.globalStatements.push(registerStmt);
319
+ }
320
+ }
321
+ visitSwitchCase(node) {
322
+ if (node.visited)
323
+ return;
324
+ node.visited = true;
325
+ const path = node.range.source.normalizedPath;
326
+ const caseLc = getLineCol(node);
327
+ const point = new CoverPoint();
328
+ point.line = caseLc?.line;
329
+ point.column = caseLc?.column;
330
+ point.file = path;
331
+ point.type = CoverType.Block;
332
+ point.hash = hash(point);
333
+ const replacer = new RangeTransform(node);
334
+ const registerStmt = SimpleParser.parseTopLevelStatement(`__REGISTER({
335
+ file: "${point.file}",
336
+ hash: "${point.hash}",
337
+ line: ${point.line},
338
+ column: ${point.column},
339
+ type: "Block",
340
+ executed: false
341
+ })`);
342
+ replacer.visit(registerStmt);
343
+ const coverStmt = SimpleParser.parseStatement(`__COVER("${point.hash}")`);
344
+ replacer.visit(coverStmt);
345
+ this.globalStatements.push(registerStmt);
346
+ super.visitSwitchCase(node);
347
+ node.statements.unshift(coverStmt);
348
+ }
349
+ visitBlockStatement(node) {
350
+ if (node.visited)
351
+ return;
352
+ node.visited = true;
353
+ const path = node.range.source.normalizedPath;
354
+ const blockLc = getLineCol(node);
355
+ const point = new CoverPoint();
356
+ point.line = blockLc?.line;
357
+ point.column = blockLc?.column;
358
+ point.file = path;
359
+ point.type = CoverType.Block;
360
+ point.hash = hash(point);
361
+ const replacer = new RangeTransform(node);
362
+ const registerStmt = SimpleParser.parseTopLevelStatement(`__REGISTER({
363
+ file: "${point.file}",
364
+ hash: "${point.hash}",
365
+ line: ${point.line},
366
+ column: ${point.column},
367
+ type: "Block",
368
+ executed: false
369
+ })`);
370
+ replacer.visit(registerStmt);
371
+ const coverStmt = SimpleParser.parseStatement(`__COVER("${point.hash}")`);
372
+ replacer.visit(coverStmt);
373
+ this.globalStatements.push(registerStmt);
374
+ super.visitBlockStatement(node);
375
+ node.statements.unshift(coverStmt);
376
+ }
377
+ visitSource(node) {
378
+ if (node.isLibrary)
379
+ return;
380
+ if (node.simplePath === "coverage")
381
+ return;
382
+ if (isStdlib(node))
383
+ return;
384
+ super.visitSource(node);
385
+ }
386
+ }
387
+ function djb2Hash(str) {
388
+ const points = Array.from(str);
389
+ let h = 5381;
390
+ for (let p = 0; p < points.length; p++)
391
+ h = ((h << 5) - h + points[p].codePointAt(0)) | 0;
392
+ return h;
393
+ }
394
+ function hash(point) {
395
+ const hsh = djb2Hash(point.file +
396
+ point.line.toString() +
397
+ point.column.toString() +
398
+ point.type.toString());
399
+ if (hsh < 0) {
400
+ const out = hsh.toString(16);
401
+ return "3" + out.slice(1);
402
+ }
403
+ else {
404
+ return hsh.toString(16);
405
+ }
406
+ }
407
+ class LineColumn {
408
+ line;
409
+ column;
410
+ }
411
+ function getLineCol(node) {
412
+ return {
413
+ line: node.range.source.lineAt(node.range.start),
414
+ column: node.range.source.columnAt(),
415
+ };
416
+ }
417
+ //# sourceMappingURL=coverage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage.js","sourceRoot":"","sources":["../src/coverage.ts"],"names":[],"mappings":"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"}