From 45747ed531e62f2ff4fbd48b2b3e271f3f9c74cd Mon Sep 17 00:00:00 2001 From: Tobias Bosch Date: Wed, 20 Sep 2017 16:26:11 -0700 Subject: [PATCH] =?UTF-8?q?fix(compiler):=20don=E2=80=99t=20lower=20proper?= =?UTF-8?q?ty=20accesses=20of=20exported=20symbols=20(#19301)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit E.g. this allows the following to work: ``` @Decorator({ useValue: MyClass.someMethod }) class MyClass { static someMethod() {} } ``` PR Close #19301 --- .../src/transformers/lower_expressions.ts | 14 ++++++++++++-- .../test/transformers/lower_expressions_spec.ts | 14 ++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/packages/compiler-cli/src/transformers/lower_expressions.ts b/packages/compiler-cli/src/transformers/lower_expressions.ts index e182a4d448..86e196c17e 100644 --- a/packages/compiler-cli/src/transformers/lower_expressions.ts +++ b/packages/compiler-cli/src/transformers/lower_expressions.ts @@ -292,6 +292,15 @@ export class LowerMetadataCache implements RequestsMap { }; })(); + const isExportedPropertyAccess = (node: ts.Node) => { + if (node.kind === ts.SyntaxKind.PropertyAccessExpression) { + const pae = node as ts.PropertyAccessExpression; + if (isExportedSymbol(pae.expression)) { + return true; + } + } + return false; + }; const replaceNode = (node: ts.Node) => { const name = freshIdent(); requests.set(node.pos, {name, kind: node.kind, location: node.pos, end: node.end}); @@ -306,14 +315,15 @@ export class LowerMetadataCache implements RequestsMap { return replaceNode(node); } if (isLiteralFieldNamed(node, LOWERABLE_FIELD_NAMES) && shouldLower(node) && - !isExportedSymbol(node)) { + !isExportedSymbol(node) && !isExportedPropertyAccess(node)) { return replaceNode(node); } } return value; }; - const metadata = this.collector.getMetadata(sourceFile, this.strict, substituteExpression); + const metadata = this.collector.getMetadata( + sourceFile, this.strict, sourceFile.isDeclarationFile ? undefined : substituteExpression); return {metadata, requests}; } diff --git a/packages/compiler-cli/test/transformers/lower_expressions_spec.ts b/packages/compiler-cli/test/transformers/lower_expressions_spec.ts index 8b79a5761b..cfd19b9d45 100644 --- a/packages/compiler-cli/test/transformers/lower_expressions_spec.ts +++ b/packages/compiler-cli/test/transformers/lower_expressions_spec.ts @@ -54,6 +54,20 @@ describe('Expression lowering', () => { .toBeTruthy('did not find the useValue'); }); + it('should not request a lowering for useValue with a reference to a static property', () => { + const collected = collect(` + import {Component} from '@angular/core'; + + @Component({ + provider: [{provide: 'someToken', useValue:◊value: MyClass.someMethod◊}] + }) + export class MyClass { + static someMethod() {} + } + `); + expect(collected.requests.size).toBe(0); + }); + it('should request a lowering for useFactory', () => { const collected = collect(` import {Component} from '@angular/core';