From 563a76304a2f53a8b78f33a7f70437c65328104b Mon Sep 17 00:00:00 2001 From: Tim Blasi Date: Tue, 13 Oct 2015 15:42:00 -0700 Subject: [PATCH] refactor(dart/transform): Delete unused bind_generator All getters & setters generated by `bind_generator` are now generated in the `directive_processor` or `template_compiler` stage. --- .../transform/bind_generator/generator.dart | 116 ------------------ .../transform/bind_generator/transformer.dart | 37 ------ .../lib/src/transform/common/ng_deps.dart | 76 ------------ .../src/transform/common/registered_type.dart | 91 -------------- .../lib/src/transform/transformer.dart | 2 - .../transform/bind_generator/all_tests.dart | 58 --------- .../bar.ng_deps.dart | 18 --- .../expected/bar.ng_deps.dart | 19 --- .../bar.ng_deps.dart | 21 ---- .../expected/bar.ng_deps.dart | 21 ---- .../bar.ng_deps.dart | 21 ---- .../expected/bar.ng_deps.dart | 22 ---- .../test/transform/transform.server.spec.dart | 2 - 13 files changed, 504 deletions(-) delete mode 100644 modules_dart/transform/lib/src/transform/bind_generator/generator.dart delete mode 100644 modules_dart/transform/lib/src/transform/bind_generator/transformer.dart delete mode 100644 modules_dart/transform/lib/src/transform/common/ng_deps.dart delete mode 100644 modules_dart/transform/lib/src/transform/common/registered_type.dart delete mode 100644 modules_dart/transform/test/transform/bind_generator/all_tests.dart delete mode 100644 modules_dart/transform/test/transform/bind_generator/queries_class_annotation_files/bar.ng_deps.dart delete mode 100644 modules_dart/transform/test/transform/bind_generator/queries_class_annotation_files/expected/bar.ng_deps.dart delete mode 100644 modules_dart/transform/test/transform/bind_generator/queries_override_annotation_files/bar.ng_deps.dart delete mode 100644 modules_dart/transform/test/transform/bind_generator/queries_override_annotation_files/expected/bar.ng_deps.dart delete mode 100644 modules_dart/transform/test/transform/bind_generator/queries_prop_annotations_files/bar.ng_deps.dart delete mode 100644 modules_dart/transform/test/transform/bind_generator/queries_prop_annotations_files/expected/bar.ng_deps.dart diff --git a/modules_dart/transform/lib/src/transform/bind_generator/generator.dart b/modules_dart/transform/lib/src/transform/bind_generator/generator.dart deleted file mode 100644 index d0a374dea6..0000000000 --- a/modules_dart/transform/lib/src/transform/bind_generator/generator.dart +++ /dev/null @@ -1,116 +0,0 @@ -library angular2.transform.bind_generator.generator; - -import 'dart:async'; - -import 'package:analyzer/analyzer.dart'; -import 'package:angular2/src/transform/common/asset_reader.dart'; -import 'package:angular2/src/transform/common/ng_deps.dart'; -import 'package:angular2/src/transform/common/property_utils.dart' as prop; -import 'package:barback/barback.dart'; - -class _ExtractQueryFieldsFromAnnotation extends Object - with RecursiveAstVisitor { - final ConstantEvaluator _evaluator = new ConstantEvaluator(); - final List queryFields = []; - - @override - Object visitNamedExpression(NamedExpression node) { - if ('${node.name.label}' == "queries") { - if (node.expression is! MapLiteral) { - throw new FormatException( - 'Expected a map value for "queries", but got ${node.expression}', - node.toSource()); - } - MapLiteral queries = node.expression; - queryFields.addAll(queries.entries.map((e) => e.key.accept(_evaluator))); - } - return super.visitNamedExpression(node); - } - - Map asMap() { - return new Map.fromIterable(queryFields, value: (_) => 'Object'); - } -} - -class _ExtractQueryFieldsFromPropMetadata extends Object - with RecursiveAstVisitor { - final ConstantEvaluator _evaluator = new ConstantEvaluator(); - final List queryFields = []; - - @override - Object visitMapLiteralEntry(MapLiteralEntry node) { - if (_hasQueryAnnotation(node.value)) { - queryFields.add(node.key.accept(_evaluator)); - } - return super.visitMapLiteralEntry(node); - } - - bool _hasQueryAnnotation(list) { - var res = false; - list.elements.forEach((item) { - if (item is! InstanceCreationExpression) return; - var n = item.constructorName.toString(); - if (n == "ContentChild" || - n == "ViewChild" || - n == "ContentChildren" || - n == "ViewChildren") { - res = true; - } - }); - - return res; - } - - asMap() { - return new Map.fromIterable(queryFields, value: (_) => 'Object'); - } -} - -Future createNgSettersAndGetters( - AssetReader reader, AssetId entryPoint) async { - NgDeps ngDeps = await NgDeps.parse(reader, entryPoint); - - String code = ngDeps.code; - var setters = []; - - ngDeps.registeredTypes.forEach((t) { - final fromAnnotation = new _ExtractQueryFieldsFromAnnotation(); - t.annotations.accept(fromAnnotation); - - final fromPropMetadata = new _ExtractQueryFieldsFromPropMetadata(); - if (t.propMetadata != null) { - t.propMetadata.accept(fromPropMetadata); - } - setters.addAll(_generateSetters(fromAnnotation.asMap())); - setters.addAll(_generateSetters(fromPropMetadata.asMap())); - }); - - if (setters.isEmpty) return code; - var out = new StringBuffer(); - var codeInjectIdx = ngDeps.registeredTypes.last.registerMethod.end; - out.write(code.substring(0, codeInjectIdx)); - if (setters.isNotEmpty) { - out.write('..registerSetters({${setters.join(', ')}})'); - } - out.write(code.substring(codeInjectIdx)); - return '$out'; -} - -// TODO(kegluneq): De-dupe from template_compiler/generator.dart, #3589. - -/// Consumes the map generated by {@link _createInputPropertiesMap} to codegen -/// setters. -List _generateSetters(Map bindMap) { - var setters = []; - // TODO(kegluneq): Include types for receivers. See #886. - bindMap.forEach((setterName, type) { - if (!prop.isValid(setterName)) { - // TODO(kegluenq): Eagerly throw here once #1295 is addressed. - setters.add(prop.lazyInvalidSetter(setterName)); - } else { - setters.add(''' '${prop.sanitize(setterName)}': ''' - ''' (o, v) => o.$setterName = v '''); - } - }); - return setters; -} diff --git a/modules_dart/transform/lib/src/transform/bind_generator/transformer.dart b/modules_dart/transform/lib/src/transform/bind_generator/transformer.dart deleted file mode 100644 index 7853ee93a2..0000000000 --- a/modules_dart/transform/lib/src/transform/bind_generator/transformer.dart +++ /dev/null @@ -1,37 +0,0 @@ -library angular2.transform.bind_generator.transformer; - -import 'dart:async'; -import 'package:angular2/src/transform/common/asset_reader.dart'; -import 'package:angular2/src/transform/common/formatter.dart'; -import 'package:angular2/src/transform/common/logging.dart' as log; -import 'package:angular2/src/transform/common/names.dart'; -import 'package:angular2/src/transform/common/options.dart'; -import 'package:barback/barback.dart'; - -import 'generator.dart'; - -/// Transformer responsible for reading .ng_deps.dart files and generating -/// setters from the "annotations" information in the generated -/// `registerType` calls. -/// -/// These setters are registered in the same `setupReflection` function with -/// the `registerType` calls. -class BindGenerator extends Transformer { - final TransformerOptions options; - - BindGenerator(this.options); - - @override - bool isPrimary(AssetId id) => id.path.endsWith(DEPS_EXTENSION); - - @override - Future apply(Transform transform) async { - await log.initZoned(transform, () async { - var primaryId = transform.primaryInput.id; - var reader = new AssetReader.fromTransform(transform); - var transformedCode = await createNgSettersAndGetters(reader, primaryId); - transform.addOutput(new Asset.fromString( - primaryId, formatter.format(transformedCode, uri: primaryId.path))); - }); - } -} diff --git a/modules_dart/transform/lib/src/transform/common/ng_deps.dart b/modules_dart/transform/lib/src/transform/common/ng_deps.dart deleted file mode 100644 index afbf3e4761..0000000000 --- a/modules_dart/transform/lib/src/transform/common/ng_deps.dart +++ /dev/null @@ -1,76 +0,0 @@ -library angular2.transform.common.parser; - -import 'dart:async'; - -import 'package:analyzer/analyzer.dart'; -import 'package:angular2/src/transform/common/asset_reader.dart'; -import 'package:angular2/src/transform/common/names.dart'; -import 'package:barback/barback.dart'; - -import 'registered_type.dart'; - -export 'registered_type.dart'; - -/// The contents of a `.ng_deps.dart` file. -class NgDeps { - final String code; - final List imports = []; - final List exports = []; - final List registeredTypes = []; - LibraryDirective lib = null; - FunctionDeclaration setupMethod = null; - - static _ParseNgDepsVisitor _visitor = new _ParseNgDepsVisitor(); - - /// Parses only the `.ng_deps.dart` file represented by `id`. - static Future parse(AssetReader reader, AssetId id) async { - if (!(await reader.hasInput(id))) return null; - var ngDeps = new NgDeps(await reader.readAsString(id)); - _visitor.ngDeps = ngDeps; - parseCompilationUnit(ngDeps.code, name: id.path).accept(_visitor); - return ngDeps; - } - - NgDeps(this.code); -} - -class _ParseNgDepsVisitor extends Object with RecursiveAstVisitor { - NgDeps ngDeps = null; - - @override - Object visitLibraryDirective(LibraryDirective node) { - ngDeps.lib = node; - return null; - } - - @override - Object visitImportDirective(ImportDirective node) { - ngDeps.imports.add(node); - return super.visitImportDirective(node); - } - - @override - Object visitExportDirective(ExportDirective node) { - ngDeps.exports.add(node); - return super.visitExportDirective(node); - } - - @override - Object visitFunctionDeclaration(FunctionDeclaration node) { - if ('${node.name}' == SETUP_METHOD_NAME) { - ngDeps.setupMethod = node; - } - return super.visitFunctionDeclaration(node); - } - - @override - Object visitMethodInvocation(MethodInvocation node) { - var isRegisterType = '${node.methodName}' == REGISTER_TYPE_METHOD_NAME; - - if (isRegisterType) { - ngDeps.registeredTypes.add(new RegisteredType.fromMethodInvocation(node)); - } - - return super.visitMethodInvocation(node); - } -} diff --git a/modules_dart/transform/lib/src/transform/common/registered_type.dart b/modules_dart/transform/lib/src/transform/common/registered_type.dart deleted file mode 100644 index 18a68125a5..0000000000 --- a/modules_dart/transform/lib/src/transform/common/registered_type.dart +++ /dev/null @@ -1,91 +0,0 @@ -library angular2.transform.common.registered_type; - -import 'package:analyzer/analyzer.dart'; -import 'package:angular2/src/transform/common/names.dart'; - -/// A call to `Reflector#registerType` generated by `DirectiveProcessor`. -class RegisteredType { - /// The type registered by this call. - final Identifier typeName; - - /// The actual call to `Reflector#registerType`. - final MethodInvocation registerMethod; - - /// The `ReflectionInfo` [InstanceCreationExpression] - final InstanceCreationExpression reflectionInfoCreate; - - /// The factory method registered. - final Expression factoryFn; - - /// The parameters registered. - final Expression parameters; - - /// The annotations registered. - final Expression annotations; - - /// The property metadata registered. - final Expression propMetadata; - - RegisteredType._( - this.typeName, - this.registerMethod, - this.reflectionInfoCreate, - this.factoryFn, - this.parameters, - this.annotations, - this.propMetadata); - - /// Creates a {@link RegisteredType} given a {@link MethodInvocation} node representing - /// a call to `registerType`. - factory RegisteredType.fromMethodInvocation(MethodInvocation registerMethod) { - var visitor = new _ParseRegisterTypeVisitor(); - registerMethod.accept(visitor); - return new RegisteredType._( - visitor.typeName, - registerMethod, - visitor.info, - visitor.factoryFn, - visitor.parameters, - visitor.annotations, - visitor.propMetadata); - } -} - -class _ParseRegisterTypeVisitor extends Object - with RecursiveAstVisitor { - Identifier typeName; - InstanceCreationExpression info; - Expression factoryFn; - Expression parameters; - Expression annotations; - Expression propMetadata; - - @override - Object visitMethodInvocation(MethodInvocation node) { - assert('${node.methodName}' == REGISTER_TYPE_METHOD_NAME); - - // The first argument to a `registerType` call is the type. - typeName = node.argumentList.arguments[0] is Identifier - ? node.argumentList.arguments[0] - : null; - - // The second argument to a `registerType` call is the `ReflectionInfo` - // object creation. - info = node.argumentList.arguments[1] as InstanceCreationExpression; - var args = info.argumentList.arguments; - for (int i = 0; i < args.length; i++) { - var arg = args[i]; - if (i == 0) { - annotations = arg; - } else if (i == 1) { - parameters = arg; - } else if (i == 2) { - factoryFn = arg; - } else if (i == 4) { - propMetadata = arg; - } - } - - return null; - } -} diff --git a/modules_dart/transform/lib/src/transform/transformer.dart b/modules_dart/transform/lib/src/transform/transformer.dart index 607368d644..f204889f1b 100644 --- a/modules_dart/transform/lib/src/transform/transformer.dart +++ b/modules_dart/transform/lib/src/transform/transformer.dart @@ -3,7 +3,6 @@ library angular2.src.transform.transformer; import 'package:barback/barback.dart'; import 'package:dart_style/dart_style.dart'; -import 'bind_generator/transformer.dart'; import 'common/formatter.dart' as formatter; import 'common/options.dart'; import 'common/options_reader.dart'; @@ -36,7 +35,6 @@ class AngularTransformerGroup extends TransformerGroup { [new ReflectionRemover(options)], [new DirectiveProcessor(options)], [new DirectiveMetadataLinker()], - [new BindGenerator(options)], [ new TemplateCompiler(options), new StylesheetCompiler(), diff --git a/modules_dart/transform/test/transform/bind_generator/all_tests.dart b/modules_dart/transform/test/transform/bind_generator/all_tests.dart deleted file mode 100644 index ce4166c0ed..0000000000 --- a/modules_dart/transform/test/transform/bind_generator/all_tests.dart +++ /dev/null @@ -1,58 +0,0 @@ -library angular2.test.transform.bind_generator.all_tests; - -import 'package:barback/barback.dart'; -import 'package:angular2/src/transform/bind_generator/generator.dart'; -import 'package:dart_style/dart_style.dart'; -import 'package:guinness/guinness.dart'; - -import '../common/read_file.dart'; - -var formatter = new DartFormatter(); - -main() => allTests(); - -void allTests() { - var reader = new TestAssetReader(); - - it('should generate setters for queries defined in the class annotation.', - () async { - var inputPath = 'queries_class_annotation_files/bar.ng_deps.dart'; - var expected = - _readFile('queries_class_annotation_files/expected/bar.ng_deps.dart'); - - var output = formatter - .format(await createNgSettersAndGetters(reader, _assetId(inputPath))); - expect(output).toEqual(expected); - }); - - it('should generate setters for queries defined via prop annotations.', - () async { - var inputPath = 'queries_prop_annotations_files/bar.ng_deps.dart'; - var expected = - _readFile('queries_prop_annotations_files/expected/bar.ng_deps.dart'); - - var output = formatter - .format(await createNgSettersAndGetters(reader, _assetId(inputPath))); - expect(output).toEqual(expected); - }); - - it('should gracefully handle const objects as prop annotations.', () async { - var inputPath = 'queries_override_annotation_files/bar.ng_deps.dart'; - var expected = formatter.format(_readFile( - 'queries_override_annotation_files/expected/bar.ng_deps.dart')); - - var output = formatter - .format(await createNgSettersAndGetters(reader, _assetId(inputPath))); - expect(output).toEqual(expected); - }); -} - -AssetId _assetId(String path) => new AssetId('a', 'bind_generator/$path'); - -String _readFile(String path) { - var code = readFile('bind_generator/$path'); - if (path.endsWith('.dart')) { - code = formatter.format(code); - } - return code; -} diff --git a/modules_dart/transform/test/transform/bind_generator/queries_class_annotation_files/bar.ng_deps.dart b/modules_dart/transform/test/transform/bind_generator/queries_class_annotation_files/bar.ng_deps.dart deleted file mode 100644 index 6f6f45c16e..0000000000 --- a/modules_dart/transform/test/transform/bind_generator/queries_class_annotation_files/bar.ng_deps.dart +++ /dev/null @@ -1,18 +0,0 @@ -library bar.ng_deps.dart; - -import 'bar.dart'; -import 'package:angular2/src/core/metadata.dart'; - -var _visited = false; -void initReflector(reflector) { - if (_visited) return; - _visited = true; - reflector - ..registerType( - ToolTip, - new ReflectionInfo(const [ - const Directive( - selector: '[tool-tip]', - queries: const {'queryField': const ContentChild('child')}) - ], const [], () => new ToolTip())); -} diff --git a/modules_dart/transform/test/transform/bind_generator/queries_class_annotation_files/expected/bar.ng_deps.dart b/modules_dart/transform/test/transform/bind_generator/queries_class_annotation_files/expected/bar.ng_deps.dart deleted file mode 100644 index 555fbd6ff1..0000000000 --- a/modules_dart/transform/test/transform/bind_generator/queries_class_annotation_files/expected/bar.ng_deps.dart +++ /dev/null @@ -1,19 +0,0 @@ -library bar.ng_deps.dart; - -import 'bar.dart'; -import 'package:angular2/src/core/metadata.dart'; - -var _visited = false; -void initReflector(reflector) { - if (_visited) return; - _visited = true; - reflector - ..registerType( - ToolTip, - new ReflectionInfo(const [ - const Directive( - selector: '[tool-tip]', - queries: const {'queryField': const ContentChild('child')}) - ], const [], () => new ToolTip())) - ..registerSetters({'queryField': (o, v) => o.queryField = v}); -} diff --git a/modules_dart/transform/test/transform/bind_generator/queries_override_annotation_files/bar.ng_deps.dart b/modules_dart/transform/test/transform/bind_generator/queries_override_annotation_files/bar.ng_deps.dart deleted file mode 100644 index b15e446d47..0000000000 --- a/modules_dart/transform/test/transform/bind_generator/queries_override_annotation_files/bar.ng_deps.dart +++ /dev/null @@ -1,21 +0,0 @@ -library bar.ng_deps.dart; - -import 'bar.dart'; -import 'package:angular2/src/core/metadata.dart'; - -var _visited = false; -void initReflector(reflector) { - if (_visited) return; - _visited = true; - reflector - ..registerType( - ToolTip, - new ReflectionInfo( - const [const Directive(selector: '[tool-tip]')], - const [], - () => new ToolTip(), - null, - const { - 'queryField': const [override] - })); -} diff --git a/modules_dart/transform/test/transform/bind_generator/queries_override_annotation_files/expected/bar.ng_deps.dart b/modules_dart/transform/test/transform/bind_generator/queries_override_annotation_files/expected/bar.ng_deps.dart deleted file mode 100644 index b15e446d47..0000000000 --- a/modules_dart/transform/test/transform/bind_generator/queries_override_annotation_files/expected/bar.ng_deps.dart +++ /dev/null @@ -1,21 +0,0 @@ -library bar.ng_deps.dart; - -import 'bar.dart'; -import 'package:angular2/src/core/metadata.dart'; - -var _visited = false; -void initReflector(reflector) { - if (_visited) return; - _visited = true; - reflector - ..registerType( - ToolTip, - new ReflectionInfo( - const [const Directive(selector: '[tool-tip]')], - const [], - () => new ToolTip(), - null, - const { - 'queryField': const [override] - })); -} diff --git a/modules_dart/transform/test/transform/bind_generator/queries_prop_annotations_files/bar.ng_deps.dart b/modules_dart/transform/test/transform/bind_generator/queries_prop_annotations_files/bar.ng_deps.dart deleted file mode 100644 index 478acb2e1d..0000000000 --- a/modules_dart/transform/test/transform/bind_generator/queries_prop_annotations_files/bar.ng_deps.dart +++ /dev/null @@ -1,21 +0,0 @@ -library bar.ng_deps.dart; - -import 'bar.dart'; -import 'package:angular2/src/core/metadata.dart'; - -var _visited = false; -void initReflector(reflector) { - if (_visited) return; - _visited = true; - reflector - ..registerType( - ToolTip, - new ReflectionInfo( - const [const Directive(selector: '[tool-tip]')], - const [], - () => new ToolTip(), - null, - const { - 'queryField': const [const ContentChild('child')] - })); -} diff --git a/modules_dart/transform/test/transform/bind_generator/queries_prop_annotations_files/expected/bar.ng_deps.dart b/modules_dart/transform/test/transform/bind_generator/queries_prop_annotations_files/expected/bar.ng_deps.dart deleted file mode 100644 index 1b16d58b8f..0000000000 --- a/modules_dart/transform/test/transform/bind_generator/queries_prop_annotations_files/expected/bar.ng_deps.dart +++ /dev/null @@ -1,22 +0,0 @@ -library bar.ng_deps.dart; - -import 'bar.dart'; -import 'package:angular2/src/core/metadata.dart'; - -var _visited = false; -void initReflector(reflector) { - if (_visited) return; - _visited = true; - reflector - ..registerType( - ToolTip, - new ReflectionInfo( - const [const Directive(selector: '[tool-tip]')], - const [], - () => new ToolTip(), - null, - const { - 'queryField': const [const ContentChild('child')] - })) - ..registerSetters({'queryField': (o, v) => o.queryField = v}); -} diff --git a/modules_dart/transform/test/transform/transform.server.spec.dart b/modules_dart/transform/test/transform/transform.server.spec.dart index efeb1d3896..4851717964 100644 --- a/modules_dart/transform/test/transform/transform.server.spec.dart +++ b/modules_dart/transform/test/transform/transform.server.spec.dart @@ -8,7 +8,6 @@ import 'common/async_string_writer_tests.dart' as asyncStringWriter; import 'common/code/ng_deps_code_tests.dart' as ngDepsCode; import 'common/ng_meta_test.dart' as ngMetaTest; import 'common/url_resolver_tests.dart' as urlResolver; -import 'bind_generator/all_tests.dart' as bindGenerator; import 'deferred_rewriter/all_tests.dart' as deferredRewriter; import 'directive_metadata_linker/all_tests.dart' as directiveMeta; import 'directive_processor/all_tests.dart' as directiveProcessor; @@ -23,7 +22,6 @@ main() { describe('AsyncStringWriter', asyncStringWriter.allTests); describe('NgDepsCode', ngDepsCode.allTests); describe('NgMeta', ngMetaTest.allTests); - describe('Bind Generator', bindGenerator.allTests); describe('Directive Metadata Linker', directiveMeta.allTests); describe('Directive Processor', directiveProcessor.allTests); describe('Inliner For Test', inliner.allTests);