chore(transformer): Use class for reflection info instead of a map

closes https://github.com/angular/angular/issues/906
This commit is contained in:
Jacob MacDonald
2015-07-23 15:18:30 -07:00
parent a8b75c3d41
commit 5b5de6662f
95 changed files with 550 additions and 890 deletions
@@ -15,12 +15,17 @@ dynamic initZoned(Transform t, _SimpleCallback fn, {String errorMessage: ''}) =>
setZoned(new BuildLogger(t), fn, errorMessage: errorMessage);
dynamic setZoned(BuildLogger logger, _SimpleCallback fn,
{String errorMessage: ''}) => runZoned(fn,
zoneValues: {_key: logger}, onError: (e, stackTrace) {
logger.error('$errorMessage\n'
'Exception: $e\n'
'Stack Trace: $stackTrace');
});
{String errorMessage}) {
var onError;
if (errorMessage != null) {
onError = (e, stackTrace) {
logger.error('$errorMessage\n'
'Exception: $e\n'
'Stack Trace: $stackTrace');
};
}
return runZoned(fn, zoneValues: {_key: logger}, onError: onError);
}
/// The logger for the current {@link Zone}.
BuildLogger get logger {
@@ -63,26 +63,22 @@ class _ParseRegisterTypeVisitor extends Object
typeName = node.argumentList.arguments[0] is Identifier
? node.argumentList.arguments[0]
: null;
return super.visitMethodInvocation(node);
}
@override
Object visitMapLiteralEntry(MapLiteralEntry node) {
if (node.key is StringLiteral) {
var key = stringLiteralToString(node.key);
switch (key) {
case 'annotations':
annotations = node.value;
break;
case 'factory':
factoryFn = node.value;
break;
case 'parameters':
parameters = node.value;
break;
// The second argument to a `registerType` call is the RegistrationInfo
// object creation.
var 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;
}
}
// Do not need to descend any further.
return null;
}
}
@@ -30,14 +30,9 @@ Future<String> createNgDeps(AssetReader reader, AssetId assetId,
// TODO(kegluneq): Shortcut if we can determine that there are no
// [Directive]s present, taking into account `export`s.
var writer = new AsyncStringWriter();
var visitor = new CreateNgDepsVisitor(
writer,
assetId,
new XhrImpl(reader, assetId),
annotationMatcher,
_interfaceMatcher,
ngMeta,
inlineViews: inlineViews);
var visitor = new CreateNgDepsVisitor(writer, assetId,
new XhrImpl(reader, assetId), annotationMatcher, _interfaceMatcher,
ngMeta, inlineViews: inlineViews);
var code = await reader.readAsString(assetId);
parseCompilationUnit(code, name: assetId.path).accept(visitor);
@@ -81,14 +76,9 @@ class CreateNgDepsVisitor extends Object with SimpleAstVisitor<Object> {
/// The assetId for the file which we are parsing.
final AssetId assetId;
CreateNgDepsVisitor(
AsyncStringWriter writer,
AssetId assetId,
XHR xhr,
AnnotationMatcher annotationMatcher,
InterfaceMatcher interfaceMatcher,
this.ngMeta,
{bool inlineViews})
CreateNgDepsVisitor(AsyncStringWriter writer, AssetId assetId, XHR xhr,
AnnotationMatcher annotationMatcher, InterfaceMatcher interfaceMatcher,
this.ngMeta, {bool inlineViews})
: writer = writer,
_copyVisitor = new ToSourceVisitor(writer),
_factoryVisitor = new FactoryTransformVisitor(writer),
@@ -215,31 +205,31 @@ class CreateNgDepsVisitor extends Object with SimpleAstVisitor<Object> {
_maybeWriteReflector();
writer.print('..registerType(');
node.name.accept(this);
writer.print(''', {'factory': ''');
if (ctor == null) {
_generateEmptyFactory(node.name.toString());
} else {
ctor.accept(_factoryVisitor);
}
writer.print(''', 'parameters': ''');
writer.print(', new ${_REF_PREFIX}.ReflectionInfo(');
node.accept(_metaVisitor);
writer.print(', ');
if (ctor == null) {
_generateEmptyParams();
} else {
ctor.accept(_paramsVisitor);
}
writer.print(''', 'annotations': ''');
node.accept(_metaVisitor);
writer.print(', ');
if (ctor == null) {
_generateEmptyFactory(node.name.toString());
} else {
ctor.accept(_factoryVisitor);
}
if (node.implementsClause != null &&
node.implementsClause.interfaces != null &&
node.implementsClause.interfaces.isNotEmpty) {
writer
..print(''', 'interfaces': const [''')
..print(', const [')
..print(node.implementsClause.interfaces
.map((interface) => interface.name)
.join(', '))
..print(']');
}
writer.print('})');
writer.print('))');
return null;
}
@@ -307,11 +297,11 @@ class CreateNgDepsVisitor extends Object with SimpleAstVisitor<Object> {
_maybeWriteReflector();
writer.print('..registerFunction(');
node.name.accept(this);
writer.print(''', {'parameters': const [''');
node.functionExpression.parameters.accept(_paramsVisitor);
writer.print('''], 'annotations': ''');
writer.print(', new ${_REF_PREFIX}.ReflectionInfo(');
node.metadata.accept(_metaVisitor);
writer.print('})');
writer.print(', const [');
node.functionExpression.parameters.accept(_paramsVisitor);
writer.print(']))');
return null;
}