diff --git a/tools/@angular/tsc-wrapped/src/evaluator.ts b/tools/@angular/tsc-wrapped/src/evaluator.ts index ef442c0e5d..ee43f71b59 100644 --- a/tools/@angular/tsc-wrapped/src/evaluator.ts +++ b/tools/@angular/tsc-wrapped/src/evaluator.ts @@ -388,6 +388,9 @@ export class Evaluator { if (isFoldableError(expression)) { return recordEntry(expression, node); } + if (!elementAccessExpression.argumentExpression) { + return recordEntry(errorSymbol('Expression form not supported', node), node); + } const index = this.evaluateNode(elementAccessExpression.argumentExpression); if (isFoldableError(expression)) { return recordEntry(expression, node); diff --git a/tools/@angular/tsc-wrapped/test/collector.spec.ts b/tools/@angular/tsc-wrapped/test/collector.spec.ts index 985c08836b..a83edd48c1 100644 --- a/tools/@angular/tsc-wrapped/test/collector.spec.ts +++ b/tools/@angular/tsc-wrapped/test/collector.spec.ts @@ -864,6 +864,28 @@ describe('Collector', () => { const metadata = collector.getMetadata(source); expect(metadata).toBeUndefined(); }); + + it('should be able to collect an invalid access expression', () => { + const source = createSource(` + import {Component} from '@angular/core'; + + const value = []; + @Component({ + provider: [{provide: 'some token', useValue: value[]}] + }) + export class MyComponent {} + `); + const metadata = collector.getMetadata(source); + expect(metadata.metadata.MyComponent).toEqual({ + __symbolic: 'class', + decorators: [{ + __symbolic: 'error', + message: 'Expression form not supported', + line: 5, + character: 55 + }] + }); + }); }); function override(fileName: string, content: string) {