fix(transformer): Loggers now are per zone and each transform runs in its own zone
This commit is contained in:
@ -15,7 +15,7 @@ Future<String> createNgSettersAndGetters(
|
||||
|
||||
String code = ngDeps.code;
|
||||
var setters = _generateSetters(_createPropertiesMap(ngDeps));
|
||||
var getters = _generateGetters( _createEventPropertiesList(ngDeps));
|
||||
var getters = _generateGetters(_createEventPropertiesList(ngDeps));
|
||||
|
||||
if (setters.isEmpty && getters.isEmpty) return code;
|
||||
var out = new StringBuffer();
|
||||
@ -97,7 +97,7 @@ List<String> _generateGetters(List<String> eventProperties) {
|
||||
|
||||
/// Collapses all `events` in {@link ngDeps} into a list of corresponding
|
||||
/// property names.
|
||||
List<String> _createEventPropertiesList(NgDeps ngDeps) {
|
||||
List<String> _createEventPropertiesList(NgDeps ngDeps) {
|
||||
var visitor = new ExtractNamedExpressionVisitor('events');
|
||||
var propertyNames = [];
|
||||
ngDeps.registeredTypes.forEach((RegisteredType t) {
|
||||
|
@ -26,18 +26,12 @@ class BindGenerator extends Transformer {
|
||||
|
||||
@override
|
||||
Future apply(Transform transform) async {
|
||||
log.init(transform);
|
||||
|
||||
try {
|
||||
await log.initZoned(transform, () async {
|
||||
var id = transform.primaryInput.id;
|
||||
var reader = new AssetReader.fromTransform(transform);
|
||||
var transformedCode = await createNgSettersAndGetters(reader, id);
|
||||
transform.addOutput(new Asset.fromString(
|
||||
id, formatter.format(transformedCode, uri: id.path)));
|
||||
} catch (ex, stackTrace) {
|
||||
log.logger.error('Creating ng setters/getters failed.\n'
|
||||
'Exception: $ex\n'
|
||||
'Stack Trace: $stackTrace');
|
||||
}
|
||||
}, errorMessage: 'Creating ng setters/getters failed.');
|
||||
}
|
||||
}
|
||||
|
@ -88,7 +88,7 @@ class AnnotationMatcher extends ClassMatcherBase {
|
||||
throw 'Unable to locate descriptor for ${annotation.name} in ${assetId}';
|
||||
}
|
||||
return implements(descriptor, interfaces,
|
||||
missingSuperClassWarning: 'Missing `custom_annotation` entry for `${descriptor.superClass}`.');
|
||||
missingSuperClassWarning: 'Missing `custom_annotation` entry for `${descriptor.superClass}`.');
|
||||
}
|
||||
|
||||
/// Checks if an [Annotation] node implements [Injectable].
|
||||
|
@ -5,24 +5,27 @@ import 'package:barback/barback.dart';
|
||||
import 'package:code_transformers/messages/build_logger.dart';
|
||||
import 'package:source_span/source_span.dart';
|
||||
|
||||
BuildLogger _logger;
|
||||
typedef _SimpleCallback();
|
||||
|
||||
/// Prepares {@link logger} for use throughout the transformer.
|
||||
void init(Transform t) {
|
||||
_logger = new BuildLogger(t);
|
||||
}
|
||||
// The key used to store the logger on the current zone.
|
||||
final _key = #loggingZonedLoggerKey;
|
||||
|
||||
/// Sets {@link logger} directly. Used for testing - in general use {@link init}.
|
||||
void setLogger(BuildLogger logger) {
|
||||
_logger = logger;
|
||||
}
|
||||
/// Executes {@link fn} inside a new {@link Zone} with its own logger.
|
||||
dynamic initZoned(Transform t, _SimpleCallback fn, {String errorMessage: ''}) =>
|
||||
setZoned(new BuildLogger(t), fn, errorMessage: errorMessage);
|
||||
|
||||
/// The logger the transformer should use for messaging.
|
||||
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');
|
||||
});
|
||||
|
||||
/// The logger for the current {@link Zone}.
|
||||
BuildLogger get logger {
|
||||
if (_logger == null) {
|
||||
_logger = new PrintLogger();
|
||||
}
|
||||
return _logger;
|
||||
var current = Zone.current[_key] as BuildLogger;
|
||||
return current == null ? new PrintLogger() : current;
|
||||
}
|
||||
|
||||
class PrintLogger implements BuildLogger {
|
||||
|
@ -24,9 +24,7 @@ class DeferredRewriter extends Transformer {
|
||||
|
||||
@override
|
||||
Future apply(Transform transform) async {
|
||||
log.init(transform);
|
||||
|
||||
try {
|
||||
await log.initZoned(transform, () async {
|
||||
var asset = transform.primaryInput;
|
||||
var reader = new AssetReader.fromTransform(transform);
|
||||
var transformedCode = await rewriteDeferredLibraries(reader, asset.id);
|
||||
@ -34,11 +32,7 @@ class DeferredRewriter extends Transformer {
|
||||
transform.addOutput(
|
||||
new Asset.fromString(transform.primaryInput.id, transformedCode));
|
||||
}
|
||||
} catch (ex, stackTrace) {
|
||||
log.logger.warning('Rewritting deferred libraries failed.\n'
|
||||
'Exception: $ex\n'
|
||||
'Stack Trace: $stackTrace');
|
||||
}
|
||||
}, errorMessage: 'Rewritting deferred libraries failed.');
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -22,9 +22,7 @@ class DirectiveLinker extends Transformer {
|
||||
|
||||
@override
|
||||
Future apply(Transform transform) async {
|
||||
log.init(transform);
|
||||
|
||||
try {
|
||||
await log.initZoned(transform, () async {
|
||||
var reader = new AssetReader.fromTransform(transform);
|
||||
var assetId = transform.primaryInput.id;
|
||||
var assetPath = assetId.path;
|
||||
@ -33,12 +31,7 @@ class DirectiveLinker extends Transformer {
|
||||
var formattedCode = formatter.format(transformedCode, uri: assetPath);
|
||||
transform.addOutput(new Asset.fromString(assetId, formattedCode));
|
||||
}
|
||||
} catch (ex, stackTrace) {
|
||||
log.logger.error('Linking ng directives failed.\n'
|
||||
'Exception: $ex\n'
|
||||
'Stack Trace: $stackTrace');
|
||||
}
|
||||
return null;
|
||||
}, errorMessage: 'Linking ng directives failed.');
|
||||
}
|
||||
}
|
||||
|
||||
@ -52,18 +45,11 @@ class EmptyNgDepsRemover extends Transformer {
|
||||
|
||||
@override
|
||||
Future apply(Transform transform) async {
|
||||
log.init(transform);
|
||||
|
||||
try {
|
||||
await log.initZoned(transform, () async {
|
||||
var reader = new AssetReader.fromTransform(transform);
|
||||
if (!(await isNecessary(reader, transform.primaryInput.id))) {
|
||||
transform.consumePrimary();
|
||||
}
|
||||
} catch (ex, stackTrace) {
|
||||
log.logger.error('Removing unnecessary ng deps failed.\n'
|
||||
'Exception: $ex\n'
|
||||
'Stack Trace: $stackTrace');
|
||||
}
|
||||
return null;
|
||||
}, errorMessage: 'Removing unnecessary ng deps failed.');
|
||||
}
|
||||
}
|
||||
|
@ -25,9 +25,7 @@ class DirectiveMetadataExtractor extends Transformer {
|
||||
|
||||
@override
|
||||
Future apply(Transform transform) async {
|
||||
log.init(transform);
|
||||
|
||||
try {
|
||||
await log.initZoned(transform, () async {
|
||||
var reader = new AssetReader.fromTransform(transform);
|
||||
var fromAssetId = transform.primaryInput.id;
|
||||
|
||||
@ -40,12 +38,7 @@ class DirectiveMetadataExtractor extends Transformer {
|
||||
transform.addOutput(new Asset.fromString(
|
||||
_outputAssetId(fromAssetId), _encoder.convert(jsonMap)));
|
||||
}
|
||||
} catch (ex, stackTrace) {
|
||||
log.logger.error('Extracting ng metadata failed.\n'
|
||||
'Exception: $ex\n'
|
||||
'Stack Trace: $stackTrace');
|
||||
}
|
||||
return null;
|
||||
}, errorMessage: 'Extracting ng metadata failed.');
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -29,9 +29,7 @@ class DirectiveProcessor extends Transformer {
|
||||
|
||||
@override
|
||||
Future apply(Transform transform) async {
|
||||
log.init(transform);
|
||||
|
||||
try {
|
||||
await log.initZoned(transform, () async {
|
||||
var asset = transform.primaryInput;
|
||||
var reader = new AssetReader.fromTransform(transform);
|
||||
var ngDepsSrc = await createNgDeps(
|
||||
@ -46,10 +44,6 @@ class DirectiveProcessor extends Transformer {
|
||||
}
|
||||
transform.addOutput(new Asset.fromString(ngDepsAssetId, ngDepsSrc));
|
||||
}
|
||||
} catch (ex, stackTrace) {
|
||||
log.logger.warning('Processing ng directives failed.\n'
|
||||
'Exception: $ex\n'
|
||||
'Stack Trace: $stackTrace');
|
||||
}
|
||||
}, errorMessage: 'Processing ng directives failed.');
|
||||
}
|
||||
}
|
||||
|
@ -45,8 +45,7 @@ class Rewriter {
|
||||
///
|
||||
/// This breaks our dependency on dart:mirrors, which enables smaller code
|
||||
/// size and better performance.
|
||||
class _RewriterVisitor extends Object
|
||||
with RecursiveAstVisitor<Object> {
|
||||
class _RewriterVisitor extends Object with RecursiveAstVisitor<Object> {
|
||||
final Rewriter _rewriter;
|
||||
final buf = new StringBuffer();
|
||||
final reflectionCapabilityAssignments = [];
|
||||
|
@ -30,9 +30,7 @@ class ReflectionRemover extends Transformer {
|
||||
|
||||
@override
|
||||
Future apply(Transform transform) async {
|
||||
log.init(transform);
|
||||
|
||||
try {
|
||||
await log.initZoned(transform, () async {
|
||||
var newEntryPoints = options.entryPoints.map((entryPoint) {
|
||||
return new AssetId(transform.primaryInput.id.package, entryPoint)
|
||||
.changeExtension(DEPS_EXTENSION);
|
||||
@ -54,10 +52,6 @@ class ReflectionRemover extends Transformer {
|
||||
mirrorMode: mirrorMode, writeStaticInit: writeStaticInit);
|
||||
transform.addOutput(
|
||||
new Asset.fromString(transform.primaryInput.id, transformedCode));
|
||||
} catch (ex, stackTrace) {
|
||||
log.logger.error('Removing reflection failed.\n'
|
||||
'Exception: $ex\n'
|
||||
'Stack Trace: $stackTrace');
|
||||
}
|
||||
}, errorMessage: 'Removing reflection failed.');
|
||||
}
|
||||
}
|
||||
|
@ -28,19 +28,13 @@ class TemplateCompiler extends Transformer {
|
||||
|
||||
@override
|
||||
Future apply(Transform transform) async {
|
||||
log.init(transform);
|
||||
|
||||
try {
|
||||
await log.initZoned(transform, () async {
|
||||
Html5LibDomAdapter.makeCurrent();
|
||||
var id = transform.primaryInput.id;
|
||||
var reader = new AssetReader.fromTransform(transform);
|
||||
var transformedCode = formatter.format(await processTemplates(reader, id,
|
||||
generateChangeDetectors: options.generateChangeDetectors));
|
||||
transform.addOutput(new Asset.fromString(id, transformedCode));
|
||||
} catch (ex, stackTrace) {
|
||||
log.logger.error('Parsing ng templates failed.\n'
|
||||
'Exception: $ex\n'
|
||||
'Stack Trace: $stackTrace');
|
||||
}
|
||||
}, errorMessage: 'Parsing ng templates failed.');
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user