fix(codegen): stringify using an opaque ID when toString contains parens.

Using toString results in 'function (_arg1, arg2) {' when using closure compiler for 6-to-5.

Closes #7825
This commit is contained in:
Alex Eagle 2016-03-29 17:15:07 -07:00 committed by Alex Eagle
parent 291928feb1
commit 90c87fa6ad
1 changed files with 20 additions and 2 deletions

View File

@ -27,12 +27,30 @@ import {getUrlScheme} from 'angular2/src/compiler/url_resolver';
export class RuntimeMetadataResolver {
private _directiveCache = new Map<Type, cpl.CompileDirectiveMetadata>();
private _pipeCache = new Map<Type, cpl.CompilePipeMetadata>();
private _anonymousTypes = new Map<Object, number>();
private _anonymousTypeIndex = 0;
constructor(private _directiveResolver: DirectiveResolver, private _pipeResolver: PipeResolver,
private _viewResolver: ViewResolver,
@Optional() @Inject(PLATFORM_DIRECTIVES) private _platformDirectives: Type[],
@Optional() @Inject(PLATFORM_PIPES) private _platformPipes: Type[]) {}
/**
* Wrap the stringify method to avoid naming things `function (arg1...) {`
*/
private sanitizeName(obj: any): string {
let result = stringify(obj);
if (result.indexOf('(') < 0) {
return result;
}
let found = this._anonymousTypes.get(obj);
if (!found) {
this._anonymousTypes.set(obj, this._anonymousTypeIndex++);
found = this._anonymousTypes.get(obj);
}
return `anonymous_type_${found}_`;
}
getDirectiveMetadata(directiveType: Type): cpl.CompileDirectiveMetadata {
var meta = this._directiveCache.get(directiveType);
if (isBlank(meta)) {
@ -62,7 +80,7 @@ export class RuntimeMetadataResolver {
isComponent: isPresent(templateMeta),
dynamicLoadable: true,
type: new cpl.CompileTypeMetadata(
{name: stringify(directiveType), moduleUrl: moduleUrl, runtime: directiveType}),
{name: this.sanitizeName(directiveType), moduleUrl: moduleUrl, runtime: directiveType}),
template: templateMeta,
changeDetection: changeDetectionStrategy,
inputs: dirMeta.inputs,
@ -82,7 +100,7 @@ export class RuntimeMetadataResolver {
var moduleUrl = reflector.importUri(pipeType);
meta = new cpl.CompilePipeMetadata({
type: new cpl.CompileTypeMetadata(
{name: stringify(pipeType), moduleUrl: moduleUrl, runtime: pipeType}),
{name: this.sanitizeName(pipeType), moduleUrl: moduleUrl, runtime: pipeType}),
name: pipeMeta.name,
pure: pipeMeta.pure
});