Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions tools/metadata/src/collector.ts
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,8 @@ export class MetadataCollector {
}
break;
case ts.SyntaxKind.PropertyDeclaration:
case ts.SyntaxKind.GetAccessor:
case ts.SyntaxKind.SetAccessor:
const property = <ts.PropertyDeclaration>member;
const propertyDecorators = getDecorators(property.decorators);
if (propertyDecorators) {
Expand Down
65 changes: 60 additions & 5 deletions tools/metadata/test/collector.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -172,15 +172,43 @@ describe('Collector', () => {
expect(metadata).toBeFalsy();
});

let casesFile;
let casesMetadata;

beforeEach(() => {
casesFile = program.getSourceFile('/app/cases-data.ts');
casesMetadata = collector.getMetadata(casesFile, typeChecker);
});

it('should provide null for an any ctor pameter type', () => {
const sourceFile = program.getSourceFile('/app/cases-data.ts');
const metadata = collector.getMetadata(sourceFile, typeChecker);
expect(metadata).toBeTruthy();
const casesAny = <ClassMetadata>metadata.metadata['CaseAny'];
const casesAny = <ClassMetadata>casesMetadata.metadata['CaseAny'];
expect(casesAny).toBeTruthy();
const ctorData = casesAny.members['__ctor__'];
expect(ctorData).toEqual([{__symbolic: 'constructor', parameters: [null]}]);
});

it('should record annotations on set and get declartions', () => {
const propertyData = {
name: [
{
__symbolic: 'property',
decorators: [
{
__symbolic: 'call',
expression: {__symbolic: 'reference', module: 'angular2/core', name: 'Input'},
arguments: ['firstName']
}
]
}
]
};
const caseGetProp = <ClassMetadata>casesMetadata.metadata['GetProp'];
expect(caseGetProp.members).toEqual(propertyData);
const caseSetProp = <ClassMetadata>casesMetadata.metadata['SetProp'];
expect(caseSetProp.members).toEqual(propertyData);
const caseFullProp = <ClassMetadata>casesMetadata.metadata['FullProp'];
expect(caseFullProp.members).toEqual(propertyData);
});
});

// TODO: Do not use \` in a template literal as it confuses clang-format
Expand Down Expand Up @@ -285,12 +313,39 @@ const FILES: Directory = {
}
}`,
'cases-data.ts': `
import {Injectable} from 'angular2/core';
import {Injectable, Input} from 'angular2/core';

@Injectable()
export class CaseAny {
constructor(param: any) {}
}

@Injectable()
export class GetProp {
private _name: string;
@Input('firstName') get name(): string {
return this._name;
}
}

@Injectable()
export class SetProp {
private _name: string;
@Input('firstName') set name(value: string) {
this._name = value;
}
}

@Injectable()
export class FullProp {
private _name: string;
@Input('firstName') get name(): string {
return this._name;
}
set name(value: string) {
this._name = value;
}
}
`,
'cases-no-data.ts': `
import {HeroService} from './hero.service';
Expand Down