| Index: lib/transformer.dart
|
| diff --git a/lib/transformer.dart b/lib/transformer.dart
|
| index 76cc98c57f47aa4a4b1a7ed9a4f0fb9fc1450788..caae7a697a5198c06de41e91977491290442cb02 100644
|
| --- a/lib/transformer.dart
|
| +++ b/lib/transformer.dart
|
| @@ -62,8 +62,8 @@ class InitializeTransformer extends Transformer {
|
| var document = parse(html);
|
| var originalDartFile =
|
| _findMainScript(document, transform.primaryInput.id, transform);
|
| - return _buildBootstrapFile(transform, primaryId: originalDartFile).then(
|
| - (AssetId newDartFile) {
|
| + return _buildBootstrapFile(transform, primaryId: originalDartFile)
|
| + .then((AssetId newDartFile) {
|
| return _replaceEntryWithBootstrap(transform, document,
|
| transform.primaryInput.id, originalDartFile, newDartFile);
|
| });
|
| @@ -233,8 +233,21 @@ class _BootstrapFileBuilder {
|
|
|
| bool _readAnnotations(Element element) {
|
| var found = false;
|
| - element.metadata.where((ElementAnnotation meta) {
|
| + if (element.metadata.isEmpty) return found;
|
| +
|
| + var metaNodes;
|
| + var node = element.node;
|
| + if (node is SimpleIdentifier && node.parent is LibraryIdentifier) {
|
| + metaNodes = node.parent.parent.metadata;
|
| + } else if (node is ClassDeclaration || node is FunctionDeclaration) {
|
| + metaNodes = node.metadata;
|
| + } else {
|
| + return found;
|
| + }
|
| +
|
| + metaNodes.where((Annotation metaNode) {
|
| // First filter out anything that is not a Initializer.
|
| + var meta = metaNode.elementAnnotation;
|
| var e = meta.element;
|
| if (e is PropertyAccessorElement) {
|
| return _isInitializer(e.variable.evaluationResult.value.type);
|
| @@ -242,12 +255,14 @@ class _BootstrapFileBuilder {
|
| return _isInitializer(e.returnType);
|
| }
|
| return false;
|
| - }).where((ElementAnnotation meta) {
|
| + }).where((Annotation metaNode) {
|
| + var meta = metaNode.elementAnnotation;
|
| _seenAnnotations.putIfAbsent(element, () => new Set<ElementAnnotation>());
|
| return !_seenAnnotations[element].contains(meta);
|
| - }).forEach((ElementAnnotation meta) {
|
| + }).forEach((Annotation metaNode) {
|
| + var meta = metaNode.elementAnnotation;
|
| _seenAnnotations[element].add(meta);
|
| - _initQueue.addLast(new InitializerData._(element, meta));
|
| + _initQueue.addLast(new InitializerData._(node, metaNode));
|
| found = true;
|
| });
|
| return found;
|
| @@ -310,8 +325,8 @@ $initializersBuffer
|
| _logger.error("Can't import `${id}` from `${_newEntryPoint}`");
|
| } else if (path.url.split(id.path)[0] ==
|
| path.url.split(_newEntryPoint.path)[0]) {
|
| - var relativePath = path.url.relative(
|
| - id.path, from: path.url.dirname(_newEntryPoint.path));
|
| + var relativePath = path.url.relative(id.path,
|
| + from: path.url.dirname(_newEntryPoint.path));
|
| buffer.write("import '${relativePath}'");
|
| } else {
|
| _logger.error("Can't import `${id}` from `${_newEntryPoint}`");
|
| @@ -388,71 +403,59 @@ $initializersBuffer
|
| return (new List.from(library.imports)
|
| ..addAll(library.exports)
|
| ..sort((a, b) {
|
| - // dart: imports don't have a uri
|
| - if (a.uri == null && b.uri != null) return -1;
|
| - if (b.uri == null && a.uri != null) return 1;
|
| - if (a.uri == null && b.uri == null) {
|
| - return getLibrary(a).name.compareTo(getLibrary(b).name);
|
| - }
|
| + // dart: imports don't have a uri
|
| + if (a.uri == null && b.uri != null) return -1;
|
| + if (b.uri == null && a.uri != null) return 1;
|
| + if (a.uri == null && b.uri == null) {
|
| + return getLibrary(a).name.compareTo(getLibrary(b).name);
|
| + }
|
|
|
| - // package: imports next
|
| - var aIsPackage = a.uri.startsWith('package:');
|
| - var bIsPackage = b.uri.startsWith('package:');
|
| - if (aIsPackage && !bIsPackage) {
|
| - return -1;
|
| - } else if (bIsPackage && !aIsPackage) {
|
| - return 1;
|
| - } else if (bIsPackage && aIsPackage) {
|
| - return a.uri.compareTo(b.uri);
|
| - }
|
| + // package: imports next
|
| + var aIsPackage = a.uri.startsWith('package:');
|
| + var bIsPackage = b.uri.startsWith('package:');
|
| + if (aIsPackage && !bIsPackage) {
|
| + return -1;
|
| + } else if (bIsPackage && !aIsPackage) {
|
| + return 1;
|
| + } else if (bIsPackage && aIsPackage) {
|
| + return a.uri.compareTo(b.uri);
|
| + }
|
|
|
| - // And finally compare based on the relative uri if both are file paths.
|
| - var aUri = path.url.relative(a.source.uri.path,
|
| - from: path.url.dirname(library.source.uri.path));
|
| - var bUri = path.url.relative(b.source.uri.path,
|
| - from: path.url.dirname(library.source.uri.path));
|
| - return aUri.compareTo(bUri);
|
| - })).map(getLibrary);
|
| + // And finally compare based on the relative uri if both are file paths.
|
| + var aUri = path.url.relative(a.source.uri.path,
|
| + from: path.url.dirname(library.source.uri.path));
|
| + var bUri = path.url.relative(b.source.uri.path,
|
| + from: path.url.dirname(library.source.uri.path));
|
| + return aUri.compareTo(bUri);
|
| + })).map(getLibrary);
|
| }
|
| }
|
|
|
| /// An [Initializer] annotation and the target of that annotation.
|
| class InitializerData {
|
| - /// The target [Element] of the annotation.
|
| - final Element targetElement;
|
| -
|
| - /// The [ElementAnnotation] representing the annotation itself.
|
| - final ElementAnnotation annotationElement;
|
| -
|
| - AstNode _targetNode;
|
| -
|
| /// The target [AstNode] of the annotation.
|
| - // TODO(jakemac): We at least cache this for now, but ideally `targetElement`
|
| - // would actually be the getter, and `targetNode` would be the property.
|
| - AstNode get targetNode {
|
| - if (_targetNode == null) _targetNode = targetElement.node;
|
| - return _targetNode;
|
| - }
|
| + final AstNode targetNode;
|
|
|
| /// The [Annotation] representing the annotation itself.
|
| - Annotation get annotationNode {
|
| - var annotatedNode;
|
| + final Annotation annotationNode;
|
| +
|
| + /// The [ElementAnnotation] representing the annotation itself.
|
| + ElementAnnotation get annotationElement => annotationNode.elementAnnotation;
|
| +
|
| + /// The target [Element] of the annotation.
|
| + Element get targetElement {
|
| if (targetNode is SimpleIdentifier &&
|
| targetNode.parent is LibraryIdentifier) {
|
| - annotatedNode = targetNode.parent.parent;
|
| + return targetNode.parent.parent.element;
|
| } else if (targetNode is ClassDeclaration ||
|
| targetNode is FunctionDeclaration) {
|
| - annotatedNode = targetNode;
|
| + return targetNode.element;
|
| } else {
|
| return null;
|
| }
|
| - if (annotatedNode is! AnnotatedNode) return null;
|
| - var astMeta = annotatedNode.metadata;
|
| -
|
| - return astMeta.firstWhere((m) => m.elementAnnotation == annotationElement);
|
| }
|
|
|
| - InitializerData._(this.targetElement, this.annotationElement);
|
| + InitializerData._(this.targetNode, this.annotationNode);
|
| }
|
|
|
| // Reads a file list from a barback settings configuration field.
|
|
|