Perform instance member inference for mixins.

The set of sets is not comprehensive, no tests for fields and accessors.

R=brianwilkerson@google.com

Change-Id: I105ed6b1d4b5836f61af9f8abe7fed7e7a6b8c59
Reviewed-on: https://dart-review.googlesource.com/74941
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analyzer/lib/src/summary/link.dart b/pkg/analyzer/lib/src/summary/link.dart
index 4fdd614..59f4e77 100644
--- a/pkg/analyzer/lib/src/summary/link.dart
+++ b/pkg/analyzer/lib/src/summary/link.dart
@@ -1555,6 +1555,9 @@
     for (ClassElementForLink classElement in types) {
       classElement.link(this);
     }
+    for (ClassElementForLink classElement in mixins) {
+      classElement.link(this);
+    }
   }
 
   /// Throw away any information stored in the summary by a previous call to
diff --git a/pkg/analyzer/lib/src/task/strong_mode.dart b/pkg/analyzer/lib/src/task/strong_mode.dart
index f3fffb3..a0b6100 100644
--- a/pkg/analyzer/lib/src/task/strong_mode.dart
+++ b/pkg/analyzer/lib/src/task/strong_mode.dart
@@ -78,14 +78,8 @@
    * compilation [unit].
    */
   void inferCompilationUnit(CompilationUnitElement unit) {
-    for (ClassElement classElement in unit.types) {
-      try {
-        _inferClass(classElement);
-      } on _CycleException {
-        // This is a short circuit return to prevent types that inherit from
-        // types containing a circular reference from being inferred.
-      }
-    }
+    _inferClasses(unit.mixins);
+    _inferClasses(unit.types);
   }
 
   /**
@@ -306,6 +300,7 @@
         _inferType(classElement.supertype);
         classElement.mixins.forEach(_inferType);
         classElement.interfaces.forEach(_inferType);
+        classElement.superclassConstraints.forEach(_inferType);
         //
         // Then infer the types for the members.
         //
@@ -330,6 +325,17 @@
     }
   }
 
+  void _inferClasses(List<ClassElement> elements) {
+    for (ClassElement element in elements) {
+      try {
+        _inferClass(element);
+      } on _CycleException {
+        // This is a short circuit return to prevent types that inherit from
+        // types containing a circular reference from being inferred.
+      }
+    }
+  }
+
   void _inferConstructorFieldFormals(ConstructorElement constructor) {
     for (ParameterElement parameter in constructor.parameters) {
       if (parameter.hasImplicitType &&
diff --git a/pkg/analyzer/test/src/dart/resolution/class_test.dart b/pkg/analyzer/test/src/dart/resolution/class_test.dart
index 8384f10..7edebf0 100644
--- a/pkg/analyzer/test/src/dart/resolution/class_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/class_test.dart
@@ -70,7 +70,10 @@
 ''');
     await resolveTestFile();
     assertTestErrors([CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE]);
-    assertElement(findNode.simple('foo(); // ref'), findElement.method('foo'));
+    assertElement(
+      findNode.simple('foo(); // ref'),
+      findElement.method('foo', of: 'A'),
+    );
   }
 
   test_abstractSuperMemberReference_method_reference() async {
@@ -110,7 +113,7 @@
     assertNoTestErrors();
     assertElement(
       findNode.simple('foo(); // ref'),
-      findElement.method('foo', className: 'M'),
+      findElement.method('foo', of: 'M'),
     );
   }
 
@@ -137,7 +140,7 @@
     assertNoTestErrors();
     assertElement(
       findNode.simple('foo(); // ref'),
-      findElement.method('foo', className: 'B'),
+      findElement.method('foo', of: 'B'),
     );
   }
 
@@ -161,7 +164,7 @@
     assertNoTestErrors();
     assertElement(
       findNode.simple('foo(); // ref'),
-      findElement.method('foo', className: 'A'),
+      findElement.method('foo', of: 'A'),
     );
   }
 
@@ -207,7 +210,7 @@
     assertNoTestErrors();
     assertElement(
       findNode.simple('foo(); // ref'),
-      findElement.method('foo', className: 'A'),
+      findElement.method('foo', of: 'A'),
     );
   }
 
diff --git a/pkg/analyzer/test/src/dart/resolution/find_element.dart b/pkg/analyzer/test/src/dart/resolution/find_element.dart
index 105b4a4..fe7cb76 100644
--- a/pkg/analyzer/test/src/dart/resolution/find_element.dart
+++ b/pkg/analyzer/test/src/dart/resolution/find_element.dart
@@ -149,17 +149,37 @@
     return result;
   }
 
-  MethodElement method(String name, {String className}) {
-    for (var class_ in unitElement.types) {
-      if (className != null && class_.name != className) {
-        continue;
-      }
-      for (var method in class_.methods) {
+  MethodElement method(String name, {String of}) {
+    MethodElement result;
+
+    void findIn(List<MethodElement> methods) {
+      for (var method in methods) {
         if (method.name == name) {
-          return method;
+          if (result != null) {
+            throw new StateError('Method name $name is not unique.');
+          }
+          result = method;
         }
       }
     }
+
+    for (var class_ in unitElement.types) {
+      if (of != null && class_.name != of) {
+        continue;
+      }
+      findIn(class_.methods);
+    }
+
+    for (var mixin in unitElement.mixins) {
+      if (of != null && mixin.name != of) {
+        continue;
+      }
+      findIn(mixin.methods);
+    }
+
+    if (result != null) {
+      return result;
+    }
     fail('Not found class method: $name');
   }
 
diff --git a/pkg/analyzer/test/src/dart/resolution/instance_member_inference_class_test.dart b/pkg/analyzer/test/src/dart/resolution/instance_member_inference_class_test.dart
new file mode 100644
index 0000000..1218643
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/resolution/instance_member_inference_class_test.dart
@@ -0,0 +1,296 @@
+// Copyright (c) 2018, 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.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'driver_resolution.dart';
+import 'resolution.dart';
+import 'task_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(InstanceMemberInferenceClassDriverResolutionTest);
+    defineReflectiveTests(InstanceMemberInferenceClassTaskResolutionTest);
+  });
+}
+
+@reflectiveTest
+class InstanceMemberInferenceClassDriverResolutionTest
+    extends DriverResolutionTest with InstanceMemberInferenceClassMixin {}
+
+abstract class InstanceMemberInferenceClassMixin implements ResolutionTest {
+  test_invalid_inheritanceCycle() async {
+    addTestFile('''
+class A extends C {}
+class B extends A {}
+class C extends B {}
+''');
+    await resolveTestFile();
+  }
+
+  test_method_parameter_multiple_different() async {
+    addTestFile('''
+class A {
+  foo(int p) => 0;
+}
+class B {
+  foo(double p) => 0;
+}
+class C implements A, B {
+  foo(p) => 0;
+}
+''');
+    await resolveTestFile();
+
+    var p = findElement.method('foo', of: 'C').parameters[0];
+    assertElementTypeDynamic(p.type);
+  }
+
+  test_method_parameter_multiple_named_different() async {
+    addTestFile('''
+class A {
+  foo({int p}) => 0;
+}
+class B {
+  foo({int q}) => 0;
+}
+class C implements A, B {
+  foo({p}) => 0;
+}
+''');
+    await resolveTestFile();
+
+    var p = findElement.method('foo', of: 'C').parameters[0];
+    assertElementTypeDynamic(p.type);
+  }
+
+  test_method_parameter_multiple_named_same() async {
+    addTestFile('''
+class A {
+  foo({int p}) => 0;
+}
+class B {
+  foo({int p}) => 0;
+}
+class C implements A, B {
+  foo({p}) => 0;
+}
+''');
+    await resolveTestFile();
+
+    var p = findElement.method('foo', of: 'C').parameters[0];
+    assertElementTypeString(p.type, 'int');
+  }
+
+  test_method_parameter_multiple_namedAndRequired() async {
+    addTestFile('''
+class A {
+  foo({int p}) => 0;
+}
+class B {
+  foo(int p) => 0;
+}
+class C implements A, B {
+  foo(p) => 0;
+}
+''');
+    await resolveTestFile();
+
+    var p = findElement.method('foo', of: 'C').parameters[0];
+    assertElementTypeDynamic(p.type);
+  }
+
+  test_method_parameter_multiple_optionalAndRequired() async {
+    addTestFile('''
+class A {
+  foo(int p) => 0;
+}
+class B {
+  foo([int p]) => 0;
+}
+class C implements A, B {
+  foo(p) => 0;
+}
+''');
+    await resolveTestFile();
+
+    var p = findElement.method('foo', of: 'C').parameters[0];
+    assertElementTypeString(p.type, 'int');
+  }
+
+  test_method_parameter_single_generic() async {
+    addTestFile('''
+class A<E> {
+  foo(E p) => 0;
+}
+class C<T> implements A<T> {
+  foo(p) => 0;
+}
+''');
+    await resolveTestFile();
+
+    var p = findElement.method('foo', of: 'C').parameters[0];
+    assertElementTypeString(p.type, 'T');
+  }
+
+  test_method_return_multiple_different() async {
+    addTestFile('''
+class A {
+  int foo() => 0;
+}
+class B {
+  double foo() => 0.0;
+}
+class C implements A, B {
+  foo() => 0;
+}
+''');
+    await resolveTestFile();
+
+    var foo = findElement.method('foo', of: 'C');
+    assertElementTypeDynamic(foo.returnType);
+  }
+
+  test_method_return_multiple_different_generic() async {
+    addTestFile('''
+class A<E> {
+  E foo() => null;
+}
+class B<E> {
+  E foo() => null;
+}
+class C implements A<int>, B<double> {
+  foo() => null;
+}
+''');
+    await resolveTestFile();
+
+    var foo = findElement.method('foo', of: 'C');
+    assertElementTypeDynamic(foo.returnType);
+  }
+
+  test_method_return_multiple_different_void() async {
+    addTestFile('''
+class A {
+  int foo() => 0;
+}
+class B {
+  void foo() => 0;
+}
+class C implements A, B {
+  foo() => 0;
+}
+''');
+    await resolveTestFile();
+
+    var foo = findElement.method('foo', of: 'C');
+    assertElementTypeDynamic(foo.returnType);
+  }
+
+  test_method_return_multiple_dynamic() async {
+    addTestFile('''
+class A {
+  int foo() => 0;
+}
+class B {
+  foo() => 0;
+}
+class C implements A, B {
+  foo() => 0;
+}
+''');
+    await resolveTestFile();
+
+    var foo = findElement.method('foo', of: 'C');
+    assertElementTypeDynamic(foo.returnType);
+  }
+
+  test_method_return_multiple_same_generic() async {
+    addTestFile('''
+class A<E> {
+  E foo() => 0;
+}
+class B<E> {
+  E foo() => 0;
+}
+class C<T> implements A<T>, B<T> {
+  foo() => 0;
+}
+''');
+    await resolveTestFile();
+
+    var foo = findElement.method('foo', of: 'C');
+    assertElementTypeString(foo.returnType, 'T');
+  }
+
+  test_method_return_multiple_same_nonVoid() async {
+    addTestFile('''
+class A {
+  int foo() => 0;
+}
+class B {
+  int foo() => 0;
+}
+class C implements A, B {
+  foo() => 0;
+}
+''');
+    await resolveTestFile();
+
+    var foo = findElement.method('foo', of: 'C');
+    assertElementTypeString(foo.returnType, 'int');
+  }
+
+  test_method_return_multiple_same_void() async {
+    addTestFile('''
+class A {
+  void foo() {};
+}
+class B {
+  void foo() {};
+}
+class C implements A, B {
+  foo() {};
+}
+''');
+    await resolveTestFile();
+
+    var foo = findElement.method('foo', of: 'C');
+    assertElementTypeString(foo.returnType, 'void');
+  }
+
+  test_method_return_single() async {
+    addTestFile('''
+class A {
+  int foo() => 0;
+}
+class B extends A {
+  foo() => 0;
+}
+''');
+    await resolveTestFile();
+
+    var foo = findElement.method('foo', of: 'B');
+    assertElementTypeString(foo.returnType, 'int');
+  }
+
+  test_method_return_single_generic() async {
+    addTestFile('''
+class A<E> {
+  E foo() => 0;
+}
+class B<T> extends A<T> {
+  foo() => 0;
+}
+''');
+    await resolveTestFile();
+
+    var foo = findElement.method('foo', of: 'B');
+    assertElementTypeString(foo.returnType, 'T');
+  }
+}
+
+@reflectiveTest
+class InstanceMemberInferenceClassTaskResolutionTest extends TaskResolutionTest
+    with InstanceMemberInferenceClassMixin {}
diff --git a/pkg/analyzer/test/src/dart/resolution/instance_member_inference_mixin_test.dart b/pkg/analyzer/test/src/dart/resolution/instance_member_inference_mixin_test.dart
new file mode 100644
index 0000000..387e166
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/resolution/instance_member_inference_mixin_test.dart
@@ -0,0 +1,296 @@
+// Copyright (c) 2018, 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.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'driver_resolution.dart';
+import 'resolution.dart';
+import 'task_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(InstanceMemberInferenceMixinDriverResolutionTest);
+    defineReflectiveTests(InstanceMemberInferenceMixinTaskResolutionTest);
+  });
+}
+
+@reflectiveTest
+class InstanceMemberInferenceMixinDriverResolutionTest
+    extends DriverResolutionTest with InstanceMemberInferenceMixinMixin {}
+
+abstract class InstanceMemberInferenceMixinMixin implements ResolutionTest {
+  test_invalid_inheritanceCycle() async {
+    addTestFile('''
+mixin A on C {}
+mixin B on A {}
+mixin C on B {}
+''');
+    await resolveTestFile();
+  }
+
+  test_method_parameter_multiple_different() async {
+    addTestFile('''
+class A {
+  foo(int p) => 0;
+}
+class B {
+  foo(double p) => 0;
+}
+mixin M on A, B {
+  foo(p) => 0;
+}
+''');
+    await resolveTestFile();
+
+    var p = findElement.method('foo', of: 'M').parameters[0];
+    assertElementTypeDynamic(p.type);
+  }
+
+  test_method_parameter_multiple_named_different() async {
+    addTestFile('''
+class A {
+  foo({int p}) => 0;
+}
+class B {
+  foo({int q}) => 0;
+}
+mixin M on A, B {
+  foo({p}) => 0;
+}
+''');
+    await resolveTestFile();
+
+    var p = findElement.method('foo', of: 'M').parameters[0];
+    assertElementTypeDynamic(p.type);
+  }
+
+  test_method_parameter_multiple_named_same() async {
+    addTestFile('''
+class A {
+  foo({int p}) => 0;
+}
+class B {
+  foo({int p}) => 0;
+}
+mixin M on A, B {
+  foo({p}) => 0;
+}
+''');
+    await resolveTestFile();
+
+    var p = findElement.method('foo', of: 'M').parameters[0];
+    assertElementTypeString(p.type, 'int');
+  }
+
+  test_method_parameter_multiple_namedAndRequired() async {
+    addTestFile('''
+class A {
+  foo({int p}) => 0;
+}
+class B {
+  foo(int p) => 0;
+}
+mixin M on A, B {
+  foo(p) => 0;
+}
+''');
+    await resolveTestFile();
+
+    var p = findElement.method('foo', of: 'M').parameters[0];
+    assertElementTypeDynamic(p.type);
+  }
+
+  test_method_parameter_multiple_optionalAndRequired() async {
+    addTestFile('''
+class A {
+  foo(int p) => 0;
+}
+class B {
+  foo([int p]) => 0;
+}
+mixin M on A, B {
+  foo(p) => 0;
+}
+''');
+    await resolveTestFile();
+
+    var p = findElement.method('foo', of: 'M').parameters[0];
+    assertElementTypeString(p.type, 'int');
+  }
+
+  test_method_parameter_single_generic() async {
+    addTestFile('''
+class A<E> {
+  foo(E p) => 0;
+}
+mixin M<T> on A<T> {
+  foo(p) => 0;
+}
+''');
+    await resolveTestFile();
+
+    var p = findElement.method('foo', of: 'M').parameters[0];
+    assertElementTypeString(p.type, 'T');
+  }
+
+  test_method_return_multiple_different() async {
+    addTestFile('''
+class A {
+  int foo() => 0;
+}
+class B {
+  double foo() => 0.0;
+}
+mixin M on A, B {
+  foo() => 0;
+}
+''');
+    await resolveTestFile();
+
+    var foo = findElement.method('foo', of: 'M');
+    assertElementTypeDynamic(foo.returnType);
+  }
+
+  test_method_return_multiple_different_generic() async {
+    addTestFile('''
+class A<E> {
+  E foo() => null;
+}
+class B<E> {
+  E foo() => null;
+}
+mixin M on A<int>, B<double> {
+  foo() => null;
+}
+''');
+    await resolveTestFile();
+
+    var foo = findElement.method('foo', of: 'M');
+    assertElementTypeDynamic(foo.returnType);
+  }
+
+  test_method_return_multiple_different_void() async {
+    addTestFile('''
+class A {
+  int foo() => 0;
+}
+class B {
+  void foo() => 0;
+}
+mixin M on A, B {
+  foo() => 0;
+}
+''');
+    await resolveTestFile();
+
+    var foo = findElement.method('foo', of: 'M');
+    assertElementTypeDynamic(foo.returnType);
+  }
+
+  test_method_return_multiple_dynamic() async {
+    addTestFile('''
+class A {
+  int foo() => 0;
+}
+class B {
+  foo() => 0;
+}
+mixin M on A, B {
+  foo() => 0;
+}
+''');
+    await resolveTestFile();
+
+    var foo = findElement.method('foo', of: 'M');
+    assertElementTypeDynamic(foo.returnType);
+  }
+
+  test_method_return_multiple_same_generic() async {
+    addTestFile('''
+class A<E> {
+  E foo() => 0;
+}
+class B<E> {
+  E foo() => 0;
+}
+mixin M<T> on A<T>, B<T> {
+  foo() => 0;
+}
+''');
+    await resolveTestFile();
+
+    var foo = findElement.method('foo', of: 'M');
+    assertElementTypeString(foo.returnType, 'T');
+  }
+
+  test_method_return_multiple_same_nonVoid() async {
+    addTestFile('''
+class A {
+  int foo() => 0;
+}
+class B {
+  int foo() => 0;
+}
+mixin M on A, B {
+  foo() => 0;
+}
+''');
+    await resolveTestFile();
+
+    var foo = findElement.method('foo', of: 'M');
+    assertElementTypeString(foo.returnType, 'int');
+  }
+
+  test_method_return_multiple_same_void() async {
+    addTestFile('''
+class A {
+  void foo() {};
+}
+class B {
+  void foo() {};
+}
+mixin M on A, B {
+  foo() {};
+}
+''');
+    await resolveTestFile();
+
+    var foo = findElement.method('foo', of: 'M');
+    assertElementTypeString(foo.returnType, 'void');
+  }
+
+  test_method_return_single() async {
+    addTestFile('''
+class A {
+  int foo() => 0;
+}
+mixin M on A {
+  foo() => 0;
+}
+''');
+    await resolveTestFile();
+
+    var foo = findElement.method('foo', of: 'M');
+    assertElementTypeString(foo.returnType, 'int');
+  }
+
+  test_method_return_single_generic() async {
+    addTestFile('''
+class A<E> {
+  E foo() => 0;
+}
+mixin M<T> on A<T> {
+  foo() => 0;
+}
+''');
+    await resolveTestFile();
+
+    var foo = findElement.method('foo', of: 'M');
+    assertElementTypeString(foo.returnType, 'T');
+  }
+}
+
+@reflectiveTest
+class InstanceMemberInferenceMixinTaskResolutionTest extends TaskResolutionTest
+    with InstanceMemberInferenceMixinMixin {}
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index 69c1580..e01671b 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -79,6 +79,10 @@
     expect(type, expected);
   }
 
+  void assertElementTypeDynamic(DartType type) {
+    expect(type, isDynamicType);
+  }
+
   void assertElementTypes(List<DartType> types, List<DartType> expected,
       {bool ordered = false}) {
     if (ordered) {
@@ -88,6 +92,10 @@
     }
   }
 
+  void assertElementTypeString(DartType type, String expected) {
+    expect(type.toString(), expected);
+  }
+
   void assertEnclosingElement(Element element, Element expectedEnclosing) {
     expect(element.enclosingElement, expectedEnclosing);
   }
diff --git a/pkg/analyzer/test/src/dart/resolution/test_all.dart b/pkg/analyzer/test/src/dart/resolution/test_all.dart
index b2dee84..d93d42c 100644
--- a/pkg/analyzer/test/src/dart/resolution/test_all.dart
+++ b/pkg/analyzer/test/src/dart/resolution/test_all.dart
@@ -10,6 +10,10 @@
 import 'for_in_test.dart' as for_in_test;
 import 'import_prefix_test.dart' as import_prefix_test;
 import 'instance_creation_test.dart' as instance_creation_test;
+import 'instance_member_inference_class_test.dart'
+    as instance_member_inference_class_test;
+import 'instance_member_inference_mixin_test.dart'
+    as instance_member_inference_mixin_test;
 import 'mixin_test.dart' as mixin_test;
 
 main() {
@@ -20,6 +24,8 @@
     for_in_test.main();
     import_prefix_test.main();
     instance_creation_test.main();
+    instance_member_inference_class_test.main();
+    instance_member_inference_mixin_test.main();
     mixin_test.main();
   }, name: 'resolution');
 }
diff --git a/pkg/analyzer/test/src/task/strong_mode_driver_test.dart b/pkg/analyzer/test/src/task/strong_mode_driver_test.dart
deleted file mode 100644
index e459d9e..0000000
--- a/pkg/analyzer/test/src/task/strong_mode_driver_test.dart
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright (c) 2017, 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.
-
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import 'strong_mode_test.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(InstanceMemberInferrerTest_Driver);
-  });
-}
-
-@reflectiveTest
-class InstanceMemberInferrerTest_Driver extends InstanceMemberInferrerTest {
-  @override
-  bool get enableNewAnalysisDriver => true;
-}
diff --git a/pkg/analyzer/test/src/task/strong_mode_test.dart b/pkg/analyzer/test/src/task/strong_mode_test.dart
index b0cec78..cbf2625 100644
--- a/pkg/analyzer/test/src/task/strong_mode_test.dart
+++ b/pkg/analyzer/test/src/task/strong_mode_test.dart
@@ -5,9 +5,6 @@
 import 'dart:async';
 
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/src/dart/resolver/inheritance_manager.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/task/strong_mode.dart';
 import 'package:test/test.dart';
@@ -17,438 +14,12 @@
 
 main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(InstanceMemberInferrerTest);
     defineReflectiveTests(SetFieldTypeTest);
     defineReflectiveTests(VariableGathererTest);
   });
 }
 
 @reflectiveTest
-class InstanceMemberInferrerTest extends ResolverTestCase {
-  InstanceMemberInferrer createInferrer(LibraryElement library) {
-    AnalysisContext context = library.context;
-    var inheritanceManager = new InheritanceManager(library);
-    return new InstanceMemberInferrer(
-        context.typeProvider, (_) => inheritanceManager,
-        typeSystem: context.typeSystem);
-  }
-
-  /**
-   * Add a source with the given [content] and return the result of resolving
-   * the source.
-   */
-  Future<CompilationUnitElement> resolve(String content) async {
-    Source source = addNamedSource('/test.dart', content);
-    if (enableNewAnalysisDriver) {
-      var analysisResult = await computeAnalysisResult(source);
-      return analysisResult.unit.declaredElement;
-    } else {
-      return analysisContext
-          .resolveCompilationUnit2(source, source)
-          .declaredElement;
-    }
-  }
-
-  test_inferCompilationUnit_invalid_inheritanceCycle() async {
-    CompilationUnitElement unit = await resolve('''
-class A extends C {}
-class B extends A {}
-class C extends B {}
-''');
-    _runInferrer(unit);
-  }
-
-  test_inferCompilationUnit_method_parameter_multiple_different() async {
-    String methodName = 'm';
-    CompilationUnitElement unit = await resolve('''
-class A {
-  $methodName(int p) => 0;
-}
-class B {
-  $methodName(double p) => 0;
-}
-class C implements A, B {
-  $methodName(p) => 0;
-}
-''');
-    ClassElement classC = unit.getType('C');
-    MethodElement methodC = classC.getMethod(methodName);
-    ParameterElement parameterC = methodC.parameters[0];
-    expect(parameterC.type.isDynamic, isTrue);
-
-    _runInferrer(unit);
-
-    expect(parameterC.type.isDynamic, isTrue);
-  }
-
-  test_inferCompilationUnit_method_parameter_multiple_named_different() async {
-    String methodName = 'm';
-    CompilationUnitElement unit = await resolve('''
-class A {
-  $methodName({int p}) => 0;
-}
-class B {
-  $methodName({int q}) => 0;
-}
-class C implements A, B {
-  $methodName({p}) => 0;
-}
-''');
-    ClassElement classC = unit.getType('C');
-    MethodElement methodC = classC.getMethod(methodName);
-    ParameterElement parameterC = methodC.parameters[0];
-    expect(parameterC.type.isDynamic, isTrue);
-
-    _runInferrer(unit);
-
-    expect(parameterC.type.isDynamic, isTrue);
-  }
-
-  test_inferCompilationUnit_method_parameter_multiple_named_same() async {
-    String methodName = 'm';
-    CompilationUnitElement unit = await resolve('''
-class A {
-  $methodName({int p}) => 0;
-}
-class B {
-  $methodName({int p}) => 0;
-}
-class C implements A, B {
-  $methodName({p}) => 0;
-}
-''');
-    ClassElement classA = unit.getType('A');
-    MethodElement methodA = classA.getMethod(methodName);
-    ParameterElement parameterA = methodA.parameters[0];
-    DartType expectedType = parameterA.type;
-    ClassElement classC = unit.getType('C');
-    MethodElement methodC = classC.getMethod(methodName);
-    ParameterElement parameterC = methodC.parameters[0];
-    if (previewDart2) {
-      expect(parameterC.type.isDynamic, isFalse);
-    } else {
-      expect(parameterC.type.isDynamic, isTrue);
-    }
-
-    _runInferrer(unit);
-
-    expect(parameterC.type, expectedType);
-  }
-
-  test_inferCompilationUnit_method_parameter_multiple_namedAndRequired() async {
-    String methodName = 'm';
-    CompilationUnitElement unit = await resolve('''
-class A {
-  $methodName({int p}) => 0;
-}
-class B {
-  $methodName(int p) => 0;
-}
-class C implements A, B {
-  $methodName(p) => 0;
-}
-''');
-    ClassElement classC = unit.getType('C');
-    MethodElement methodC = classC.getMethod(methodName);
-    ParameterElement parameterC = methodC.parameters[0];
-    expect(parameterC.type.isDynamic, isTrue);
-
-    _runInferrer(unit);
-
-    expect(parameterC.type.isDynamic, isTrue);
-  }
-
-  test_inferCompilationUnit_method_parameter_multiple_optionalAndRequired() async {
-    String methodName = 'm';
-    CompilationUnitElement unit = await resolve('''
-class A {
-  $methodName(int p) => 0;
-}
-class B {
-  $methodName([int p]) => 0;
-}
-class C implements A, B {
-  $methodName(p) => 0;
-}
-''');
-    ClassElement classA = unit.getType('A');
-    MethodElement methodA = classA.getMethod(methodName);
-    ParameterElement parameterA = methodA.parameters[0];
-    DartType expectedType = parameterA.type;
-    ClassElement classC = unit.getType('C');
-    MethodElement methodC = classC.getMethod(methodName);
-    ParameterElement parameterC = methodC.parameters[0];
-    if (previewDart2) {
-      expect(parameterC.type.isDynamic, isFalse);
-    } else {
-      expect(parameterC.type.isDynamic, isTrue);
-    }
-
-    _runInferrer(unit);
-
-    expect(parameterC.type, expectedType);
-  }
-
-  test_inferCompilationUnit_method_parameter_single_generic() async {
-    String methodName = 'm';
-    CompilationUnitElement unit = await resolve('''
-class A<E> {
-  $methodName(E p) => 0;
-}
-class C<E> implements A<E> {
-  $methodName(p) => 0;
-}
-''');
-    ClassElement classC = unit.getType('C');
-    DartType typeCE = classC.typeParameters[0].type;
-    MethodElement methodC = classC.getMethod(methodName);
-    ParameterElement parameterC = methodC.parameters[0];
-    if (previewDart2) {
-      expect(parameterC.type.isDynamic, isFalse);
-    } else {
-      expect(parameterC.type.isDynamic, isTrue);
-    }
-    expect(methodC.type.typeArguments, [typeCE]);
-
-    _runInferrer(unit);
-
-    expect(parameterC.type, classC.typeParameters[0].type);
-    expect(methodC.type.typeArguments, [typeCE],
-        reason: 'function type should still have type arguments');
-  }
-
-  test_inferCompilationUnit_method_return_multiple_different() async {
-    String methodName = 'm';
-    CompilationUnitElement unit = await resolve('''
-class A {
-  int $methodName() => 0;
-}
-class B {
-  double $methodName() => 0.0;
-}
-class C implements A, B {
-  $methodName() => 0;
-}
-''');
-    ClassElement classC = unit.getType('C');
-    MethodElement methodC = classC.getMethod(methodName);
-    expect(methodC.returnType.isDynamic, isTrue);
-
-    _runInferrer(unit);
-
-    expect(methodC.returnType.isDynamic, isTrue);
-  }
-
-  test_inferCompilationUnit_method_return_multiple_different_generic() async {
-    String methodName = 'm';
-    CompilationUnitElement unit = await resolve('''
-class A<E> {
-  E $methodName() => null;
-}
-class B<E> {
-  E $methodName() => null;
-}
-class C implements A<int>, B<double> {
-  $methodName() => null;
-}
-''');
-    ClassElement classC = unit.getType('C');
-    MethodElement methodC = classC.getMethod(methodName);
-    expect(methodC.returnType.isDynamic, isTrue);
-
-    _runInferrer(unit);
-
-    expect(methodC.returnType.isDynamic, isTrue);
-  }
-
-  test_inferCompilationUnit_method_return_multiple_dynamic() async {
-    String methodName = 'm';
-    CompilationUnitElement unit = await resolve('''
-class A {
-  int $methodName() => 0;
-}
-class B {
-  $methodName() => 0;
-}
-class C implements A, B {
-  $methodName() => 0;
-}
-''');
-    ClassElement classC = unit.getType('C');
-    MethodElement methodC = classC.getMethod(methodName);
-    expect(methodC.returnType.isDynamic, isTrue);
-
-    _runInferrer(unit);
-
-    expect(methodC.returnType.isDynamic, isTrue);
-  }
-
-  test_inferCompilationUnit_method_return_multiple_same_generic() async {
-    String methodName = 'm';
-    CompilationUnitElement unit = await resolve('''
-class A<E> {
-  E $methodName() => 0;
-}
-class B<E> {
-  E $methodName() => 0;
-}
-class C<E> implements A<E>, B<E> {
-  $methodName() => 0;
-}
-''');
-    ClassElement classC = unit.getType('C');
-    MethodElement methodC = classC.getMethod(methodName);
-    if (previewDart2) {
-      expect(methodC.returnType.isDynamic, isFalse);
-    } else {
-      expect(methodC.returnType.isDynamic, isTrue);
-    }
-
-    _runInferrer(unit);
-
-    expect(methodC.returnType, classC.typeParameters[0].type);
-  }
-
-  test_inferCompilationUnit_method_return_multiple_same_nonVoid() async {
-    String methodName = 'm';
-    CompilationUnitElement unit = await resolve('''
-class A {
-  int $methodName() => 0;
-}
-class B {
-  int $methodName() => 0;
-}
-class C implements A, B {
-  $methodName() => 0;
-}
-''');
-    ClassElement classA = unit.getType('A');
-    MethodElement methodA = classA.getMethod(methodName);
-    DartType expectedType = methodA.returnType;
-    ClassElement classC = unit.getType('C');
-    MethodElement methodC = classC.getMethod(methodName);
-    if (previewDart2) {
-      expect(methodC.returnType.isDynamic, isFalse);
-    } else {
-      expect(methodC.returnType.isDynamic, isTrue);
-    }
-
-    _runInferrer(unit);
-
-    expect(methodC.returnType, expectedType);
-  }
-
-  test_inferCompilationUnit_method_return_multiple_same_void() async {
-    String methodName = 'm';
-    CompilationUnitElement unit = await resolve('''
-class A {
-  void $methodName() {};
-}
-class B {
-  void $methodName() {};
-}
-class C implements A, B {
-  $methodName() {};
-}
-''');
-    ClassElement classA = unit.getType('A');
-    MethodElement methodA = classA.getMethod(methodName);
-    DartType expectedType = methodA.returnType;
-    ClassElement classC = unit.getType('C');
-    MethodElement methodC = classC.getMethod(methodName);
-    if (previewDart2) {
-      expect(methodC.returnType.isDynamic, isFalse);
-    } else {
-      expect(methodC.returnType.isDynamic, isTrue);
-    }
-
-    _runInferrer(unit);
-
-    expect(methodC.returnType, expectedType);
-  }
-
-  test_inferCompilationUnit_method_return_multiple_void() async {
-    String methodName = 'm';
-    CompilationUnitElement unit = await resolve('''
-class A {
-  int $methodName() => 0;
-}
-class B {
-  void $methodName() => 0;
-}
-class C implements A, B {
-  $methodName() => 0;
-}
-''');
-    ClassElement classC = unit.getType('C');
-    MethodElement methodC = classC.getMethod(methodName);
-    expect(methodC.returnType.isDynamic, isTrue);
-
-    _runInferrer(unit);
-
-    expect(methodC.returnType.isDynamic, isTrue);
-  }
-
-  test_inferCompilationUnit_method_return_single() async {
-    String methodName = 'm';
-    CompilationUnitElement unit = await resolve('''
-class A {
-  int $methodName() => 0;
-}
-class B extends A {
-  $methodName() => 0;
-}
-''');
-    ClassElement classA = unit.getType('A');
-    MethodElement methodA = classA.getMethod(methodName);
-    ClassElement classB = unit.getType('B');
-    MethodElement methodB = classB.getMethod(methodName);
-    if (previewDart2) {
-      expect(methodB.returnType.isDynamic, isFalse);
-    } else {
-      expect(methodB.returnType.isDynamic, isTrue);
-    }
-
-    _runInferrer(unit);
-
-    expect(methodB.returnType, methodA.returnType);
-  }
-
-  test_inferCompilationUnit_method_return_single_generic() async {
-    String methodName = 'm';
-    CompilationUnitElement unit = await resolve('''
-class A<E> {
-  E $methodName() => 0;
-}
-class B<E> extends A<E> {
-  $methodName() => 0;
-}
-''');
-    ClassElement classB = unit.getType('B');
-    DartType typeBE = classB.typeParameters[0].type;
-    MethodElement methodB = classB.getMethod(methodName);
-    if (previewDart2) {
-      expect(methodB.returnType.isDynamic, isFalse);
-    } else {
-      expect(methodB.returnType.isDynamic, isTrue);
-    }
-    expect(methodB.type.typeArguments, [typeBE]);
-
-    _runInferrer(unit);
-
-    expect(methodB.returnType, classB.typeParameters[0].type);
-    expect(methodB.type.typeArguments, [typeBE],
-        reason: 'function type should still have type arguments');
-  }
-
-  InstanceMemberInferrer _runInferrer(CompilationUnitElement unit) {
-    InstanceMemberInferrer inferrer = createInferrer(unit.library);
-    inferrer.inferCompilationUnit(unit);
-    return inferrer;
-  }
-}
-
-@reflectiveTest
 class SetFieldTypeTest extends ResolverTestCase {
   test_setter_withoutParameter() async {
     Source source = addSource('''
diff --git a/pkg/analyzer/test/src/task/test_all.dart b/pkg/analyzer/test/src/task/test_all.dart
index 92e46d2..8d02ae5 100644
--- a/pkg/analyzer/test/src/task/test_all.dart
+++ b/pkg/analyzer/test/src/task/test_all.dart
@@ -18,7 +18,6 @@
 import 'options_test.dart' as options_test;
 import 'options_work_manager_test.dart' as options_work_manager_test;
 import 'strong/test_all.dart' as strong_mode_test_all;
-import 'strong_mode_driver_test.dart' as strong_mode_driver_test;
 import 'strong_mode_test.dart' as strong_mode_test;
 import 'yaml_test.dart' as yaml_test;
 
@@ -37,7 +36,6 @@
     options_test.main();
     options_work_manager_test.main();
     strong_mode_test_all.main();
-    strong_mode_driver_test.main();
     strong_mode_test.main();
     yaml_test.main();
   }, name: 'task');