fix(tsc-wrapped): resolve short-hand literal values to locals (#16873)

Fixes: #16872
This commit is contained in:
Chuck Jazdzewski 2017-05-22 11:18:44 -06:00 committed by GitHub
parent 98849de127
commit 11c10b2ab8
2 changed files with 26 additions and 7 deletions

View File

@ -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 = <ts.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 = <ts.TypeReferenceNode>node;
const typeNameNode = typeReferenceNode.typeName;

View File

@ -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);