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.
This commit is contained in:
parent
c91fc49d01
commit
563a76304a
|
@ -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<Object> {
|
||||
final ConstantEvaluator _evaluator = new ConstantEvaluator();
|
||||
final List<String> 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<Object> {
|
||||
final ConstantEvaluator _evaluator = new ConstantEvaluator();
|
||||
final List<String> 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<String> 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<String> _generateSetters(Map<String, String> 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;
|
||||
}
|
|
@ -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)));
|
||||
});
|
||||
}
|
||||
}
|
|
@ -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<ImportDirective> imports = [];
|
||||
final List<ExportDirective> exports = [];
|
||||
final List<RegisteredType> registeredTypes = [];
|
||||
LibraryDirective lib = null;
|
||||
FunctionDeclaration setupMethod = null;
|
||||
|
||||
static _ParseNgDepsVisitor _visitor = new _ParseNgDepsVisitor();
|
||||
|
||||
/// Parses only the `.ng_deps.dart` file represented by `id`.
|
||||
static Future<NgDeps> 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<Object> {
|
||||
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);
|
||||
}
|
||||
}
|
|
@ -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<Object> {
|
||||
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;
|
||||
}
|
||||
}
|
|
@ -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(),
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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()));
|
||||
}
|
|
@ -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});
|
||||
}
|
|
@ -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]
|
||||
}));
|
||||
}
|
|
@ -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]
|
||||
}));
|
||||
}
|
|
@ -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')]
|
||||
}));
|
||||
}
|
|
@ -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});
|
||||
}
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue