From 11c10b2ab8c3b68df9142ae76b02882876d04c83 Mon Sep 17 00:00:00 2001 From: Chuck Jazdzewski Date: Mon, 22 May 2017 11:18:44 -0600 Subject: [PATCH] fix(tsc-wrapped): resolve short-hand literal values to locals (#16873) Fixes: #16872 --- tools/@angular/tsc-wrapped/src/evaluator.ts | 18 +++++++++++------- .../tsc-wrapped/test/collector.spec.ts | 15 +++++++++++++++ 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/tools/@angular/tsc-wrapped/src/evaluator.ts b/tools/@angular/tsc-wrapped/src/evaluator.ts index 6b5f4d3623..7e568d829c 100644 --- a/tools/@angular/tsc-wrapped/src/evaluator.ts +++ b/tools/@angular/tsc-wrapped/src/evaluator.ts @@ -233,6 +233,15 @@ export class Evaluator { return !t.options.verboseInvalidExpression && isMetadataError(value); } + const resolveName = (name: string): MetadataValue => { + const reference = this.symbols.resolve(name); + if (reference === undefined) { + // Encode as a global reference. StaticReflector will check the reference. + return recordEntry({__symbolic: 'reference', name}, node); + } + return reference; + }; + switch (node.kind) { case ts.SyntaxKind.ObjectLiteralExpression: let obj: {[name: string]: any} = {}; @@ -253,7 +262,7 @@ export class Evaluator { } const propertyValue = isPropertyAssignment(assignment) ? this.evaluateNode(assignment.initializer) : - {__symbolic: 'reference', name: propertyName}; + resolveName(propertyName); if (isFoldableError(propertyValue)) { error = propertyValue; return true; // Stop the forEachChild. @@ -384,12 +393,7 @@ export class Evaluator { case ts.SyntaxKind.Identifier: const identifier = node; const name = identifier.text; - const reference = this.symbols.resolve(name); - if (reference === undefined) { - // Encode as a global reference. StaticReflector will check the reference. - return recordEntry({__symbolic: 'reference', name}, node); - } - return reference; + return resolveName(name); case ts.SyntaxKind.TypeReference: const typeReferenceNode = node; const typeNameNode = typeReferenceNode.typeName; diff --git a/tools/@angular/tsc-wrapped/test/collector.spec.ts b/tools/@angular/tsc-wrapped/test/collector.spec.ts index f179d64fe7..896e2f4cbf 100644 --- a/tools/@angular/tsc-wrapped/test/collector.spec.ts +++ b/tools/@angular/tsc-wrapped/test/collector.spec.ts @@ -721,6 +721,21 @@ describe('Collector', () => { }); }); + describe('regerssion', () => { + it('should be able to collect a short-hand property value', () => { + const source = ts.createSourceFile( + '', ` + const children = { f1: 1 }; + export const r = [ + {path: ':locale', children} + ]; + `, + ts.ScriptTarget.Latest, true); + const metadata = collector.getMetadata(source); + expect(metadata.metadata).toEqual({r: [{path: ':locale', children: {f1: 1}}]}); + }); + }); + function override(fileName: string, content: string) { host.overrideFile(fileName, content); host.addFile(fileName);