Index: pkg/compiler/lib/src/native/enqueue.dart |
diff --git a/pkg/compiler/lib/src/native/enqueue.dart b/pkg/compiler/lib/src/native/enqueue.dart |
index e15f185cbee361d1669c4b225f0fdabedc79d9f5..f38ccc43f10663e59d0e43ec2f63206d2c9ead90 100644 |
--- a/pkg/compiler/lib/src/native/enqueue.dart |
+++ b/pkg/compiler/lib/src/native/enqueue.dart |
@@ -520,12 +520,23 @@ abstract class NativeEnqueuerBase implements NativeEnqueuer { |
.isSubtype(type, backend.listImplementation.rawType)) { |
backend.registerInstantiatedType(type, world, registry); |
} |
+ // TODO(johnniwinther): Improve spec string precision to handle type |
+ // arguments and implements relations that preserve generics. Currently |
+ // we cannot distinguish between `List`, `List<dynamic>`, and |
+ // `List<int>` and take all to mean `List<E>`; in effect not including |
+ // any native subclasses of generic classes. |
+ // TODO(johnniwinther,sra): Find and replace uses of `List` with the |
+ // actual implementation classes such as `JSArray` et al. |
+ enqueueUnusedClassesMatching((ClassElement nativeClass) { |
+ InterfaceType nativeType = nativeClass.thisType; |
+ InterfaceType specType = type.element.thisType; |
+ return compiler.types.isSubtype(nativeType, specType); |
+ }, cause, 'subtypeof($type)'); |
+ } else if (type.isDynamic) { |
+ enqueueUnusedClassesMatching((_) => true, cause, 'subtypeof($type)'); |
+ } else { |
+ assert(type is VoidType); |
} |
- assert(type is DartType); |
- enqueueUnusedClassesMatching( |
- (nativeClass) => compiler.types.isSubtype(nativeClass.thisType, type), |
- cause, |
- 'subtypeof($type)'); |
} |
// Give an info so that library developers can compile with -v to find why |