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