Skip to content

Commit 1d03c2a

Browse files
committed
feat(change_detector): add a way to inspect records and record ranges
1 parent df21c3c commit 1d03c2a

File tree

5 files changed

+123
-11
lines changed

5 files changed

+123
-11
lines changed

modules/change_detection/src/parser/ast.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,10 +345,12 @@ export class MethodCall extends AST {
345345
receiver:AST;
346346
fn:Function;
347347
args:List;
348-
constructor(receiver:AST, fn:Function, args:List) {
348+
name:string;
349+
constructor(receiver:AST, name:string, fn:Function, args:List) {
349350
this.receiver = receiver;
350351
this.fn = fn;
351352
this.args = args;
353+
this.name = name;
352354
}
353355

354356
eval(context) {

modules/change_detection/src/parser/parser.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,7 @@ class _ParseAST {
404404
var args = this.parseCallArguments();
405405
this.expectCharacter($RPAREN);
406406
var fn = this.reflector.method(id);
407-
return new MethodCall(receiver, fn, args);
407+
return new MethodCall(receiver, id, fn, args);
408408

409409
} else {
410410
var getter = this.reflector.getter(id);

modules/change_detection/src/record.js

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,82 @@ export class Record {
394394
}
395395
return record;
396396
}
397+
398+
inspect() {
399+
return _inspect(this);
400+
}
401+
402+
inspectRange() {
403+
return this.recordRange.inspect();
404+
}
405+
}
406+
407+
function _inspect(record:Record) {
408+
function mode() {
409+
switch (record.getType()) {
410+
case RECORD_TYPE_PROPERTY:
411+
return "property";
412+
case RECORD_TYPE_INVOKE_METHOD:
413+
return "invoke_method";
414+
case RECORD_TYPE_INVOKE_CLOSURE:
415+
return "invoke_closure";
416+
case RECORD_TYPE_INVOKE_PURE_FUNCTION:
417+
return "pure_function";
418+
case RECORD_TYPE_INVOKE_FORMATTER:
419+
return "invoke_formatter";
420+
case RECORD_TYPE_CONST:
421+
return "const";
422+
case RECORD_TYPE_KEY_VALUE:
423+
return "key_value";
424+
case RECORD_TYPE_ARRAY:
425+
return "array";
426+
case RECORD_TYPE_NULL:
427+
return "null";
428+
case RECORD_TYPE_MARKER:
429+
return "marker";
430+
default:
431+
return "unexpected type!";
432+
}
433+
}
434+
435+
function disabled() {
436+
return record.isDisabled() ? "disabled" : "enabled";
437+
}
438+
439+
function description() {
440+
var name = isPresent(record.protoRecord) ? record.protoRecord.name : "";
441+
var exp = isPresent(record.protoRecord) ? record.protoRecord.expressionAsString : "";
442+
var currValue = record.currentValue;
443+
var context = record.context;
444+
445+
return `${mode()}, ${name}, ${disabled()} ` +
446+
` Current: ${currValue}, Context: ${context} in [${exp}]`;
447+
}
448+
449+
if (isBlank(record)) return null;
450+
if (!(record instanceof Record)) return record;
451+
452+
return new _RecordInspect(description(), record);
453+
}
454+
455+
class _RecordInspect {
456+
description:string;
457+
record:Record;
458+
459+
constructor(description:string,record:Record) {
460+
this.description = description;
461+
this.record = record;
462+
}
463+
464+
get next() {
465+
return _inspect(this.record.next);
466+
}
467+
get nextEnabled() {
468+
return _inspect(this.record.nextEnabled);
469+
}
470+
get dest() {
471+
return _inspect(this.record.dest);
472+
}
397473
}
398474

399475
function isSame(a, b) {

modules/change_detection/src/record_range.js

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,18 @@ export class RecordRange {
284284
record.funcOrValue = proto.funcOrValue;
285285
record.updateContext(context);
286286
}
287+
288+
inspect() {
289+
return _inspect(this);
290+
}
291+
}
292+
293+
function _inspect(recordRange:RecordRange) {
294+
var res = [];
295+
for(var r = recordRange.headRecord.next; r != recordRange.tailRecord; r = r.next){
296+
ListWrapper.push(res, r.inspect().description);
297+
}
298+
return res;
287299
}
288300

289301
function _link(a:Record, b:Record) {
@@ -336,14 +348,14 @@ class ProtoRecordCreator {
336348

337349
visitBinary(ast:Binary, dest) {
338350
var record = this.construct(RECORD_TYPE_INVOKE_PURE_FUNCTION,
339-
_operationToFunction(ast.operation), 2, null, dest);
351+
_operationToFunction(ast.operation), 2, ast.operation, dest);
340352
ast.left.visit(this, new Destination(record, 0));
341353
ast.right.visit(this, new Destination(record, 1));
342354
this.add(record);
343355
}
344356

345357
visitPrefixNot(ast:PrefixNot, dest) {
346-
var record = this.construct(RECORD_TYPE_INVOKE_PURE_FUNCTION, _operation_negate, 1, null, dest);
358+
var record = this.construct(RECORD_TYPE_INVOKE_PURE_FUNCTION, _operation_negate, 1, "-", dest);
347359
ast.expression.visit(this, new Destination(record, 0));
348360
this.add(record);
349361
}
@@ -359,15 +371,15 @@ class ProtoRecordCreator {
359371
}
360372

361373
visitFormatter(ast:Formatter, dest) {
362-
var record = this.construct(RECORD_TYPE_INVOKE_FORMATTER, ast.name, ast.allArgs.length, null, dest);
374+
var record = this.construct(RECORD_TYPE_INVOKE_FORMATTER, ast.name, ast.allArgs.length, ast.name, dest);
363375
for (var i = 0; i < ast.allArgs.length; ++i) {
364376
ast.allArgs[i].visit(this, new Destination(record, i));
365377
}
366378
this.add(record);
367379
}
368380

369381
visitMethodCall(ast:MethodCall, dest) {
370-
var record = this.construct(RECORD_TYPE_INVOKE_METHOD, ast.fn, ast.args.length, null, dest);
382+
var record = this.construct(RECORD_TYPE_INVOKE_METHOD, ast.fn, ast.args.length, ast.name, dest);
371383
for (var i = 0; i < ast.args.length; ++i) {
372384
ast.args[i].visit(this, new Destination(record, i));
373385
}
@@ -395,23 +407,23 @@ class ProtoRecordCreator {
395407
}
396408

397409
visitConditional(ast:Conditional, dest) {
398-
var record = this.construct(RECORD_TYPE_INVOKE_PURE_FUNCTION, _cond, 3, null, dest);
410+
var record = this.construct(RECORD_TYPE_INVOKE_PURE_FUNCTION, _cond, 3, "?:", dest);
399411
ast.condition.visit(this, new Destination(record, 0));
400412
ast.trueExp.visit(this, new Destination(record, 1));
401413
ast.falseExp.visit(this, new Destination(record, 2));
402414
this.add(record);
403415
}
404416

405417
visitKeyedAccess(ast:KeyedAccess, dest) {
406-
var record = this.construct(RECORD_TYPE_INVOKE_METHOD, _keyedAccess, 1, null, dest);
418+
var record = this.construct(RECORD_TYPE_INVOKE_METHOD, _keyedAccess, 1, "[]", dest);
407419
ast.obj.visit(this, new Destination(record, null));
408420
ast.key.visit(this, new Destination(record, 0));
409421
this.add(record);
410422
}
411423

412424
visitLiteralArray(ast:LiteralArray, dest) {
413425
var length = ast.expressions.length;
414-
var record = this.construct(RECORD_TYPE_INVOKE_PURE_FUNCTION, _arrayFn(length), length, null, dest);
426+
var record = this.construct(RECORD_TYPE_INVOKE_PURE_FUNCTION, _arrayFn(length), length, "Array()", dest);
415427
for (var i = 0; i < length; ++i) {
416428
ast.expressions[i].visit(this, new Destination(record, i));
417429
}
@@ -420,7 +432,7 @@ class ProtoRecordCreator {
420432

421433
visitLiteralMap(ast:LiteralMap, dest) {
422434
var length = ast.values.length;
423-
var record = this.construct(RECORD_TYPE_INVOKE_PURE_FUNCTION, _mapFn(ast.keys, length), length, null, dest);
435+
var record = this.construct(RECORD_TYPE_INVOKE_PURE_FUNCTION, _mapFn(ast.keys, length), length, "Map()", dest);
424436
for (var i = 0; i < length; ++i) {
425437
ast.values[i].visit(this, new Destination(record, i));
426438
}

modules/change_detection/test/record_range_spec.js

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ import {
99
ChangeDetector,
1010
ProtoRecordRange,
1111
RecordRange,
12-
ProtoRecord
12+
ProtoRecord,
13+
RECORD_TYPE_CONST
1314
} from 'change_detection/change_detector';
1415

1516
import {Record} from 'change_detection/record';
@@ -337,5 +338,26 @@ export function main() {
337338
]);
338339
});
339340
});
341+
342+
describe("inspect", () => {
343+
it("should return the description of the record", () => {
344+
var proto = new ProtoRecord(null, RECORD_TYPE_CONST, 1, 0, "name", null, "group", "expression");
345+
var record = new Record(null, proto, null);
346+
347+
var i = record.inspect();
348+
expect(i.description).toContain("const, name, enabled");
349+
});
350+
351+
it("should return the description of the records in the range", () => {
352+
var proto = new ProtoRecord(null, RECORD_TYPE_CONST, 1, 0, "name", null, "group", "expression");
353+
var record = new Record(null, proto, null);
354+
var range = new RecordRange(null, null);
355+
range.addRecord(record);
356+
357+
var i = range.inspect();;
358+
expect(i.length).toEqual(1);
359+
expect(i[0]).toContain("const, name, enabled");
360+
});
361+
});
340362
});
341363
}

0 commit comments

Comments
 (0)