feat(dart/transform): Record property metadata

Update the transformer to generate code registering annotations on class
properties, getters, and setters.

Closes #1800, #3267, #4003
This commit is contained in:
Tim Blasi
2015-09-15 16:38:38 -07:00
parent cc1d758eba
commit 64e8f93f32
8 changed files with 260 additions and 11 deletions

View File

@ -292,6 +292,61 @@ void allTests() {
});
});
describe('property metadata', () {
it('should be recorded on fields', () async {
var model = await _testCreateModel('prop_metadata_files/fields.dart');
expect(model.reflectables.first.propertyMetadata).toBeNotNull();
expect(model.reflectables.first.propertyMetadata.isNotEmpty).toBeTrue();
expect(model.reflectables.first.propertyMetadata.first.name)
.toEqual('field');
expect(model.reflectables.first.propertyMetadata.first.annotations
.firstWhere((a) => a.name == 'FieldDecorator',
orElse: () => null)).toBeNotNull();
});
it('should be recorded on getters', () async {
var model = await _testCreateModel('prop_metadata_files/getters.dart');
expect(model.reflectables.first.propertyMetadata).toBeNotNull();
expect(model.reflectables.first.propertyMetadata.isNotEmpty).toBeTrue();
expect(model.reflectables.first.propertyMetadata.first.name)
.toEqual('getVal');
expect(model.reflectables.first.propertyMetadata.first.annotations
.firstWhere((a) => a.name == 'GetDecorator', orElse: () => null))
.toBeNotNull();
});
it('should be recorded on setters', () async {
var model = await _testCreateModel('prop_metadata_files/setters.dart');
expect(model.reflectables.first.propertyMetadata).toBeNotNull();
expect(model.reflectables.first.propertyMetadata.isNotEmpty).toBeTrue();
expect(model.reflectables.first.propertyMetadata.first.name)
.toEqual('setVal');
expect(model.reflectables.first.propertyMetadata.first.annotations
.firstWhere((a) => a.name == 'SetDecorator', orElse: () => null))
.toBeNotNull();
});
it('should be coalesced when getters and setters have the same name',
() async {
var model = await _testCreateModel(
'prop_metadata_files/getters_and_setters.dart');
expect(model.reflectables.first.propertyMetadata).toBeNotNull();
expect(model.reflectables.first.propertyMetadata.length).toBe(1);
expect(model.reflectables.first.propertyMetadata.first.name)
.toEqual('myVal');
expect(model.reflectables.first.propertyMetadata.first.annotations
.firstWhere((a) => a.name == 'GetDecorator', orElse: () => null))
.toBeNotNull();
expect(model.reflectables.first.propertyMetadata.first.annotations
.firstWhere((a) => a.name == 'SetDecorator', orElse: () => null))
.toBeNotNull();
});
});
it('should not throw/hang on invalid urls', () async {
var logger = new RecordingLogger();
var model =

View File

@ -0,0 +1,8 @@
library fields;
import 'package:angular2/src/core/metadata.dart';
@Component(selector: '[fields]')
class FieldComponent {
@FieldDecorator("field") String field;
}

View File

@ -0,0 +1,8 @@
library fields;
import 'package:angular2/src/core/metadata.dart';
@Component(selector: '[getters]')
class FieldComponent {
@GetDecorator("get") String get getVal => 'a';
}

View File

@ -0,0 +1,10 @@
library fields;
import 'package:angular2/src/core/metadata.dart';
@Component(selector: '[getters-and-setters]')
class FieldComponent {
String _val;
@GetDecorator("get") String get myVal => _val;
@SetDecorator("set") String set myVal(val) => _val = val;
}

View File

@ -0,0 +1,8 @@
library fields;
import 'package:angular2/src/core/metadata.dart';
@Component(selector: '[setters]')
class FieldComponent {
@SetDecorator("set") String set setVal(val) => null;
}