Skip to content

Commit 850cf0f

Browse files
committed
feat(change_detection): implement a change detector generator
1 parent b78c125 commit 850cf0f

31 files changed

+1322
-669
lines changed

modules/benchmarks/src/change_detection/change_detection_benchmark.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
Parser,
99
ChangeDetector,
1010
ProtoChangeDetector,
11+
DynamicProtoChangeDetector,
1112
ChangeDispatcher,
1213
} from 'change_detection/change_detection';
1314

@@ -102,7 +103,7 @@ function setUpChangeDetection(iterations) {
102103
var dispatcher = new DummyDispatcher();
103104
var parser = new Parser(new Lexer());
104105

105-
var parentProto = new ProtoChangeDetector();
106+
var parentProto = new DynamicProtoChangeDetector();
106107
var parentCD = parentProto.instantiate(dispatcher, MapWrapper.create());
107108

108109
var astWithSource = [
@@ -119,7 +120,7 @@ function setUpChangeDetection(iterations) {
119120
];
120121

121122
function proto(i) {
122-
var pcd = new ProtoChangeDetector();
123+
var pcd = new DynamicProtoChangeDetector();
123124
pcd.addAst(astWithSource[i % 10].ast, "memo", i, false);
124125
return pcd;
125126
}

modules/benchmarks/src/compiler/compiler_benchmark.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import {isBlank, Type} from 'facade/lang';
33
import {MapWrapper} from 'facade/collection';
44
import {DirectiveMetadata} from 'core/compiler/directive_metadata';
55

6-
import {Parser, Lexer, ProtoRecordRange} from 'change_detection/change_detection';
6+
import {Parser, Lexer, ProtoRecordRange, dynamicChangeDetection} from 'change_detection/change_detection';
77

88
import {Compiler, CompilerCache} from 'core/compiler/compiler';
99
import {DirectiveMetadataReader} from 'core/compiler/directive_metadata_reader';
@@ -79,7 +79,7 @@ export function main() {
7979
setupReflector();
8080
var reader = new DirectiveMetadataReader();
8181
var cache = new CompilerCache();
82-
var compiler = new Compiler(null, reader, new Parser(new Lexer()), cache);
82+
var compiler = new Compiler(dynamicChangeDetection, null, reader, new Parser(new Lexer()), cache);
8383
var annotatedComponent = reader.read(BenchmarkComponent);
8484

8585
var templateNoBindings = loadTemplate('templateNoBindings', count);

modules/benchmarks/src/tree/tree_benchmark.js

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import {Parser, Lexer, ChangeDetector} from 'change_detection/change_detection';
1+
import {Parser, Lexer, ChangeDetector, ChangeDetection, jitChangeDetection}
2+
from 'change_detection/change_detection';
23

34
import {bootstrap, Component, Template, TemplateConfig, ViewPort, Compiler} from 'angular/angular';
45

@@ -38,11 +39,7 @@ function setupReflector() {
3839
},
3940
template: new TemplateConfig({
4041
directives: [TreeComponent, NgIf],
41-
inline: `
42-
<span> {{data.value}}
43-
<span template='ng-if data.right != null'><tree [data]='data.right'></tree></span>
44-
<span template='ng-if data.left != null'><tree [data]='data.left'></tree></span>
45-
</span>`
42+
inline: `<span>{{data.value}}<span template='ng-if data.right != null'><tree [data]='data.right'></tree></span><span template='ng-if data.left != null'><tree [data]='data.left'></tree></span></span>`
4643
})
4744
})]
4845
});
@@ -59,8 +56,8 @@ function setupReflector() {
5956
});
6057

6158
reflector.registerType(Compiler, {
62-
'factory': (templateLoader, reader, parser, compilerCache) => new Compiler(templateLoader, reader, parser, compilerCache),
63-
'parameters': [[TemplateLoader], [DirectiveMetadataReader], [Parser], [CompilerCache]],
59+
'factory': (cd, templateLoader, reader, parser, compilerCache) => new Compiler(cd, templateLoader, reader, parser, compilerCache),
60+
'parameters': [[ChangeDetection], [TemplateLoader], [DirectiveMetadataReader], [Parser], [CompilerCache]],
6461
'annotations': []
6562
});
6663

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import {List, ListWrapper} from 'facade/collection';
2+
import {ChangeDetector} from './interfaces';
3+
4+
export class AbstractChangeDetector extends ChangeDetector {
5+
children:List;
6+
parent:ChangeDetector;
7+
8+
constructor() {
9+
this.children = [];
10+
}
11+
12+
addChild(cd:ChangeDetector) {
13+
ListWrapper.push(this.children, cd);
14+
cd.parent = this;
15+
}
16+
17+
removeChild(cd:ChangeDetector) {
18+
ListWrapper.remove(this.children, cd);
19+
}
20+
21+
remove() {
22+
this.parent.removeChild(this);
23+
}
24+
25+
detectChanges() {
26+
this._detectChanges(false);
27+
}
28+
29+
checkNoChanges() {
30+
this._detectChanges(true);
31+
}
32+
33+
_detectChanges(throwOnChange:boolean) {
34+
this.detectChangesInRecords(throwOnChange);
35+
this._detectChangesInChildren(throwOnChange);
36+
}
37+
38+
detectChangesInRecords(throwOnChange:boolean){}
39+
40+
_detectChangesInChildren(throwOnChange:boolean) {
41+
var children = this.children;
42+
for(var i = 0; i < children.length; ++i) {
43+
children[i]._detectChanges(throwOnChange);
44+
}
45+
}
46+
}

modules/change_detection/src/change_detection.js

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,26 @@ export {ContextWithVariableBindings} from './parser/context_with_variable_bindin
55

66
export {ExpressionChangedAfterItHasBeenChecked, ChangeDetectionError} from './exceptions';
77
export {ChangeRecord, ChangeDispatcher, ChangeDetector} from './interfaces';
8-
export {ProtoChangeDetector} from './proto_change_detector';
9-
export {DynamicChangeDetector} from './dynamic_change_detector';
8+
export {ProtoChangeDetector, DynamicProtoChangeDetector, JitProtoChangeDetector} from './proto_change_detector';
9+
export {DynamicChangeDetector} from './dynamic_change_detector';
10+
11+
import {ProtoChangeDetector, DynamicProtoChangeDetector, JitProtoChangeDetector} from './proto_change_detector';
12+
13+
export class ChangeDetection {
14+
createProtoChangeDetector(name:string){}
15+
}
16+
17+
export class DynamicChangeDetection extends ChangeDetection {
18+
createProtoChangeDetector(name:string):ProtoChangeDetector{
19+
return new DynamicProtoChangeDetector();
20+
}
21+
}
22+
23+
export class JitChangeDetection extends ChangeDetection {
24+
createProtoChangeDetector(name:string):ProtoChangeDetector{
25+
return new JitProtoChangeDetector();
26+
}
27+
}
28+
29+
export var dynamicChangeDetection = new DynamicChangeDetection();
30+
export var jitChangeDetection = new JitChangeDetection();
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
library change_detectoin.change_detection_jit_generator;
2+
3+
class ChangeDetectorJITGenerator {
4+
ChangeDetectorJITGenerator(typeName, records) {
5+
}
6+
7+
generate() {
8+
throw "Not supported in Dart";
9+
}
10+
}

0 commit comments

Comments
 (0)