Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(compiler): add change detector generation
Runtime and Codegen. Part of #3605
- Loading branch information
Showing
7 changed files
with
305 additions
and
42 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,98 @@ | ||
import {TypeMetadata, SourceModule} from './api'; | ||
import { | ||
ChangeDetectorJITGenerator | ||
} from 'angular2/src/core/change_detection/change_detection_jit_generator'; | ||
import { | ||
createPropertyRecords, | ||
createEventRecords | ||
} from 'angular2/src/core/change_detection/proto_change_detector'; | ||
|
||
import {createChangeDetectorDefinitions} from './change_definition_factory'; | ||
import {isJsObject, CONST_EXPR} from 'angular2/src/core/facade/lang'; | ||
|
||
import { | ||
ChangeDetectorGenConfig, | ||
ChangeDetectorDefinition, | ||
DynamicProtoChangeDetector, | ||
ChangeDetectionStrategy | ||
} from 'angular2/src/core/change_detection/change_detection'; | ||
|
||
import {TemplateAst} from './template_ast'; | ||
import {Codegen} from 'angular2/src/transform/template_compiler/change_detector_codegen'; | ||
|
||
var IS_DART = !isJsObject({}); | ||
|
||
const ABSTRACT_CHANGE_DETECTOR = "AbstractChangeDetector"; | ||
const UTIL = "ChangeDetectionUtil"; | ||
|
||
const JS_CHANGE_DETECTOR_IMPORTS = CONST_EXPR([ | ||
['angular2/src/core/change_detection/abstract_change_detector', 'acd'], | ||
['angular2/src/core/change_detection/change_detection_util', 'cdu'] | ||
]); | ||
|
||
const DART_CHANGE_DETECTOR_IMPORTS = | ||
CONST_EXPR([['angular2/src/core/change_detection/pregen_proto_change_detector', '_gen']]); | ||
|
||
export class ChangeDetectionCompiler { | ||
constructor(private _genConfig: ChangeDetectorGenConfig) {} | ||
|
||
compileComponentRuntime(componentType: TypeMetadata, strategy: ChangeDetectionStrategy, | ||
parsedTemplate: TemplateAst[]): Function[] { | ||
var changeDetectorDefinitions = | ||
createChangeDetectorDefinitions(componentType, strategy, this._genConfig, parsedTemplate); | ||
if (IS_DART) { | ||
return changeDetectorDefinitions.map( | ||
definition => (dispatcher) => | ||
new DynamicProtoChangeDetector(definition).instantiate(dispatcher)); | ||
} else { | ||
// TODO(tbosch): provide a flag in _genConfig whether to allow eval or fall back to dynamic | ||
// change detection as well! | ||
return changeDetectorDefinitions.map( | ||
definition => createJsChangeDetectorGenerator(definition, UTIL, ABSTRACT_CHANGE_DETECTOR) | ||
.generate()); | ||
} | ||
} | ||
|
||
compileComponentCodeGen(componentType: TypeMetadata, strategy: ChangeDetectionStrategy, | ||
parsedTemplate: TemplateAst[]): SourceModule { | ||
var changeDetectorDefinitions = | ||
createChangeDetectorDefinitions(componentType, strategy, this._genConfig, parsedTemplate); | ||
if (IS_DART) { | ||
var factories = []; | ||
var sourceParts = changeDetectorDefinitions.map(definition => { | ||
var codegen = new Codegen(); | ||
var className = definition.id; | ||
codegen.generate(componentType.typeName, className, definition); | ||
factories.push(`(dispatcher) => new ${className}(dispatcher)`); | ||
return codegen.toString(); | ||
}); | ||
sourceParts.push(`var CHANGE_DETECTORS = [ ${factories.join(',')} ];`); | ||
return new SourceModule(componentType.typeUrl, sourceParts.join('\n'), | ||
DART_CHANGE_DETECTOR_IMPORTS); | ||
} else { | ||
var factories = []; | ||
var sourceParts = changeDetectorDefinitions.map(definition => { | ||
var codegen = createJsChangeDetectorGenerator(definition, `cdu.${UTIL}`, | ||
`acd.${ABSTRACT_CHANGE_DETECTOR}`); | ||
factories.push(`function(dispatcher) { return new ${codegen.typeName}(dispatcher); }`); | ||
return codegen.generateSource(); | ||
}); | ||
sourceParts.push(`var CHANGE_DETECTORS = [ ${factories.join(',')} ];`); | ||
return new SourceModule(componentType.typeUrl, sourceParts.join('\n'), | ||
JS_CHANGE_DETECTOR_IMPORTS); | ||
} | ||
} | ||
} | ||
|
||
function createJsChangeDetectorGenerator( | ||
definition: ChangeDetectorDefinition, changeDetectionUtilVarName: string, | ||
abstractChangeDetectorVarName: string): ChangeDetectorJITGenerator { | ||
var propertyBindingRecords = createPropertyRecords(definition); | ||
var eventBindingRecords = createEventRecords(definition); | ||
var propertyBindingTargets = definition.bindingRecords.map(b => b.target); | ||
var generator = new ChangeDetectorJITGenerator( | ||
definition.id, definition.strategy, propertyBindingRecords, propertyBindingTargets, | ||
eventBindingRecords, definition.directiveRecords, definition.genConfig, | ||
changeDetectionUtilVarName, abstractChangeDetectorVarName); | ||
return generator; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
14 changes: 14 additions & 0 deletions
14
modules/angular2/src/transform/template_compiler/change_detector_codegen.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
import { | ||
ChangeDetectorDefinition, | ||
} from 'angular2/src/core/change_detection/change_detection'; | ||
|
||
// Note: This class is only here so that we can reference it from TypeScript code. | ||
// The actual implementation lives under modules_dart. | ||
// TODO(tbosch): Move the corresponding code into angular2/src/compiler once | ||
// the new compiler is done. | ||
export class Codegen { | ||
generate(typeName: string, changeDetectorTypeName: string, def: ChangeDetectorDefinition): void { | ||
throw "Not implemented in JS"; | ||
} | ||
toString(): string { throw "Not implemented in JS"; } | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.