parent
a05f7b2d76
commit
e6b24437a9
|
@ -175,6 +175,46 @@ export class MetadataCollector {
|
||||||
}
|
}
|
||||||
// Otherwise don't record the function.
|
// Otherwise don't record the function.
|
||||||
break;
|
break;
|
||||||
|
case ts.SyntaxKind.EnumDeclaration:
|
||||||
|
const enumDeclaration = <ts.EnumDeclaration>node;
|
||||||
|
let enumValueHolder: {[name: string]: MetadataValue} = {};
|
||||||
|
const enumName = enumDeclaration.name.text;
|
||||||
|
let nextDefaultValue: MetadataValue = 0;
|
||||||
|
let writtenMembers = 0;
|
||||||
|
for (const member of enumDeclaration.members) {
|
||||||
|
let enumValue: MetadataValue;
|
||||||
|
if (!member.initializer) {
|
||||||
|
enumValue = nextDefaultValue;
|
||||||
|
} else {
|
||||||
|
enumValue = evaluator.evaluateNode(member.initializer);
|
||||||
|
}
|
||||||
|
let name: string = undefined;
|
||||||
|
if (member.name.kind == ts.SyntaxKind.Identifier) {
|
||||||
|
const identifier = <ts.Identifier>member.name;
|
||||||
|
name = identifier.text;
|
||||||
|
enumValueHolder[name] = enumValue;
|
||||||
|
writtenMembers++;
|
||||||
|
}
|
||||||
|
if (typeof enumValue === 'number') {
|
||||||
|
nextDefaultValue = enumValue + 1;
|
||||||
|
} else if (name) {
|
||||||
|
nextDefaultValue = {
|
||||||
|
__symbolic: 'binary',
|
||||||
|
operator: '+',
|
||||||
|
left: {
|
||||||
|
__symbolic: 'select',
|
||||||
|
expression: {__symbolic: 'reference', name: enumName}, name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
nextDefaultValue = errorSym('Unsuppported enum member name', member.name);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
if (writtenMembers) {
|
||||||
|
if (!metadata) metadata = {};
|
||||||
|
metadata[enumName] = enumValueHolder;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case ts.SyntaxKind.VariableStatement:
|
case ts.SyntaxKind.VariableStatement:
|
||||||
const variableStatement = <ts.VariableStatement>node;
|
const variableStatement = <ts.VariableStatement>node;
|
||||||
for (let variableDeclaration of variableStatement.declarationList.declarations) {
|
for (let variableDeclaration of variableStatement.declarationList.declarations) {
|
||||||
|
|
|
@ -15,7 +15,8 @@ describe('Collector', () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
host = new Host(FILES, [
|
host = new Host(FILES, [
|
||||||
'/app/app.component.ts', '/app/cases-data.ts', '/app/error-cases.ts', '/promise.ts',
|
'/app/app.component.ts', '/app/cases-data.ts', '/app/error-cases.ts', '/promise.ts',
|
||||||
'/unsupported-1.ts', '/unsupported-2.ts', 'import-star.ts', 'exported-functions.ts'
|
'/unsupported-1.ts', '/unsupported-2.ts', 'import-star.ts', 'exported-functions.ts',
|
||||||
|
'exported-enum.ts', 'exported-consts.ts'
|
||||||
]);
|
]);
|
||||||
service = ts.createLanguageService(host, documentRegistry);
|
service = ts.createLanguageService(host, documentRegistry);
|
||||||
program = service.getProgram();
|
program = service.getProgram();
|
||||||
|
@ -316,6 +317,26 @@ describe('Collector', () => {
|
||||||
{__symbolic: 'reference', module: 'angular2/common', name: 'NgFor'}
|
{__symbolic: 'reference', module: 'angular2/common', name: 'NgFor'}
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should be able to collect the value of an enum', () => {
|
||||||
|
let enumSource = program.getSourceFile('/exported-enum.ts');
|
||||||
|
let metadata = collector.getMetadata(enumSource);
|
||||||
|
let someEnum: any = metadata.metadata['SomeEnum'];
|
||||||
|
expect(someEnum).toEqual({A: 0, B: 1, C: 100, D: 101});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be able to collect enums initialized from consts', () => {
|
||||||
|
let enumSource = program.getSourceFile('/exported-enum.ts');
|
||||||
|
let metadata = collector.getMetadata(enumSource);
|
||||||
|
let complexEnum: any = metadata.metadata['ComplexEnum'];
|
||||||
|
expect(complexEnum).toEqual({
|
||||||
|
A: 0,
|
||||||
|
B: 1,
|
||||||
|
C: 30,
|
||||||
|
D: 40,
|
||||||
|
E: {__symbolic: 'reference', module: './exported-consts', name: 'constValue'}
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// TODO: Do not use \` in a template literal as it confuses clang-format
|
// TODO: Do not use \` in a template literal as it confuses clang-format
|
||||||
|
@ -548,6 +569,16 @@ const FILES: Directory = {
|
||||||
return !!window.history.pushState;
|
return !!window.history.pushState;
|
||||||
}
|
}
|
||||||
`,
|
`,
|
||||||
|
'exported-enum.ts': `
|
||||||
|
import {constValue} from './exported-consts';
|
||||||
|
|
||||||
|
export const someValue = 30;
|
||||||
|
export enum SomeEnum { A, B, C = 100, D };
|
||||||
|
export enum ComplexEnum { A, B, C = someValue, D = someValue + 10, E = constValue };
|
||||||
|
`,
|
||||||
|
'exported-consts.ts': `
|
||||||
|
export const constValue = 100;
|
||||||
|
`,
|
||||||
'node_modules': {
|
'node_modules': {
|
||||||
'angular2': {
|
'angular2': {
|
||||||
'core.d.ts': `
|
'core.d.ts': `
|
||||||
|
|
|
@ -89,8 +89,9 @@ if (platform == 'node') {
|
||||||
start: 'File change detected. Starting incremental compilation...',
|
start: 'File change detected. Starting incremental compilation...',
|
||||||
error: 'error',
|
error: 'error',
|
||||||
complete: 'Compilation complete. Watching for file changes.',
|
complete: 'Compilation complete. Watching for file changes.',
|
||||||
onChangeCmds:
|
onChangeCmds: [[
|
||||||
[['node', 'dist/tools/cjs-jasmine/index-tools', '--', 'tsc-wrapped/**/*{_,.}spec.js']]
|
'node', 'dist/tools/cjs-jasmine/index-tools', '--', '@angular/tsc-wrapped/**/*{_,.}spec.js'
|
||||||
|
]]
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue