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