Index: pkg/smoke/lib/mirrors.dart |
diff --git a/pkg/smoke/lib/mirrors.dart b/pkg/smoke/lib/mirrors.dart |
index d30baa2ef90df4df998d6cbf1fedc2faf314a9aa..c49c536adcffe6dd6bb2ce6ee66739088261aced 100644 |
--- a/pkg/smoke/lib/mirrors.dart |
+++ b/pkg/smoke/lib/mirrors.dart |
@@ -218,7 +218,18 @@ Symbol _setterName(Symbol getter) => |
ClassMirror _safeSuperclass(ClassMirror type) { |
try { |
- return type.superclass; |
+ var t = type.superclass; |
+ // TODO(sigmund): workaround for darbug.com/17779. |
+ // Interceptor is leaked by dart2js. It has the same methods as Object |
+ // (including noSuchMethod), and our code above assumes that it doesn't |
+ // exist. Most queries exclude Object, so they should exclude Interceptor |
+ // too. We don't check for t.simpleName == #Interceptor because depending on |
+ // dart2js optimizations it may be #Interceptor or #num/Interceptor. |
+ // Checking for a private library seems to reliably filter this out. |
+ if (t != null && t.owner != null && t.owner.isPrivate) { |
+ t = _objectType; |
+ } |
+ return t; |
} on UnsupportedError catch (e) { |
// Note: dart2js throws UnsupportedError when the type is not reflectable. |
return _objectType; |