Version 2.14.0-254.0.dev

Merge commit '583e37c4c97a796017c210ebc52bea6b5028681b' into 'dev'
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