diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index cedb70b..7365ef4 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -82,7 +82,7 @@
 /// TODO(scheglov) Clean up the list of implicitly analyzed files.
 class AnalysisDriver implements AnalysisDriverGeneric {
   /// The version of data format, should be incremented on every format change.
-  static const int DATA_VERSION = 158;
+  static const int DATA_VERSION = 159;
 
   /// The number of exception contexts allowed to write. Once this field is
   /// zero, we stop writing any new exception contexts in this process.
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index d5c7fbb..7b3bd16 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -237,6 +237,7 @@
           String methodName, LibraryElement library) =>
       _first(_implementationsOfMethod(methodName).where(
           (MethodElement method) =>
+              !method.isStatic &&
               method.isAccessibleIn(library) &&
               method.enclosingElement != this));
 
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index aae8a23..304d7be 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -10151,7 +10151,7 @@
   // - Doesn't have an initializer.
   // - Isn't marked as `late`.
   // - The analyzer can't prove that the local variable will be assigned before
-  //   the reference based on the specification of [definite assignment.][]
+  //   the reference based on the specification of [definite assignment][].
   //
   // #### Example
   //
diff --git a/pkg/analyzer/lib/src/test_utilities/find_element.dart b/pkg/analyzer/lib/src/test_utilities/find_element.dart
index 9cd9532e..bc471b2 100644
--- a/pkg/analyzer/lib/src/test_utilities/find_element.dart
+++ b/pkg/analyzer/lib/src/test_utilities/find_element.dart
@@ -12,13 +12,15 @@
 
   FindElement(this.unit);
 
+  LibraryElement get libraryElement => unitElement.library;
+
   @override
   CompilationUnitElement get unitElement => unit.declaredElement!;
 
   ExportElement export(String targetUri) {
     ExportElement? result;
 
-    for (var export in unitElement.library.exports) {
+    for (var export in libraryElement.exports) {
       var exportedUri = export.exportedLibrary?.source.uri.toString();
       if (exportedUri == targetUri) {
         if (result != null) {
@@ -50,7 +52,7 @@
   ImportElement import(String targetUri, {bool mustBeUnique = true}) {
     ImportElement? importElement;
 
-    for (var import in unitElement.library.imports) {
+    for (var import in libraryElement.imports) {
       var importedUri = import.importedLibrary?.source.uri.toString();
       if (importedUri == targetUri) {
         if (importElement == null) {
@@ -215,7 +217,7 @@
   CompilationUnitElement part(String targetUri) {
     CompilationUnitElement? partElement;
 
-    for (var part in unitElement.library.parts) {
+    for (var part in libraryElement.parts) {
       if (part.uri == targetUri) {
         if (partElement != null) {
           throw StateError('Not unique: $targetUri');
@@ -236,7 +238,7 @@
   }
 
   PrefixElement prefix(String name) {
-    for (var import_ in unitElement.library.imports) {
+    for (var import_ in libraryElement.imports) {
       var prefix = import_.prefix;
       if (prefix?.name == name) {
         return prefix!;
diff --git a/pkg/analyzer/test/src/dart/element/class_element_test.dart b/pkg/analyzer/test/src/dart/element/class_element_test.dart
new file mode 100644
index 0000000..0e14887
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/element/class_element_test.dart
@@ -0,0 +1,278 @@
+// Copyright (c) 2021, 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:analyzer/dart/element/element.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../resolution/context_collection_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ClassElementTest);
+  });
+}
+
+@reflectiveTest
+class ClassElementTest extends PubPackageResolutionTest {
+  test_lookUpInheritedMethod_declared() async {
+    await assertNoErrorsInCode('''
+class A {
+  void foo() {}
+}
+''');
+    var A = findElement.class_('A');
+    assertElementNull(
+      A._lookUpInheritedMethod('foo'),
+    );
+  }
+
+  test_lookUpInheritedMethod_declared_hasExtends() async {
+    await assertNoErrorsInCode('''
+class A {
+  void foo() {}
+}
+
+class B extends A {
+  void foo() {}
+}
+''');
+    var B = findElement.class_('B');
+    assertElement2(
+      B._lookUpInheritedMethod('foo'),
+      declaration: findElement.method('foo', of: 'A'),
+    );
+  }
+
+  test_lookUpInheritedMethod_declared_hasExtends_private_otherLibrary() async {
+    newFile('$testPackageLibPath/a.dart', content: r'''
+class A {
+  void _foo() {}
+}
+''');
+    await assertNoErrorsInCode('''
+import 'a.dart';
+
+class B extends A {
+  // ignore:unused_element
+  void _foo() {}
+}
+''');
+    var B = findElement.class_('B');
+    assertElementNull(
+      B._lookUpInheritedMethod('_foo'),
+    );
+  }
+
+  test_lookUpInheritedMethod_declared_hasExtends_private_sameLibrary() async {
+    await assertNoErrorsInCode('''
+class A {
+  // ignore:unused_element
+  void _foo() {}
+}
+
+class B extends A {
+  // ignore:unused_element
+  void _foo() {}
+}
+''');
+    var B = findElement.class_('B');
+    assertElement2(
+      B._lookUpInheritedMethod('_foo'),
+      declaration: findElement.method('_foo', of: 'A'),
+    );
+  }
+
+  test_lookUpInheritedMethod_declared_hasExtends_static() async {
+    await assertNoErrorsInCode('''
+class A {
+  static void foo() {}
+}
+
+class B extends A {
+  void foo() {}
+}
+''');
+    var B = findElement.class_('B');
+    assertElementNull(
+      B._lookUpInheritedMethod('foo'),
+    );
+  }
+
+  test_lookUpInheritedMethod_hasExtends() async {
+    await assertNoErrorsInCode('''
+class A {
+  void foo() {}
+}
+
+class B extends A {}
+''');
+    var B = findElement.class_('B');
+    assertElement2(
+      B._lookUpInheritedMethod('foo'),
+      declaration: findElement.method('foo', of: 'A'),
+    );
+  }
+
+  test_lookUpInheritedMethod_hasExtends_hasWith() async {
+    await assertNoErrorsInCode('''
+class A {
+  void foo() {}
+}
+
+mixin M {
+  void foo() {}
+}
+
+class B extends A with M {}
+''');
+    var B = findElement.class_('B');
+    assertElement2(
+      B._lookUpInheritedMethod('foo'),
+      declaration: findElement.method('foo', of: 'M'),
+    );
+  }
+
+  test_lookUpInheritedMethod_hasExtends_hasWith2() async {
+    await assertNoErrorsInCode('''
+class A {
+  void foo() {}
+}
+
+mixin M1 {
+  void foo() {}
+}
+
+mixin M2 {
+  void foo() {}
+}
+
+class B extends A with M1, M2 {}
+''');
+    var B = findElement.class_('B');
+    assertElement2(
+      B._lookUpInheritedMethod('foo'),
+      declaration: findElement.method('foo', of: 'M2'),
+    );
+  }
+
+  test_lookUpInheritedMethod_hasExtends_hasWith3() async {
+    await assertNoErrorsInCode('''
+class A {
+  void foo() {}
+}
+
+mixin M1 {
+  void foo() {}
+}
+
+mixin M2 {}
+
+class B extends A with M1, M2 {}
+''');
+    var B = findElement.class_('B');
+    assertElement2(
+      B._lookUpInheritedMethod('foo'),
+      declaration: findElement.method('foo', of: 'M1'),
+    );
+  }
+
+  test_lookUpInheritedMethod_hasExtends_hasWith4() async {
+    await assertNoErrorsInCode('''
+class A {
+  void foo() {}
+}
+
+mixin M {}
+
+class B extends A with M {}
+''');
+    var B = findElement.class_('B');
+    assertElement2(
+      B._lookUpInheritedMethod('foo'),
+      declaration: findElement.method('foo', of: 'A'),
+    );
+  }
+
+  test_lookUpInheritedMethod_hasExtends_hasWith_static() async {
+    await assertNoErrorsInCode('''
+class A {
+  void foo() {}
+}
+
+mixin M {
+  static void foo() {}
+}
+
+class B extends A with M {}
+''');
+    var B = findElement.class_('B');
+    assertElement2(
+      B._lookUpInheritedMethod('foo'),
+      declaration: findElement.method('foo', of: 'A'),
+    );
+  }
+
+  test_lookUpInheritedMethod_hasExtends_static() async {
+    await assertNoErrorsInCode('''
+class A {
+  static void foo() {}
+}
+
+class B extends A {}
+''');
+    var B = findElement.class_('B');
+    assertElementNull(
+      B._lookUpInheritedMethod('foo'),
+    );
+  }
+
+  test_lookUpInheritedMethod_hasExtends_withImplements() async {
+    await assertNoErrorsInCode('''
+class A {
+  void foo() {}
+}
+
+class B {
+  void foo() {}
+}
+
+class C extends A implements B {}
+''');
+    var C = findElement.class_('C');
+    assertElement2(
+      C._lookUpInheritedMethod('foo'),
+      declaration: findElement.method('foo', of: 'A'),
+    );
+  }
+
+  test_lookUpInheritedMethod_hasImplements() async {
+    await assertNoErrorsInCode('''
+class A {
+  void foo() {}
+}
+
+abstract class B implements A {}
+''');
+    var B = findElement.class_('B');
+    assertElementNull(
+      B._lookUpInheritedMethod('foo'),
+    );
+  }
+
+  test_lookUpInheritedMethod_undeclared() async {
+    await assertNoErrorsInCode('''
+class A {}
+''');
+    var A = findElement.class_('A');
+    assertElementNull(
+      A._lookUpInheritedMethod('foo'),
+    );
+  }
+}
+
+extension on ClassElement {
+  MethodElement? _lookUpInheritedMethod(String name) {
+    return lookUpInheritedMethod(name, library);
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/element/element_test.dart b/pkg/analyzer/test/src/dart/element/element_test.dart
index 4edf45d..43c2249 100644
--- a/pkg/analyzer/test/src/dart/element/element_test.dart
+++ b/pkg/analyzer/test/src/dart/element/element_test.dart
@@ -655,73 +655,6 @@
     expect(classA.lookUpInheritedConcreteSetter("s", library), isNull);
   }
 
-  void test_lookUpInheritedMethod_declared() {
-    // class A {
-    //   m() {}
-    // }
-    LibraryElementImpl library = _newLibrary();
-    var classA = class_(name: 'A');
-    String methodName = "m";
-    MethodElement method = ElementFactory.methodElement(methodName, intNone);
-    classA.methods = <MethodElement>[method];
-    (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
-        <ClassElement>[classA];
-    expect(classA.lookUpInheritedMethod(methodName, library), isNull);
-  }
-
-  void test_lookUpInheritedMethod_declaredAndInherited() {
-    // class A {
-    //   m() {}
-    // }
-    // class B extends A {
-    //   m() {}
-    // }
-    LibraryElementImpl library = _newLibrary();
-    var classA = class_(name: 'A');
-    String methodName = "m";
-    MethodElement inheritedMethod =
-        ElementFactory.methodElement(methodName, intNone);
-    classA.methods = <MethodElement>[inheritedMethod];
-    ClassElementImpl classB =
-        ElementFactory.classElement("B", interfaceTypeStar(classA));
-    MethodElement method = ElementFactory.methodElement(methodName, intNone);
-    classB.methods = <MethodElement>[method];
-    (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
-        <ClassElement>[classA, classB];
-    expect(classB.lookUpInheritedMethod(methodName, library),
-        same(inheritedMethod));
-  }
-
-  void test_lookUpInheritedMethod_inherited() {
-    // class A {
-    //   m() {}
-    // }
-    // class B extends A {
-    // }
-    LibraryElementImpl library = _newLibrary();
-    var classA = class_(name: 'A');
-    String methodName = "m";
-    MethodElement inheritedMethod =
-        ElementFactory.methodElement(methodName, intNone);
-    classA.methods = <MethodElement>[inheritedMethod];
-    ClassElementImpl classB =
-        ElementFactory.classElement("B", interfaceTypeStar(classA));
-    (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
-        <ClassElement>[classA, classB];
-    expect(classB.lookUpInheritedMethod(methodName, library),
-        same(inheritedMethod));
-  }
-
-  void test_lookUpInheritedMethod_undeclared() {
-    // class A {
-    // }
-    LibraryElementImpl library = _newLibrary();
-    var classA = class_(name: 'A');
-    (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
-        <ClassElement>[classA];
-    expect(classA.lookUpInheritedMethod("m", library), isNull);
-  }
-
   void test_lookUpMethod_declared() {
     LibraryElementImpl library = _newLibrary();
     var classA = class_(name: 'A');
diff --git a/pkg/analyzer/test/src/dart/element/test_all.dart b/pkg/analyzer/test/src/dart/element/test_all.dart
index 980299f..f3019b9 100644
--- a/pkg/analyzer/test/src/dart/element/test_all.dart
+++ b/pkg/analyzer/test/src/dart/element/test_all.dart
@@ -4,6 +4,7 @@
 
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import 'class_element_test.dart' as class_element;
 import 'class_hierarchy_test.dart' as class_hierarchy;
 import 'display_string_test.dart' as display_string;
 import 'element_test.dart' as element;
@@ -34,6 +35,7 @@
 /// Utility for manually running all tests.
 main() {
   defineReflectiveSuite(() {
+    class_element.main();
     class_hierarchy.main();
     display_string.main();
     element.main();
diff --git a/pkg/analyzer/tool/diagnostics/diagnostics.md b/pkg/analyzer/tool/diagnostics/diagnostics.md
index 09d37cc..f6857fc 100644
--- a/pkg/analyzer/tool/diagnostics/diagnostics.md
+++ b/pkg/analyzer/tool/diagnostics/diagnostics.md
@@ -154,7 +154,7 @@
 For additional details, see the
 [specification of definite assignment][definiteAssignmentSpec].
 
-[definiteAssignmentSpec](https://github.com/dart-lang/language/blob/master/resources/type-system/flow-analysis.md)
+[definiteAssignmentSpec]: https://github.com/dart-lang/language/blob/master/resources/type-system/flow-analysis.md
 
 ### Mixin application
 
@@ -9694,7 +9694,7 @@
 - Doesn't have an initializer.
 - Isn't marked as `late`.
 - The analyzer can't prove that the local variable will be assigned before
-  the reference based on the specification of [definite assignment.][]
+  the reference based on the specification of [definite assignment][].
 
 #### Example
 
diff --git a/pkg/analyzer/tool/diagnostics/generate.dart b/pkg/analyzer/tool/diagnostics/generate.dart
index 00d1b88..927bbf2 100644
--- a/pkg/analyzer/tool/diagnostics/generate.dart
+++ b/pkg/analyzer/tool/diagnostics/generate.dart
@@ -547,7 +547,7 @@
 For additional details, see the
 [specification of definite assignment][definiteAssignmentSpec].
 
-[definiteAssignmentSpec](https://github.com/dart-lang/language/blob/master/resources/type-system/flow-analysis.md)
+[definiteAssignmentSpec]: https://github.com/dart-lang/language/blob/master/resources/type-system/flow-analysis.md
 
 ### Mixin application
 
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index 9c8c353a..5b0948e 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -87,7 +87,7 @@
   }
 
   @override
-  Future<void> start(List<String> args) async {
+  Future<void> start(List<String> arguments) async {
     if (analysisDriver != null) {
       throw StateError('start() can only be called once');
     }
@@ -98,14 +98,14 @@
     linter.registerLintRules();
 
     // Parse commandline options.
-    var options = CommandLineOptions.parse(resourceProvider, args);
+    var options = CommandLineOptions.parse(resourceProvider, arguments);
 
     _analysisContextProvider = _AnalysisContextProvider(resourceProvider);
 
     // Do analysis.
     if (options.batchMode) {
       var batchRunner = BatchRunner(outSink, errorSink);
-      batchRunner.runAsBatch(args, (List<String> args) async {
+      batchRunner.runAsBatch(arguments, (List<String> args) async {
         var options = CommandLineOptions.parse(resourceProvider, args);
         return await _analyzeAll(options);
       });
diff --git a/runtime/vm/object_graph.cc b/runtime/vm/object_graph.cc
index db7a3f1..ed7fb28 100644
--- a/runtime/vm/object_graph.cc
+++ b/runtime/vm/object_graph.cc
@@ -821,7 +821,7 @@
     if (obj->IsPseudoObject()) return;
 
     writer_->AssignObjectId(obj);
-    obj->untag()->VisitPointers(this);
+    obj->untag()->VisitPointersPrecise(isolate_group(), this);
   }
 
   void VisitPointers(ObjectPtr* from, ObjectPtr* to) {
diff --git a/tests/standalone/regress_42092_test.dart b/tests/standalone/regress_42092_test.dart
index e3b3caa..fc11082 100644
--- a/tests/standalone/regress_42092_test.dart
+++ b/tests/standalone/regress_42092_test.dart
@@ -8,44 +8,25 @@
 
 import 'package:expect/expect.dart';
 
-late Process process;
-bool lastKill = false;
-
-Future<void> sigint(int iterations) async {
-  for (int i = 0; i < iterations; ++i) {
-    if (i + 1 == iterations) {
-      lastKill = true;
-    }
-    process.kill(ProcessSignal.sigint);
-    // Yield to the event loop to allow for the signal to be sent.
-    await Future.value(null);
-  }
-}
-
 Future<void> main() async {
-  process = await Process.start(
+  final process = await Process.start(
     Platform.resolvedExecutable,
     [
       Platform.script.resolve('regress_42092_script.dart').toString(),
     ],
   );
-  final startCompleter = Completer<void>();
   late StreamSubscription sub;
+  int count = 0;
   sub = process.stdout.transform(Utf8Decoder()).listen((event) {
-    if (event.contains('Waiting...')) {
-      startCompleter.complete();
-      sub.cancel();
+    print(event);
+    if (event.contains('child: Got a SIGINT')) {
+      ++count;
+      if (count == 3) {
+        sub.cancel();
+      }
     }
+    process.kill(ProcessSignal.sigint);
   });
 
-  // Wait for target script to setup its signal handling.
-  await startCompleter.future;
-
-  final exitCompleter = Completer<void>();
-  process.exitCode.then((code) {
-    Expect.isTrue(lastKill);
-    exitCompleter.complete();
-  });
-  await sigint(3);
-  await exitCompleter.future;
+  await process.exitCode;
 }
diff --git a/tests/standalone_2/regress_42092_test.dart b/tests/standalone_2/regress_42092_test.dart
index ba742d6..14d553e 100644
--- a/tests/standalone_2/regress_42092_test.dart
+++ b/tests/standalone_2/regress_42092_test.dart
@@ -10,44 +10,25 @@
 
 import 'package:expect/expect.dart';
 
-Process process;
-bool lastKill = false;
-
-Future<void> sigint(int iterations) async {
-  for (int i = 0; i < iterations; ++i) {
-    if (i + 1 == iterations) {
-      lastKill = true;
-    }
-    process.kill(ProcessSignal.sigint);
-    // Yield to the event loop to allow for the signal to be sent.
-    await Future.value(null);
-  }
-}
-
 Future<void> main() async {
-  process = await Process.start(
+  final process = await Process.start(
     Platform.resolvedExecutable,
     [
       Platform.script.resolve('regress_42092_script.dart').toString(),
     ],
   );
-  final startCompleter = Completer<void>();
   StreamSubscription sub;
+  int count = 0;
   sub = process.stdout.transform(Utf8Decoder()).listen((event) {
-    if (event.contains('Waiting...')) {
-      startCompleter.complete();
-      sub.cancel();
+    print(event);
+    if (event.contains('child: Got a SIGINT')) {
+      ++count;
+      if (count == 3) {
+        sub.cancel();
+      }
     }
+    process.kill(ProcessSignal.sigint);
   });
 
-  // Wait for target script to setup its signal handling.
-  await startCompleter.future;
-
-  final exitCompleter = Completer<void>();
-  process.exitCode.then((code) {
-    Expect.isTrue(lastKill);
-    exitCompleter.complete();
-  });
-  await sigint(3);
-  await exitCompleter.future;
+  await process.exitCode;
 }
diff --git a/tools/VERSION b/tools/VERSION
index 2a65555..58c2d06 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 253
+PRERELEASE 254
 PRERELEASE_PATCH 0
\ No newline at end of file
