Skip to content

Commit e6b2443

Browse files
authored
fix(compiler): Collector collects enum values. (angular#9967)
Fixes: angular#9928
1 parent a05f7b2 commit e6b2443

File tree

3 files changed

+75
-3
lines changed

3 files changed

+75
-3
lines changed

tools/@angular/tsc-wrapped/src/collector.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,46 @@ export class MetadataCollector {
175175
}
176176
// Otherwise don't record the function.
177177
break;
178+
case ts.SyntaxKind.EnumDeclaration:
179+
const enumDeclaration = <ts.EnumDeclaration>node;
180+
let enumValueHolder: {[name: string]: MetadataValue} = {};
181+
const enumName = enumDeclaration.name.text;
182+
let nextDefaultValue: MetadataValue = 0;
183+
let writtenMembers = 0;
184+
for (const member of enumDeclaration.members) {
185+
let enumValue: MetadataValue;
186+
if (!member.initializer) {
187+
enumValue = nextDefaultValue;
188+
} else {
189+
enumValue = evaluator.evaluateNode(member.initializer);
190+
}
191+
let name: string = undefined;
192+
if (member.name.kind == ts.SyntaxKind.Identifier) {
193+
const identifier = <ts.Identifier>member.name;
194+
name = identifier.text;
195+
enumValueHolder[name] = enumValue;
196+
writtenMembers++;
197+
}
198+
if (typeof enumValue === 'number') {
199+
nextDefaultValue = enumValue + 1;
200+
} else if (name) {
201+
nextDefaultValue = {
202+
__symbolic: 'binary',
203+
operator: '+',
204+
left: {
205+
__symbolic: 'select',
206+
expression: {__symbolic: 'reference', name: enumName}, name
207+
}
208+
}
209+
} else {
210+
nextDefaultValue = errorSym('Unsuppported enum member name', member.name);
211+
};
212+
}
213+
if (writtenMembers) {
214+
if (!metadata) metadata = {};
215+
metadata[enumName] = enumValueHolder;
216+
}
217+
break;
178218
case ts.SyntaxKind.VariableStatement:
179219
const variableStatement = <ts.VariableStatement>node;
180220
for (let variableDeclaration of variableStatement.declarationList.declarations) {

tools/@angular/tsc-wrapped/test/collector.spec.ts

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ describe('Collector', () => {
1515
beforeEach(() => {
1616
host = new Host(FILES, [
1717
'/app/app.component.ts', '/app/cases-data.ts', '/app/error-cases.ts', '/promise.ts',
18-
'/unsupported-1.ts', '/unsupported-2.ts', 'import-star.ts', 'exported-functions.ts'
18+
'/unsupported-1.ts', '/unsupported-2.ts', 'import-star.ts', 'exported-functions.ts',
19+
'exported-enum.ts', 'exported-consts.ts'
1920
]);
2021
service = ts.createLanguageService(host, documentRegistry);
2122
program = service.getProgram();
@@ -316,6 +317,26 @@ describe('Collector', () => {
316317
{__symbolic: 'reference', module: 'angular2/common', name: 'NgFor'}
317318
]);
318319
});
320+
321+
it('should be able to collect the value of an enum', () => {
322+
let enumSource = program.getSourceFile('/exported-enum.ts');
323+
let metadata = collector.getMetadata(enumSource);
324+
let someEnum: any = metadata.metadata['SomeEnum'];
325+
expect(someEnum).toEqual({A: 0, B: 1, C: 100, D: 101});
326+
});
327+
328+
it('should be able to collect enums initialized from consts', () => {
329+
let enumSource = program.getSourceFile('/exported-enum.ts');
330+
let metadata = collector.getMetadata(enumSource);
331+
let complexEnum: any = metadata.metadata['ComplexEnum'];
332+
expect(complexEnum).toEqual({
333+
A: 0,
334+
B: 1,
335+
C: 30,
336+
D: 40,
337+
E: {__symbolic: 'reference', module: './exported-consts', name: 'constValue'}
338+
});
339+
});
319340
});
320341

321342
// TODO: Do not use \` in a template literal as it confuses clang-format
@@ -548,6 +569,16 @@ const FILES: Directory = {
548569
return !!window.history.pushState;
549570
}
550571
`,
572+
'exported-enum.ts': `
573+
import {constValue} from './exported-consts';
574+
575+
export const someValue = 30;
576+
export enum SomeEnum { A, B, C = 100, D };
577+
export enum ComplexEnum { A, B, C = someValue, D = someValue + 10, E = constValue };
578+
`,
579+
'exported-consts.ts': `
580+
export const constValue = 100;
581+
`,
551582
'node_modules': {
552583
'angular2': {
553584
'core.d.ts': `

tools/tsc-watch/index.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,9 @@ if (platform == 'node') {
8989
start: 'File change detected. Starting incremental compilation...',
9090
error: 'error',
9191
complete: 'Compilation complete. Watching for file changes.',
92-
onChangeCmds:
93-
[['node', 'dist/tools/cjs-jasmine/index-tools', '--', 'tsc-wrapped/**/*{_,.}spec.js']]
92+
onChangeCmds: [[
93+
'node', 'dist/tools/cjs-jasmine/index-tools', '--', '@angular/tsc-wrapped/**/*{_,.}spec.js'
94+
]]
9495
});
9596
}
9697

0 commit comments

Comments
 (0)