make sure we follow the whole super chain
R=sigmund@google.com
Review URL: https://codereview.chromium.org//1006513003
diff --git a/.status b/.status
index 5fc034b..9f3adba 100644
--- a/.status
+++ b/.status
@@ -22,6 +22,7 @@
build/test/initializer_cycle_error_test: Skip
build/test/initializer_test: Skip
build/test/initializer_parts_test: Skip
+build/test/initializer_super_test: Skip
build/test/initializer_type_filter_test: Skip
build/test/init_method_test: Skip
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0282c7c..0bb8b00 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.5.1+8
+* Make sure to crawl the entire supertype chain for annotations, and run them
+in reverse order.
+
## 0.5.1+7
* Change to source order-crawling of directives instead of alphabetical. The one
diff --git a/lib/src/mirror_loader.dart b/lib/src/mirror_loader.dart
index 1caf144..c847215 100644
--- a/lib/src/mirror_loader.dart
+++ b/lib/src/mirror_loader.dart
@@ -126,12 +126,10 @@
Iterable<DeclarationMirror> _sortedDeclarationsWithMetadata(
LibraryMirror lib) {
return new List()
- ..addAll(_sortDeclarations(
- lib, lib.declarations.values.where(
- (d) => d is MethodMirror && d.metadata.isNotEmpty)))
- ..addAll(_sortDeclarations(
- lib, lib.declarations.values.where(
- (d) => d is ClassMirror && d.metadata.isNotEmpty)));
+ ..addAll(_sortDeclarations(lib, lib.declarations.values
+ .where((d) => d is MethodMirror && d.metadata.isNotEmpty)))
+ ..addAll(_sortDeclarations(lib, lib.declarations.values
+ .where((d) => d is ClassMirror && d.metadata.isNotEmpty)));
}
List<DeclarationMirror> _sortDeclarations(
diff --git a/lib/transformer.dart b/lib/transformer.dart
index 8fec4b7..078c34d 100644
--- a/lib/transformer.dart
+++ b/lib/transformer.dart
@@ -215,8 +215,9 @@
_readAnnotations(method);
}
for (var clazz in _classesOfLibrary(library, seen)) {
- var superClass = clazz.supertype;
- while (superClass != null) {
+ readSuperClassAnnotations(InterfaceType superClass) {
+ if (superClass == null) return;
+ readSuperClassAnnotations(superClass.superclass);
if (_readAnnotations(superClass.element) &&
superClass.element.library != clazz.library) {
_logger.warning(
@@ -225,8 +226,8 @@
'${superClass.name} has a dependency on this library '
'(possibly transitive).');
}
- superClass = superClass.superclass;
}
+ readSuperClassAnnotations(clazz.supertype);
_readAnnotations(clazz);
}
}
diff --git a/pubspec.yaml b/pubspec.yaml
index c2dc506..cf8226b 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
name: initialize
-version: 0.5.1+7
+version: 0.5.1+8
author: Polymer.dart Authors <web@dartlang.org>
description: Generic building blocks for doing static initialization.
homepage: https://github.com/dart-lang/initialize
@@ -26,6 +26,7 @@
- test/deferred_library_test.dart
- test/initializer_test.dart
- test/initializer_parts_test.dart
+ - test/initializer_super_test.dart
- test/initializer_cycle_error_test.dart
- test/initializer_custom_filter_test.dart
- test/initializer_type_filter_test.dart
diff --git a/test/initializer_parts_test.dart b/test/initializer_parts_test.dart
index bfba5e8..fc77886 100644
--- a/test/initializer_parts_test.dart
+++ b/test/initializer_parts_test.dart
@@ -19,7 +19,8 @@
run().then((_) {
test('parts', () {
var expectedNames = [
- const LibraryIdentifier(#initialize.initializer_parts_test, null, 'initializer_parts_test.dart'),
+ const LibraryIdentifier(#initialize.initializer_parts_test, null,
+ 'initializer_parts_test.dart'),
bar2,
bar,
foo,
diff --git a/test/initializer_super_test.dart b/test/initializer_super_test.dart
new file mode 100644
index 0000000..66e6e76
--- /dev/null
+++ b/test/initializer_super_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+library initialize.initializer_super_test;
+
+import 'package:initialize/src/initialize_tracker.dart';
+import 'package:initialize/initialize.dart';
+import 'package:unittest/unittest.dart';
+import 'package:unittest/compact_vm_config.dart';
+
+main() {
+ useCompactVMConfiguration();
+
+ // Run all initializers.
+ run().then((_) {
+ test('annotations are seen in post-order with superclasses first', () {
+ var expectedNames = [A, C, B, E, D,];
+ expect(InitializeTracker.seen, expectedNames);
+ });
+ });
+}
+
+@initializeTracker
+class D extends E {}
+
+@initializeTracker
+class E extends B {}
+
+@initializeTracker
+class B extends C {}
+
+@initializeTracker
+class C extends A {}
+
+@initializeTracker
+class A {}
diff --git a/tool/all_tests.sh b/tool/all_tests.sh
index 13ed73c..85cc9ec 100755
--- a/tool/all_tests.sh
+++ b/tool/all_tests.sh
@@ -15,6 +15,7 @@
dart test/initializer_cycle_error_test.dart
dart test/initializer_test.dart
dart test/initializer_parts_test.dart
+dart test/initializer_super_test.dart
dart test/initializer_type_filter_test.dart
dart test/transformer_test.dart
@@ -27,4 +28,5 @@
dart build/test/initializer_custom_filter_test.initialize.dart
dart build/test/initializer_test.initialize.dart
dart build/test/initializer_parts_test.initialize.dart
+dart build/test/initializer_super_test.initialize.dart
dart build/test/initializer_type_filter_test.initialize.dart