diff --git a/modules/angular2/src/transform/bind_generator/generator.dart b/modules/angular2/src/transform/bind_generator/generator.dart index cd9b27ecd7..41a19b31c9 100644 --- a/modules/angular2/src/transform/bind_generator/generator.dart +++ b/modules/angular2/src/transform/bind_generator/generator.dart @@ -27,7 +27,7 @@ List _generateSetters(Map bindMap) { var setters = []; // TODO(kegluneq): Include types for receivers. See #886. bindMap.forEach((prop, type) { - setters.add('\'$prop\': (o, String v) => o.$prop = v'); + setters.add(''''$prop': (o, String v) => o.$prop = v'''); }); return setters; } diff --git a/modules/angular2/src/transform/common/registered_type.dart b/modules/angular2/src/transform/common/registered_type.dart index 5b899301ee..2e0bbf03ad 100644 --- a/modules/angular2/src/transform/common/registered_type.dart +++ b/modules/angular2/src/transform/common/registered_type.dart @@ -10,13 +10,13 @@ class RegisteredType { /// The actual call to `Reflector#registerType`. final MethodInvocation registerMethod; /// The factory method registered. - final Expression factory; + final Expression factoryFn; /// The parameters registered. final Expression parameters; /// The annotations registered. final Expression annotations; - RegisteredType._(this.typeName, this.registerMethod, this.factory, + RegisteredType._(this.typeName, this.registerMethod, this.factoryFn, this.parameters, this.annotations); /// Creates a [RegisteredType] given a [MethodInvocation] node representing @@ -25,14 +25,14 @@ class RegisteredType { var visitor = new _ParseRegisterTypeVisitor(); registerMethod.accept(visitor); return new RegisteredType._(visitor.typeName, registerMethod, - visitor.factory, visitor.parameters, visitor.annotations); + visitor.factoryFn, visitor.parameters, visitor.annotations); } } class _ParseRegisterTypeVisitor extends Object with RecursiveAstVisitor { Identifier typeName; - Expression factory; + Expression factoryFn; Expression parameters; Expression annotations; @@ -56,7 +56,7 @@ class _ParseRegisterTypeVisitor extends Object annotations = node.value; break; case 'factory': - factory = node.value; + factoryFn = node.value; break; case 'parameters': parameters = node.value; diff --git a/modules/angular2/src/transform/directive_processor/rewriter.dart b/modules/angular2/src/transform/directive_processor/rewriter.dart index e7e73deb3c..4fa12ac795 100644 --- a/modules/angular2/src/transform/directive_processor/rewriter.dart +++ b/modules/angular2/src/transform/directive_processor/rewriter.dart @@ -64,7 +64,7 @@ class CreateNgDepsVisitor extends Object } void _writeImport() { - writer.print('import \'${path.basename(importPath)}\';'); + writer.print('''import '${path.basename(importPath)}';'''); } @override @@ -150,19 +150,19 @@ class CreateNgDepsVisitor extends Object } writer.print('..registerType('); visitNode(node.name); - writer.print(', {\'factory\': '); + writer.print(''', {'factory': '''); if (ctor == null) { _generateEmptyFactory(node.name.toString()); } else { ctor.accept(_factoryVisitor); } - writer.print(', \'parameters\': '); + writer.print(''', 'parameters': '''); if (ctor == null) { _generateEmptyParams(); } else { ctor.accept(_paramsVisitor); } - writer.print(', \'annotations\': '); + writer.print(''', 'annotations': '''); node.accept(_metaVisitor); writer.print('})'); diff --git a/modules/angular2/test/transform/bind_generator/all_tests.dart b/modules/angular2/test/transform/bind_generator/all_tests.dart new file mode 100644 index 0000000000..40e8991247 --- /dev/null +++ b/modules/angular2/test/transform/bind_generator/all_tests.dart @@ -0,0 +1,41 @@ +library angular2.test.transform.bind_generator.all_tests; + +import 'dart:io'; +import 'package:barback/barback.dart'; +import 'package:angular2/src/transform/bind_generator/generator.dart'; +import 'package:angular2/src/transform/common/formatter.dart'; +import 'package:code_transformers/tests.dart'; +import 'package:dart_style/dart_style.dart'; +import 'package:path/path.dart' as path; +import 'package:unittest/unittest.dart'; +import 'package:unittest/vm_config.dart'; + +import '../common/read_file.dart'; + +var formatter = new DartFormatter(); + +void allTests() { + var reader = new TestAssetReader(); + + test('should generate a setter for a `bind` property in an annotation.', + () async { + var inputPath = 'bind_generator/basic_bind_files/bar.ngDeps.dart'; + var expected = formatter.format( + readFile('bind_generator/basic_bind_files/expected/bar.ngDeps.dart')); + + var output = formatter + .format(await createNgSetters(reader, new AssetId('a', inputPath))); + expect(output, equals(expected)); + }); + + test('should generate a single setter when multiple annotations bind to the ' + 'same property.', () async { + var inputPath = 'bind_generator/duplicate_bind_name_files/soup.ngDeps.dart'; + var expected = formatter.format(readFile( + 'bind_generator/duplicate_bind_name_files/expected/soup.ngDeps.dart')); + + var output = formatter + .format(await createNgSetters(reader, new AssetId('a', inputPath))); + expect(output, equals(expected)); + }); +} diff --git a/modules/angular2/test/transform/bind_generator/basic_bind_files/bar.ngDeps.dart b/modules/angular2/test/transform/bind_generator/basic_bind_files/bar.ngDeps.dart new file mode 100644 index 0000000000..927ce2f4ea --- /dev/null +++ b/modules/angular2/test/transform/bind_generator/basic_bind_files/bar.ngDeps.dart @@ -0,0 +1,19 @@ +library bar; + +import 'bar.dart'; +import 'package:angular2/src/core/annotations/annotations.dart'; + +bool _visited = false; +void setupReflection(reflector) { + if (_visited) return; + _visited = true; + reflector + ..registerType(ToolTip, { + 'factory': () => new ToolTip(), + 'parameters': const [], + 'annotations': const [ + const Decorator( + selector: '[tool-tip]', bind: const {'text': 'tool-tip'}) + ] + }); +} diff --git a/modules/angular2/test/transform/integration/basic_bind_files/expected/bar.ngDeps.dart b/modules/angular2/test/transform/bind_generator/basic_bind_files/expected/bar.ngDeps.dart similarity index 70% rename from modules/angular2/test/transform/integration/basic_bind_files/expected/bar.ngDeps.dart rename to modules/angular2/test/transform/bind_generator/basic_bind_files/expected/bar.ngDeps.dart index eb12c20473..ba66daa570 100644 --- a/modules/angular2/test/transform/integration/basic_bind_files/expected/bar.ngDeps.dart +++ b/modules/angular2/test/transform/bind_generator/basic_bind_files/expected/bar.ngDeps.dart @@ -8,13 +8,6 @@ void setupReflection(reflector) { if (_visited) return; _visited = true; reflector - ..registerType(MyComponent, { - 'factory': () => new MyComponent(), - 'parameters': const [], - 'annotations': const [ - const Component(selector: 'soup', services: const [ToolTip]) - ] - }) ..registerType(ToolTip, { 'factory': () => new ToolTip(), 'parameters': const [], diff --git a/modules/angular2/test/transform/bind_generator/duplicate_bind_name_files/expected/soup.ngDeps.dart b/modules/angular2/test/transform/bind_generator/duplicate_bind_name_files/expected/soup.ngDeps.dart new file mode 100644 index 0000000000..ba3be64323 --- /dev/null +++ b/modules/angular2/test/transform/bind_generator/duplicate_bind_name_files/expected/soup.ngDeps.dart @@ -0,0 +1,26 @@ +library dinner.soup; + +import 'package:angular2/src/core/annotations/annotations.dart'; +import 'soup.dart'; + +bool _visited = false; +void setupReflection(reflector) { + if (_visited) return; + _visited = true; + reflector + ..registerType(SoupComponent, { + 'factory': () => new SoupComponent(), + 'parameters': const [], + 'annotations': const [ + const Component( + componentServices: const [SaladComponent], + bind: const {'menu': 'menu'}) + ] + }) + ..registerType(SaladComponent, { + 'factory': () => new SaladComponent(), + 'parameters': const [], + 'annotations': const [const Component(bind: const {'menu': 'menu'})] + }) + ..registerSetters({'menu': (o, String v) => o.menu = v}); +} diff --git a/modules/angular2/test/transform/bind_generator/duplicate_bind_name_files/soup.ngDeps.dart b/modules/angular2/test/transform/bind_generator/duplicate_bind_name_files/soup.ngDeps.dart new file mode 100644 index 0000000000..7f88110003 --- /dev/null +++ b/modules/angular2/test/transform/bind_generator/duplicate_bind_name_files/soup.ngDeps.dart @@ -0,0 +1,25 @@ +library dinner.soup; + +import 'package:angular2/src/core/annotations/annotations.dart'; +import 'soup.dart'; + +bool _visited = false; +void setupReflection(reflector) { + if (_visited) return; + _visited = true; + reflector + ..registerType(SoupComponent, { + 'factory': () => new SoupComponent(), + 'parameters': const [], + 'annotations': const [ + const Component( + componentServices: const [SaladComponent], + bind: const {'menu': 'menu'}) + ] + }) + ..registerType(SaladComponent, { + 'factory': () => new SaladComponent(), + 'parameters': const [], + 'annotations': const [const Component(bind: const {'menu': 'menu'})] + }); +} diff --git a/modules/angular2/test/transform/integration/all_tests.dart b/modules/angular2/test/transform/integration/all_tests.dart index df5bbe4ae0..292bdff352 100644 --- a/modules/angular2/test/transform/integration/all_tests.dart +++ b/modules/angular2/test/transform/integration/all_tests.dart @@ -93,14 +93,6 @@ void allTests() { outputs: { 'a|web/bar.ngDeps.dart': 'two_annotations_files/expected/bar.ngDeps.dart' }), - new IntegrationTestConfig('should generate setters for `bind` values.', - inputs: { - 'a|web/index.dart': 'basic_bind_files/index.dart', - 'a|web/bar.dart': 'basic_bind_files/bar.dart' - }, - outputs: { - 'a|web/bar.ngDeps.dart': 'basic_bind_files/expected/bar.ngDeps.dart' - }), new IntegrationTestConfig( 'should ensure that dependencies are property chained.', inputs: { diff --git a/modules/angular2/test/transform/integration/basic_bind_files/bar.dart b/modules/angular2/test/transform/integration/basic_bind_files/bar.dart deleted file mode 100644 index 62f77c23a5..0000000000 --- a/modules/angular2/test/transform/integration/basic_bind_files/bar.dart +++ /dev/null @@ -1,11 +0,0 @@ -library bar; - -import 'package:angular2/src/core/annotations/annotations.dart'; - -@Component(selector: 'soup', services: const [ToolTip]) -class MyComponent {} - -@Decorator(selector: '[tool-tip]', bind: const {'text': 'tool-tip'}) -class ToolTip { - String text; -} diff --git a/modules/angular2/test/transform/integration/basic_bind_files/index.dart b/modules/angular2/test/transform/integration/basic_bind_files/index.dart deleted file mode 100644 index 505e371e0e..0000000000 --- a/modules/angular2/test/transform/integration/basic_bind_files/index.dart +++ /dev/null @@ -1,10 +0,0 @@ -library web_foo; - -import 'package:angular2/src/core/application.dart'; -import 'package:angular2/src/reflection/reflection_capabilities.dart'; -import 'bar.dart'; - -void main() { - reflector.reflectionCapabilities = new ReflectionCapabilities(); - bootstrap(MyComponent); -} diff --git a/modules/angular2/test/transform/transform.server.spec.dart b/modules/angular2/test/transform/transform.server.spec.dart index 7ed038417a..214f7f1a54 100644 --- a/modules/angular2/test/transform/transform.server.spec.dart +++ b/modules/angular2/test/transform/transform.server.spec.dart @@ -3,12 +3,14 @@ library angular2.test.transform; import 'package:unittest/unittest.dart'; import 'package:unittest/vm_config.dart'; +import 'bind_generator/all_tests.dart' as bindGenerator; import 'directive_processor/all_tests.dart' as directiveProcessor; import 'integration/all_tests.dart' as integration; import 'reflection_remover/all_tests.dart' as reflectionRemover; main() { useVMConfiguration(); + group('Bind Generator', bindGenerator.allTests); group('Directive Processor', directiveProcessor.allTests); group('Reflection Remover', reflectionRemover.allTests); group('Transformer Pipeline', integration.allTests);