Version 2.12.0-259.12.beta
* Cherry-pick 98d5ecb5533d20677430b168e6672260cf2c2b4e to beta
* Cherry-pick refs/changes/60/183960/2 to beta
* Cherry-pick 7ce8e3ba2e224f36441e0f0c833a5eb7a1111e0b to beta
diff --git a/pkg/analysis_server/test/abstract_context.dart b/pkg/analysis_server/test/abstract_context.dart
index 25a3347..f6cf3a5 100644
--- a/pkg/analysis_server/test/abstract_context.dart
+++ b/pkg/analysis_server/test/abstract_context.dart
@@ -282,7 +282,6 @@
@override
String get testPackageLanguageVersion => null;
- @nonVirtual
@override
void setUp() {
super.setUp();
diff --git a/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart b/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
index ab7d05d..d1bb572 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
@@ -42,7 +42,7 @@
var status = await refactoring.checkFinalConditions();
assertRefactoringStatus(status, RefactoringProblemSeverity.ERROR,
expectedMessage:
- "Library already declares function type alias with name 'NewName'.",
+ "Library already declares type alias with name 'NewName'.",
expectedContextSearch: 'NewName(); // existing');
}
@@ -393,7 +393,7 @@
class TestPageState extends State<TestPage> {
@override
- Widget build(BuildContext context) => null;
+ Widget build(BuildContext context) => throw 0;
}
''');
createRenameRefactoringAtString('TestPage extends');
@@ -415,7 +415,7 @@
class NewPageState extends State<NewPage> {
@override
- Widget build(BuildContext context) => null;
+ Widget build(BuildContext context) => throw 0;
}
''');
}
@@ -435,7 +435,7 @@
class _TestPageState extends State<_TestPage> {
@override
- Widget build(BuildContext context) => null;
+ Widget build(BuildContext context) => throw 0;
}
''');
createRenameRefactoringAtString('_TestPage extends');
@@ -457,7 +457,7 @@
class _NewPageState extends State<_NewPage> {
@override
- Widget build(BuildContext context) => null;
+ Widget build(BuildContext context) => throw 0;
}
''');
}
@@ -477,7 +477,7 @@
class _TestPageState extends State<TestPage> {
@override
- Widget build(BuildContext context) => null;
+ Widget build(BuildContext context) => throw 0;
}
''');
createRenameRefactoringAtString('TestPage extends');
@@ -499,7 +499,7 @@
class _NewPageState extends State<NewPage> {
@override
- Widget build(BuildContext context) => null;
+ Widget build(BuildContext context) => throw 0;
}
''');
}
@@ -531,10 +531,8 @@
Future<void> test_createChange_ClassElement_parameterTypeNested() async {
await indexTestUnit('''
-class Test {
-}
-main(f(Test p)) {
-}
+class Test {}
+void f(g(Test p)) {}
''');
// configure refactoring
createRenameRefactoringAtString('Test {');
@@ -543,10 +541,8 @@
refactoring.newName = 'NewName';
// validate change
return assertSuccessfulRefactoring('''
-class NewName {
-}
-main(f(NewName p)) {
-}
+class NewName {}
+void f(g(NewName p)) {}
''');
}
@@ -554,8 +550,7 @@
await indexTestUnit('''
class A {}
class Test = Object with A;
-main(Test t) {
-}
+void f(Test t) {}
''');
// configure refactoring
createRenameRefactoringAtString('Test =');
@@ -567,8 +562,7 @@
return assertSuccessfulRefactoring('''
class A {}
class NewName = Object with A;
-main(NewName t) {
-}
+void f(NewName t) {}
''');
}
@@ -645,7 +639,7 @@
// configure refactoring
createRenameRefactoringAtString('F()');
expect(refactoring.refactoringName, 'Rename Function Type Alias');
- expect(refactoring.elementKindName, 'function type alias');
+ expect(refactoring.elementKindName, 'type alias');
expect(refactoring.oldName, 'F');
refactoring.newName = 'G';
// validate change
@@ -675,7 +669,7 @@
class Test {}
-Test test;
+void f(Test a) {}
''');
createRenameRefactoringAtString('Test {}');
refactoring.newName = 'NewName';
@@ -687,7 +681,7 @@
class NewName {}
-NewName test;
+void f(NewName a) {}
''');
expect(refactoringChange.edits, hasLength(1));
diff --git a/pkg/analyzer/lib/src/dart/analysis/index.dart b/pkg/analyzer/lib/src/dart/analysis/index.dart
index c664f80..041bd06 100644
--- a/pkg/analyzer/lib/src/dart/analysis/index.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/index.dart
@@ -492,9 +492,6 @@
elementKind == ElementKind.FUNCTION &&
element is FunctionElement &&
element.enclosingElement is ExecutableElement ||
- elementKind == ElementKind.PARAMETER &&
- element is ParameterElement &&
- !element.isOptional ||
false) {
return;
}
diff --git a/pkg/analyzer/lib/src/dart/analysis/search.dart b/pkg/analyzer/lib/src/dart/analysis/search.dart
index 3074d5b..ba8695d 100644
--- a/pkg/analyzer/lib/src/dart/analysis/search.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/search.dart
@@ -456,7 +456,7 @@
},
searchedFiles,
));
- if (parameter.isOptional) {
+ if (parameter.isNamed || parameter.isOptionalPositional) {
results.addAll(await _searchReferences(parameter, searchedFiles));
}
return results;
diff --git a/pkg/analyzer/test/src/dart/analysis/index_test.dart b/pkg/analyzer/test/src/dart/analysis/index_test.dart
index 21fcfc4..28acd4b 100644
--- a/pkg/analyzer/test/src/dart/analysis/index_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/index_test.dart
@@ -17,7 +17,6 @@
main() {
defineReflectiveSuite(() {
defineReflectiveTests(IndexTest);
- defineReflectiveTests(IndexWithNonFunctionTypeAliasesTest);
});
}
@@ -35,7 +34,8 @@
}
@reflectiveTest
-class IndexTest extends PubPackageResolutionTest with _IndexMixin {
+class IndexTest extends PubPackageResolutionTest
+ with _IndexMixin, WithNonFunctionTypeAliasesMixin {
test_fieldFormalParameter_noSuchField() async {
await _indexTestUnit('''
class B<T> {
@@ -128,6 +128,18 @@
assertThat(elementObject).isExtendedAt('A {}', true, length: 0);
}
+ test_isExtendedBy_ClassDeclaration_TypeAliasElement() async {
+ await _indexTestUnit('''
+class A<T> {}
+typedef B = A<int>;
+class C extends B {}
+''');
+ var B = findElement.typeAlias('B');
+ assertThat(B)
+ ..isExtendedAt('B {}', false)
+ ..isReferencedAt('B {}', false);
+ }
+
test_isExtendedBy_ClassTypeAlias() async {
await _indexTestUnit('''
class A {}
@@ -180,6 +192,18 @@
..isReferencedAt('A {} // 2', true);
}
+ test_isImplementedBy_ClassDeclaration_TypeAliasElement() async {
+ await _indexTestUnit('''
+class A<T> {}
+typedef B = A<int>;
+class C implements B {}
+''');
+ var B = findElement.typeAlias('B');
+ assertThat(B)
+ ..isImplementedAt('B {}', false)
+ ..isReferencedAt('B {}', false);
+ }
+
test_isImplementedBy_ClassTypeAlias() async {
await _indexTestUnit('''
class A {} // 1
@@ -378,6 +402,18 @@
assertThat(element).isInvokedAt('~a', true, length: 1);
}
+ test_isMixedBy_ClassDeclaration_TypeAliasElement() async {
+ await _indexTestUnit('''
+class A<T> {}
+typedef B = A<int>;
+class C extends Object with B {}
+''');
+ var B = findElement.typeAlias('B');
+ assertThat(B)
+ ..isMixedInAt('B {}', false)
+ ..isReferencedAt('B {}', false);
+ }
+
test_isMixedInBy_ClassDeclaration_class() async {
await _indexTestUnit('''
class A {} // 1
@@ -517,6 +553,16 @@
assertThat(element).isReferencedAt('A();', false);
}
+ test_isReferencedBy_ClassElement_inTypeAlias() async {
+ await _indexTestUnit('''
+class A<T> {}
+
+typedef B = A<int>;
+''');
+ assertThat(findElement.class_('A')).isReferencedAt('A<int', false);
+ assertThat(intElement).isReferencedAt('int>;', false);
+ }
+
test_isReferencedBy_ClassElement_invocation_isQualified() async {
newFile('$testPackageLibPath/lib.dart', content: '''
class A {}
@@ -955,7 +1001,7 @@
test_isReferencedBy_ParameterElement_genericFunctionType() async {
await _indexTestUnit('''
-typedef F = void Function({int p});
+typedef F = void Function({int? p});
void main(F f) {
f(p: 0);
@@ -967,7 +1013,7 @@
test_isReferencedBy_ParameterElement_genericFunctionType_call() async {
await _indexTestUnit('''
-typedef F<T> = void Function({T test});
+typedef F<T> = void Function({T? test});
main(F<int> f) {
f.call(test: 0);
@@ -978,10 +1024,10 @@
test_isReferencedBy_ParameterElement_multiplyDefined_generic() async {
newFile('/test/lib/a.dart', content: r'''
-void foo<T>({T a}) {}
+void foo<T>({T? a}) {}
''');
newFile('/test/lib/b.dart', content: r'''
-void foo<T>({T a}) {}
+void foo<T>({T? a}) {}
''');
await _indexTestUnit(r"""
import 'a.dart';
@@ -994,10 +1040,10 @@
// No exceptions.
}
- test_isReferencedBy_ParameterElement_named_ofConstructor_genericClass() async {
+ test_isReferencedBy_ParameterElement_optionalNamed_ofConstructor_genericClass() async {
await _indexTestUnit('''
class A<T> {
- A({T test});
+ A({T? test});
}
main() {
@@ -1008,10 +1054,10 @@
assertThat(element)..isReferencedAt('test: 0', true);
}
- test_isReferencedBy_ParameterElement_named_ofMethod_genericClass() async {
+ test_isReferencedBy_ParameterElement_optionalNamed_ofMethod_genericClass() async {
await _indexTestUnit('''
class A<T> {
- void foo({T test}) {}
+ void foo({T? test}) {}
}
main(A<int> a) {
@@ -1022,6 +1068,18 @@
assertThat(element)..isReferencedAt('test: 0', true);
}
+ test_isReferencedBy_ParameterElement_optionalNamed_ofTopFunction() async {
+ await _indexTestUnit('''
+void foo({int? test}) {}
+
+void() {
+ foo(test: 0);
+}
+''');
+ Element element = findElement.parameter('test');
+ assertThat(element)..isReferencedAt('test: 0', true);
+ }
+
test_isReferencedBy_ParameterElement_optionalPositional() async {
await _indexTestUnit('''
foo([p]) {
@@ -1037,6 +1095,18 @@
..isReferencedAt('1); // 2', true, length: 0);
}
+ test_isReferencedBy_ParameterElement_requiredNamed_ofTopFunction() async {
+ await _indexTestUnit('''
+void foo({required int test}) {}
+
+void() {
+ foo(test: 0);
+}
+''');
+ Element element = findElement.parameter('test');
+ assertThat(element)..isReferencedAt('test: 0', true);
+ }
+
test_isReferencedBy_PropertyAccessor_ofNamedExtension_instance() async {
await _indexTestUnit('''
extension E on int {
@@ -1167,6 +1237,33 @@
assertThat(element).isReferencedAt('V;', true);
}
+ test_isReferencedBy_TypeAliasElement() async {
+ await _indexTestUnit('''
+class A<T> {
+ static int field = 0;
+ static void method() {}
+}
+
+typedef B = A<int>;
+
+void f(B p) {
+ B v;
+ B(); // 2
+ B.field = 1;
+ B.field; // 3
+ B.method(); // 4
+}
+''');
+ var element = findElement.typeAlias('B');
+ assertThat(element)
+ ..isReferencedAt('B p) {', false)
+ ..isReferencedAt('B v;', false)
+ ..isReferencedAt('B(); // 2', false)
+ ..isReferencedAt('B.field = 1;', false)
+ ..isReferencedAt('B.field; // 3', false)
+ ..isReferencedAt('B.method(); // 4', false);
+ }
+
test_isReferencedBy_typeInVariableList() async {
await _indexTestUnit('''
class A {}
@@ -1391,83 +1488,6 @@
}
}
-@reflectiveTest
-class IndexWithNonFunctionTypeAliasesTest extends PubPackageResolutionTest
- with WithNonFunctionTypeAliasesMixin, _IndexMixin {
- test_isExtendedBy_ClassDeclaration_TypeAliasElement() async {
- await _indexTestUnit('''
-class A<T> {}
-typedef B = A<int>;
-class C extends B {}
-''');
- var B = findElement.typeAlias('B');
- assertThat(B)
- ..isExtendedAt('B {}', false)
- ..isReferencedAt('B {}', false);
- }
-
- test_isImplementedBy_ClassDeclaration_TypeAliasElement() async {
- await _indexTestUnit('''
-class A<T> {}
-typedef B = A<int>;
-class C implements B {}
-''');
- var B = findElement.typeAlias('B');
- assertThat(B)
- ..isImplementedAt('B {}', false)
- ..isReferencedAt('B {}', false);
- }
-
- test_isMixedBy_ClassDeclaration_TypeAliasElement() async {
- await _indexTestUnit('''
-class A<T> {}
-typedef B = A<int>;
-class C extends Object with B {}
-''');
- var B = findElement.typeAlias('B');
- assertThat(B)
- ..isMixedInAt('B {}', false)
- ..isReferencedAt('B {}', false);
- }
-
- test_isReferencedBy_ClassElement_inTypeAlias() async {
- await _indexTestUnit('''
-class A<T> {}
-
-typedef B = A<int>;
-''');
- assertThat(findElement.class_('A')).isReferencedAt('A<int', false);
- assertThat(intElement).isReferencedAt('int>;', false);
- }
-
- test_isReferencedBy_TypeAliasElement() async {
- await _indexTestUnit('''
-class A<T> {
- static int field = 0;
- static void method() {}
-}
-
-typedef B = A<int>;
-
-void f(B p) {
- B v;
- B(); // 2
- B.field = 1;
- B.field; // 3
- B.method(); // 4
-}
-''');
- var element = findElement.typeAlias('B');
- assertThat(element)
- ..isReferencedAt('B p) {', false)
- ..isReferencedAt('B v;', false)
- ..isReferencedAt('B(); // 2', false)
- ..isReferencedAt('B.field = 1;', false)
- ..isReferencedAt('B.field; // 3', false)
- ..isReferencedAt('B.method(); // 4', false);
- }
-}
-
class _ElementIndexAssert {
final _IndexMixin test;
final Element element;
diff --git a/pkg/analyzer/test/src/dart/analysis/search_test.dart b/pkg/analyzer/test/src/dart/analysis/search_test.dart
index 646bada..c788f13 100644
--- a/pkg/analyzer/test/src/dart/analysis/search_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/search_test.dart
@@ -14,8 +14,6 @@
main() {
defineReflectiveSuite(() {
defineReflectiveTests(SearchTest);
- defineReflectiveTests(SearchWithNullSafetyTest);
- defineReflectiveTests(SearchWithNonFunctionTypeAliasesTest);
});
}
@@ -62,7 +60,8 @@
}
@reflectiveTest
-class SearchTest extends PubPackageResolutionTest {
+class SearchTest extends PubPackageResolutionTest
+ with WithNonFunctionTypeAliasesMixin {
AnalysisDriver get driver => driverFor(testFilePath);
CompilationUnitElement get resultUnitElement => result.unit.declaredElement;
@@ -387,6 +386,27 @@
await _verifyReferences(element, expected);
}
+ test_searchReferences_ConstructorElement_named_viaTypeAlias() async {
+ await resolveTestCode('''
+class A<T> {
+ A.named();
+}
+
+typedef B = A<int>;
+
+void f() {
+ B.named(); // ref
+}
+''');
+
+ var element = findElement.constructor('named');
+ var f = findElement.topFunction('f');
+ await _verifyReferences(element, [
+ _expectIdQ(f, SearchResultKind.REFERENCE, '.named(); // ref',
+ length: '.named'.length),
+ ]);
+ }
+
test_searchReferences_ConstructorElement_synthetic() async {
await resolveTestCode('''
class A {
@@ -607,6 +627,37 @@
await _verifyReferences(element, expected);
}
+ test_searchReferences_ImportElement_noPrefix_optIn_fromOptOut() async {
+ newFile('$testPackageLibPath/a.dart', content: r'''
+class N1 {}
+void N2() {}
+int get N3 => 0;
+set N4(int _) {}
+''');
+
+ await resolveTestCode('''
+// @dart = 2.7
+import 'a.dart';
+
+main() {
+ N1;
+ N2();
+ N3;
+ N4 = 0;
+}
+''');
+ ImportElement element = findElement.import('package:test/a.dart');
+ var main = findElement.function('main');
+ var kind = SearchResultKind.REFERENCE;
+ var expected = [
+ _expectId(main, kind, 'N1;', length: 0),
+ _expectId(main, kind, 'N2();', length: 0),
+ _expectId(main, kind, 'N3;', length: 0),
+ _expectId(main, kind, 'N4 =', length: 0),
+ ];
+ await _verifyReferences(element, expected);
+ }
+
test_searchReferences_ImportElement_withPrefix() async {
await resolveTestCode('''
import 'dart:math' as math show max, pi, Random hide min;
@@ -660,6 +711,38 @@
}
}
+ test_searchReferences_ImportElement_withPrefix_optIn_fromOptOut() async {
+ newFile('$testPackageLibPath/a.dart', content: r'''
+class N1 {}
+void N2() {}
+int get N3 => 0;
+set N4(int _) {}
+''');
+
+ await resolveTestCode('''
+// @dart = 2.7
+import 'a.dart' as a;
+
+main() {
+ a.N1;
+ a.N2();
+ a.N3;
+ a.N4 = 0;
+}
+''');
+ ImportElement element = findElement.import('package:test/a.dart');
+ var main = findElement.function('main');
+ var kind = SearchResultKind.REFERENCE;
+ var length = 'a.'.length;
+ var expected = [
+ _expectId(main, kind, 'a.N1;', length: length),
+ _expectId(main, kind, 'a.N2()', length: length),
+ _expectId(main, kind, 'a.N3', length: length),
+ _expectId(main, kind, 'a.N4', length: length),
+ ];
+ await _verifyReferences(element, expected);
+ }
+
test_searchReferences_LabelElement() async {
await resolveTestCode('''
main() {
@@ -966,7 +1049,7 @@
await _verifyReferences(method, expected);
}
- test_searchReferences_ParameterElement_named() async {
+ test_searchReferences_ParameterElement_optionalNamed() async {
await resolveTestCode('''
foo({p}) {
p = 1;
@@ -991,7 +1074,57 @@
await _verifyReferences(element, expected);
}
- test_searchReferences_ParameterElement_ofConstructor() async {
+ test_searchReferences_ParameterElement_optionalPositional() async {
+ await resolveTestCode('''
+foo([p]) {
+ p = 1;
+ p += 2;
+ print(p);
+ p();
+}
+main() {
+ foo(42);
+}
+''');
+ var element = findElement.parameter('p');
+ var foo = findElement.function('foo');
+ var main = findElement.function('main');
+ var expected = [
+ _expectId(foo, SearchResultKind.WRITE, 'p = 1;'),
+ _expectId(foo, SearchResultKind.READ_WRITE, 'p += 2;'),
+ _expectId(foo, SearchResultKind.READ, 'p);'),
+ _expectId(foo, SearchResultKind.READ, 'p();'),
+ _expectIdQ(main, SearchResultKind.REFERENCE, '42', length: 0)
+ ];
+ await _verifyReferences(element, expected);
+ }
+
+ test_searchReferences_ParameterElement_requiredNamed() async {
+ await resolveTestCode('''
+foo({required int p}) {
+ p = 1;
+ p += 2;
+ print(p);
+ p();
+}
+main() {
+ foo(p: 42);
+}
+''');
+ var element = findElement.parameter('p');
+ var foo = findElement.function('foo');
+ var main = findElement.function('main');
+ var expected = [
+ _expectId(foo, SearchResultKind.WRITE, 'p = 1;'),
+ _expectId(foo, SearchResultKind.READ_WRITE, 'p += 2;'),
+ _expectId(foo, SearchResultKind.READ, 'p);'),
+ _expectId(foo, SearchResultKind.READ, 'p();'),
+ _expectIdQ(main, SearchResultKind.REFERENCE, 'p: 42')
+ ];
+ await _verifyReferences(element, expected);
+ }
+
+ test_searchReferences_ParameterElement_requiredPositional_ofConstructor() async {
await resolveTestCode('''
class C {
var f;
@@ -1018,7 +1151,7 @@
await _verifyReferences(element, expected);
}
- test_searchReferences_ParameterElement_ofLocalFunction() async {
+ test_searchReferences_ParameterElement_requiredPositional_ofLocalFunction() async {
await resolveTestCode('''
main() {
foo(p) {
@@ -1041,7 +1174,7 @@
await _verifyReferences(element, expected);
}
- test_searchReferences_ParameterElement_ofMethod() async {
+ test_searchReferences_ParameterElement_requiredPositional_ofMethod() async {
await resolveTestCode('''
class C {
foo(p) {
@@ -1066,7 +1199,7 @@
await _verifyReferences(element, expected);
}
- test_searchReferences_ParameterElement_ofTopLevelFunction() async {
+ test_searchReferences_ParameterElement_requiredPositional_ofTopLevelFunction() async {
await resolveTestCode('''
foo(p) {
p = 1;
@@ -1089,31 +1222,6 @@
await _verifyReferences(element, expected);
}
- test_searchReferences_ParameterElement_optionalPositional() async {
- await resolveTestCode('''
-foo([p]) {
- p = 1;
- p += 2;
- print(p);
- p();
-}
-main() {
- foo(42);
-}
-''');
- var element = findElement.parameter('p');
- var foo = findElement.function('foo');
- var main = findElement.function('main');
- var expected = [
- _expectId(foo, SearchResultKind.WRITE, 'p = 1;'),
- _expectId(foo, SearchResultKind.READ_WRITE, 'p += 2;'),
- _expectId(foo, SearchResultKind.READ, 'p);'),
- _expectId(foo, SearchResultKind.READ, 'p();'),
- _expectIdQ(main, SearchResultKind.REFERENCE, '42', length: 0)
- ];
- await _verifyReferences(element, expected);
- }
-
test_searchReferences_PrefixElement() async {
String partCode = r'''
part of my_lib;
@@ -1425,6 +1533,77 @@
await _verifyReferences(variable, expected);
}
+ test_searchReferences_TypeAliasElement() async {
+ await resolveTestCode('''
+class A<T> {
+ static int field = 0;
+ static void method() {}
+}
+
+typedef B = A<int>;
+
+class C extends B {} // extends
+
+void f(B p) {
+ B v;
+ B.field = 1;
+ B.field;
+ B.method();
+}
+''');
+
+ var element = findElement.typeAlias('B');
+ var f = findElement.topFunction('f');
+ await _verifyReferences(element, [
+ _expectId(findElement.class_('C'), SearchResultKind.REFERENCE,
+ 'B {} // extends'),
+ _expectId(findElement.parameter('p'), SearchResultKind.REFERENCE, 'B p'),
+ _expectId(f, SearchResultKind.REFERENCE, 'B v'),
+ _expectId(f, SearchResultKind.REFERENCE, 'B.field ='),
+ _expectId(f, SearchResultKind.REFERENCE, 'B.field;'),
+ _expectId(f, SearchResultKind.REFERENCE, 'B.method();'),
+ ]);
+ }
+
+ test_searchReferences_TypeAliasElement_fromLegacy() async {
+ newFile('$testPackageLibPath/a.dart', content: r'''
+typedef A<T> = Map<int, T>;
+''');
+ await resolveTestCode('''
+// @dart = 2.9
+import 'a.dart';
+
+void f(A<String> a) {}
+''');
+
+ var A = findElement.importFind('package:test/a.dart').typeAlias('A');
+ await _verifyReferences(A, [
+ _expectId(
+ findElement.parameter('a'),
+ SearchResultKind.REFERENCE,
+ 'A<String>',
+ ),
+ ]);
+ }
+
+ test_searchReferences_TypeAliasElement_inConstructorName() async {
+ await resolveTestCode('''
+class A<T> {}
+
+typedef B = A<int>;
+
+void f() {
+ B();
+}
+''');
+
+ var element = findElement.typeAlias('B');
+ var f = findElement.topFunction('f');
+ await _verifyReferences(element, [
+ _expectId(f, SearchResultKind.REFERENCE, 'B();'),
+ ]);
+ }
+
test_searchReferences_TypeParameterElement_ofClass() async {
await resolveTestCode('''
class A<T> {
@@ -1855,165 +2034,3 @@
expect(matches, unorderedEquals(expectedMatches));
}
}
-
-@reflectiveTest
-class SearchWithNonFunctionTypeAliasesTest extends SearchTest
- with WithNonFunctionTypeAliasesMixin {
- test_searchReferences_ConstructorElement_named_viaTypeAlias() async {
- await resolveTestCode('''
-class A<T> {
- A.named();
-}
-
-typedef B = A<int>;
-
-void f() {
- B.named(); // ref
-}
-''');
-
- var element = findElement.constructor('named');
- var f = findElement.topFunction('f');
- await _verifyReferences(element, [
- _expectIdQ(f, SearchResultKind.REFERENCE, '.named(); // ref',
- length: '.named'.length),
- ]);
- }
-
- test_searchReferences_TypeAliasElement() async {
- await resolveTestCode('''
-class A<T> {
- static int field = 0;
- static void method() {}
-}
-
-typedef B = A<int>;
-
-class C extends B {} // extends
-
-void f(B p) {
- B v;
- B.field = 1;
- B.field;
- B.method();
-}
-''');
-
- var element = findElement.typeAlias('B');
- var f = findElement.topFunction('f');
- await _verifyReferences(element, [
- _expectId(findElement.class_('C'), SearchResultKind.REFERENCE,
- 'B {} // extends'),
- _expectId(findElement.parameter('p'), SearchResultKind.REFERENCE, 'B p'),
- _expectId(f, SearchResultKind.REFERENCE, 'B v'),
- _expectId(f, SearchResultKind.REFERENCE, 'B.field ='),
- _expectId(f, SearchResultKind.REFERENCE, 'B.field;'),
- _expectId(f, SearchResultKind.REFERENCE, 'B.method();'),
- ]);
- }
-
- test_searchReferences_TypeAliasElement_fromLegacy() async {
- newFile('$testPackageLibPath/a.dart', content: r'''
-typedef A<T> = Map<int, T>;
-''');
- await resolveTestCode('''
-// @dart = 2.9
-import 'a.dart';
-
-void f(A<String> a) {}
-''');
-
- var A = findElement.importFind('package:test/a.dart').typeAlias('A');
- await _verifyReferences(A, [
- _expectId(
- findElement.parameter('a'),
- SearchResultKind.REFERENCE,
- 'A<String>',
- ),
- ]);
- }
-
- test_searchReferences_TypeAliasElement_inConstructorName() async {
- await resolveTestCode('''
-class A<T> {}
-
-typedef B = A<int>;
-
-void f() {
- B();
-}
-''');
-
- var element = findElement.typeAlias('B');
- var f = findElement.topFunction('f');
- await _verifyReferences(element, [
- _expectId(f, SearchResultKind.REFERENCE, 'B();'),
- ]);
- }
-}
-
-@reflectiveTest
-class SearchWithNullSafetyTest extends SearchTest with WithNullSafetyMixin {
- test_searchReferences_ImportElement_noPrefix_optIn_fromOptOut() async {
- newFile('$testPackageLibPath/a.dart', content: r'''
-class N1 {}
-void N2() {}
-int get N3 => 0;
-set N4(int _) {}
-''');
-
- await resolveTestCode('''
-// @dart = 2.7
-import 'a.dart';
-
-main() {
- N1;
- N2();
- N3;
- N4 = 0;
-}
-''');
- ImportElement element = findElement.import('package:test/a.dart');
- var main = findElement.function('main');
- var kind = SearchResultKind.REFERENCE;
- var expected = [
- _expectId(main, kind, 'N1;', length: 0),
- _expectId(main, kind, 'N2();', length: 0),
- _expectId(main, kind, 'N3;', length: 0),
- _expectId(main, kind, 'N4 =', length: 0),
- ];
- await _verifyReferences(element, expected);
- }
-
- test_searchReferences_ImportElement_withPrefix_optIn_fromOptOut() async {
- newFile('$testPackageLibPath/a.dart', content: r'''
-class N1 {}
-void N2() {}
-int get N3 => 0;
-set N4(int _) {}
-''');
-
- await resolveTestCode('''
-// @dart = 2.7
-import 'a.dart' as a;
-
-main() {
- a.N1;
- a.N2();
- a.N3;
- a.N4 = 0;
-}
-''');
- ImportElement element = findElement.import('package:test/a.dart');
- var main = findElement.function('main');
- var kind = SearchResultKind.REFERENCE;
- var length = 'a.'.length;
- var expected = [
- _expectId(main, kind, 'a.N1;', length: length),
- _expectId(main, kind, 'a.N2()', length: length),
- _expectId(main, kind, 'a.N3', length: length),
- _expectId(main, kind, 'a.N4', length: length),
- ];
- await _verifyReferences(element, expected);
- }
-}
diff --git a/pkg/dartdev/test/analytics_test.dart b/pkg/dartdev/test/analytics_test.dart
index 8c74972..6158b0d 100644
--- a/pkg/dartdev/test/analytics_test.dart
+++ b/pkg/dartdev/test/analytics_test.dart
@@ -20,6 +20,33 @@
void main() {
group('DisabledAnalytics', disabledAnalyticsObject);
+ test('Analytics control smoke test', () {
+ final p = project(logAnalytics: true);
+ var result = p.runSync(['--disable-analytics']);
+ expect(result.stdout, contains('''
+ ╔════════════════════════════════════════════════════════════════════════════╗
+ ║ Anonymous analytics reporting disabled. In order to enable it, run: ║
+ ║ ║
+ ║ dart --enable-analytics ║
+ ║ ║
+ ╚════════════════════════════════════════════════════════════════════════════╝
+'''));
+
+ result = p.runSync(['--enable-analytics']);
+ expect(result.stdout, contains('''
+ ╔════════════════════════════════════════════════════════════════════════════╗
+ ║ The Dart tool uses Google Analytics to anonymously report feature usage ║
+ ║ statistics and to send basic crash reports. This data is used to help ║
+ ║ improve the Dart platform and tools over time. ║
+ ║ ║
+ ║ To disable reporting of anonymous analytics, run: ║
+ ║ ║
+ ║ dart --disable-analytics ║
+ ║ ║
+ ╚════════════════════════════════════════════════════════════════════════════╝
+'''));
+ });
+
group('Sending analytics', () {
test('help', () {
final p = project(logAnalytics: true);
diff --git a/runtime/bin/main_options.cc b/runtime/bin/main_options.cc
index 517029d..68c2543 100644
--- a/runtime/bin/main_options.cc
+++ b/runtime/bin/main_options.cc
@@ -517,7 +517,8 @@
// The analytics flags are a special case as we don't have a target script
// or DartDev command but we still want to launch DartDev.
DartDevIsolate::set_should_run_dart_dev(true);
-
+ dart_options->AddArgument(enable_dartdev_analytics ? "--enable-analytics"
+ : "--disable-analytics");
return true;
}
diff --git a/sdk/lib/async/schedule_microtask.dart b/sdk/lib/async/schedule_microtask.dart
index bb6d600..314d474 100644
--- a/sdk/lib/async/schedule_microtask.dart
+++ b/sdk/lib/async/schedule_microtask.dart
@@ -125,6 +125,7 @@
/// * [The Event Loop and Dart](https://dart.dev/articles/event-loop/):
/// Learn how Dart handles the event queue and microtask queue, so you can write
/// better asynchronous code with fewer surprises.
+@pragma('vm:entry-point', 'call')
void scheduleMicrotask(void Function() callback) {
_Zone currentZone = Zone._current;
if (identical(_rootZone, currentZone)) {
diff --git a/tools/VERSION b/tools/VERSION
index 58e23d3..856cb76 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -28,4 +28,4 @@
MINOR 12
PATCH 0
PRERELEASE 259
-PRERELEASE_PATCH 9
\ No newline at end of file
+PRERELEASE_PATCH 12
\ No newline at end of file