Version 2.17.0-266.5.beta
* Cherry-pick 2badd2e71eaeb5c6b24005af5005fe1220ce21a9 to beta
* Cherry-pick 54af2c5fd1c54025196bd3a63b09c13ead817ed9 to beta
* Cherry-pick 29f9b208185ab6b7067c7d8816831d74cebbc36b to beta
* Cherry-pick 3d8290d926b7b909bc8ff19b4d6d96c2301d81c3 to beta
diff --git a/DEPS b/DEPS
index c8310ef..7256708 100644
--- a/DEPS
+++ b/DEPS
@@ -110,7 +110,7 @@
"dart_style_rev": "d7b73536a8079331c888b7da539b80e6825270ea",
"dartdoc_rev" : "334072b0cad436c05f6bcecf8a1a59f2f0809b84",
- "devtools_rev" : "2a707ca56c1a9d5eeef212c28c573548a051fdd2",
+ "devtools_rev" : "8c525828ba33029ed664bf8ea2829b6e5370535f",
"ffi_rev": "4dd32429880a57b64edaf54c9d5af8a9fa9a4ffb",
"fixnum_rev": "848341f061359ef7ddc0cad472c2ecbb036b28ac",
"file_rev": "1ebc38852ffed24b564910317982298b56c2cedd",
@@ -176,7 +176,7 @@
"webkit_inspection_protocol_rev": "dd6fb5d8b536e19cedb384d0bbf1f5631923f1e8",
"yaml_edit_rev": "4fadb43801b07f90b3f0c6065dbce4efc6d8d55e",
"yaml_rev": "ad0779d1baa25c6b10a192d080efc45de02b6a32",
- "zlib_rev": "bf44340d1b6be1af8950bbdf664fec0cf5a831cc",
+ "zlib_rev": "faff052b6b6edcd6dd548513fe44ac0941427bf0",
"crashpad_rev": "bf327d8ceb6a669607b0dbab5a83a275d03f99ed",
"minichromium_rev": "8d641e30a8b12088649606b912c2bc4947419ccc",
"googletest_rev": "f854f1d27488996dc8a6db3c9453f80b02585e12",
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/field_formal_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/field_formal_contributor.dart
index daa7ef1..e2ed9a99 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/field_formal_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/field_formal_contributor.dart
@@ -52,23 +52,26 @@
}
}
- var enclosingClass = constructor.thisOrAncestorOfType<ClassDeclaration>();
+ ClassElement? enclosingClass;
+ var constructorParent = constructor.parent;
+ if (constructorParent is ClassDeclaration) {
+ enclosingClass = constructorParent.declaredElement;
+ } else if (constructorParent is EnumDeclaration) {
+ enclosingClass = constructorParent.declaredElement;
+ } else {
+ return;
+ }
if (enclosingClass == null) {
return;
}
// Add suggestions for fields that are not already referenced.
- for (var member in enclosingClass.members) {
- if (member is FieldDeclaration && !member.isStatic) {
- for (var variable in member.fields.variables) {
- var field = variable.name.staticElement;
- if (field is FieldElement) {
- var fieldName = field.name;
- if (fieldName.isNotEmpty) {
- if (!referencedFields.contains(fieldName)) {
- builder.suggestFieldFormalParameter(field);
- }
- }
+ for (var field in enclosingClass.fields) {
+ if (!field.isSynthetic && !field.isEnumConstant && !field.isStatic) {
+ var fieldName = field.name;
+ if (fieldName.isNotEmpty) {
+ if (!referencedFields.contains(fieldName)) {
+ builder.suggestFieldFormalParameter(field);
}
}
}
diff --git a/pkg/analysis_server/test/services/completion/dart/location/field_formal_parameter_test.dart b/pkg/analysis_server/test/services/completion/dart/location/field_formal_parameter_test.dart
index 41f4004..68b4c68 100644
--- a/pkg/analysis_server/test/services/completion/dart/location/field_formal_parameter_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/field_formal_parameter_test.dart
@@ -30,66 +30,63 @@
}
mixin SuperFormalParameterTestCases on AbstractCompletionDriverTest {
- /// https://github.com/dart-lang/sdk/issues/39028
- Future<void> test_mixin_constructor() async {
- var response = await getTestCodeSuggestions('''
-mixin M {
- var field = 0;
- M(this.^);
-}
-''');
-
- check(response).suggestions.isEmpty;
+ Future<void> test_class_replacement_left() async {
+ _checkContainers(
+ declarations: 'var field = 0;',
+ constructorParameters: 'this.f^',
+ validator: (response) {
+ check(response)
+ ..hasReplacement(left: 1)
+ ..suggestions.matchesInAnyOrder([
+ (suggestion) => suggestion
+ ..completion.isEqualTo('field')
+ ..isField
+ ..returnType.isEqualTo('int'),
+ ]);
+ },
+ );
}
- Future<void> test_replacement_left() async {
- var response = await getTestCodeSuggestions('''
-class A {
- var field = 0;
- A(this.f^);
-}
-''');
-
- check(response)
- ..hasReplacement(left: 1)
- ..suggestions.matchesInAnyOrder([
- (suggestion) => suggestion
- ..completion.isEqualTo('field')
- ..isField
- ..returnType.isEqualTo('int'),
- ]);
+ Future<void> test_class_replacement_right() async {
+ _checkContainers(
+ declarations: 'var field = 0;',
+ constructorParameters: 'this.^f',
+ validator: (response) {
+ check(response)
+ ..hasReplacement(right: 1)
+ ..suggestions.matchesInAnyOrder([
+ (suggestion) => suggestion
+ ..completion.isEqualTo('field')
+ ..isField
+ ..returnType.isEqualTo('int'),
+ ]);
+ },
+ );
}
- Future<void> test_replacement_right() async {
+ Future<void> test_class_suggestions_instanceFields_local() async {
var response = await getTestCodeSuggestions('''
class A {
- var field = 0;
- A(this.^f);
-}
-''');
-
- check(response)
- ..hasReplacement(right: 1)
- ..suggestions.matchesInAnyOrder([
- (suggestion) => suggestion
- ..completion.isEqualTo('field')
- ..isField
- ..returnType.isEqualTo('int'),
- ]);
- }
-
- Future<void> test_suggestions_onlyLocal() async {
- var response = await getTestCodeSuggestions('''
-class A {
+ static final superStatic = 0;
var inherited = 0;
+
+ void superMethod() {}
+ int get superGetter => 0;
+ void superSetter(int _) {}
}
class B extends A {
+ static final thisStatic = 0;
+
var first = 0;
var second = 1.2;
+
B(this.^);
- B.constructor() {}
- void method() {}
+ B.otherConstructor() {}
+
+ void thisMethod() {}
+ int get thisGetter => 0;
+ void thisSetter(int _) {}
}
''');
@@ -107,12 +104,56 @@
]);
}
- Future<void> test_suggestions_onlyNotSpecified_optionalNamed() async {
+ Future<void> test_class_suggestions_onlyNotSpecified_optionalNamed() async {
+ _checkContainers(
+ declarations: 'final int x; final int y;',
+ constructorParameters: '{this.x, this.^}',
+ validator: (response) {
+ check(response)
+ ..hasEmptyReplacement()
+ ..suggestions.matchesInAnyOrder([
+ (suggestion) => suggestion
+ ..completion.isEqualTo('y')
+ ..isField
+ ..returnType.isEqualTo('int'),
+ ]);
+ },
+ );
+ }
+
+ Future<void>
+ test_class_suggestions_onlyNotSpecified_requiredPositional() async {
+ _checkContainers(
+ declarations: 'final int x; final int y;',
+ constructorParameters: 'this.x, this.^',
+ validator: (response) {
+ check(response)
+ ..hasEmptyReplacement()
+ ..suggestions.matchesInAnyOrder([
+ (suggestion) => suggestion
+ ..completion.isEqualTo('y')
+ ..isField
+ ..returnType.isEqualTo('int'),
+ ]);
+ },
+ );
+ }
+
+ Future<void> test_enum_suggestions_instanceFields() async {
var response = await getTestCodeSuggestions('''
-class Point {
- final int x;
- final int y;
- Point({this.x, this.^});
+enum E {
+ v();
+
+ static final zero = 0;
+ final int first;
+ final double second;
+
+ E(this.^);
+ E.otherConstructor();
+
+ void myMethod() {}
+ int get myGetter => 0;
+ void mySetter(int _) {}
}
''');
@@ -120,28 +161,53 @@
..hasEmptyReplacement()
..suggestions.matchesInAnyOrder([
(suggestion) => suggestion
- ..completion.isEqualTo('y')
+ ..completion.isEqualTo('first')
..isField
..returnType.isEqualTo('int'),
+ (suggestion) => suggestion
+ ..completion.isEqualTo('second')
+ ..isField
+ ..returnType.isEqualTo('double'),
]);
}
- Future<void> test_suggestions_onlyNotSpecified_requiredPositional() async {
+ /// https://github.com/dart-lang/sdk/issues/39028
+ Future<void> test_mixin_constructor() async {
var response = await getTestCodeSuggestions('''
-class Point {
- final int x;
- final int y;
- Point(this.x, this.^);
+mixin M {
+ var field = 0;
+ M(this.^);
}
''');
- check(response)
- ..hasEmptyReplacement()
- ..suggestions.matchesInAnyOrder([
- (suggestion) => suggestion
- ..completion.isEqualTo('y')
- ..isField
- ..returnType.isEqualTo('int'),
- ]);
+ check(response).suggestions.isEmpty;
+ }
+
+ Future<void> _checkContainers({
+ required String declarations,
+ required String constructorParameters,
+ required void Function(CompletionResponseForTesting response) validator,
+ }) async {
+ // class
+ {
+ var response = await getTestCodeSuggestions('''
+class A {
+ $declarations
+ A($constructorParameters);
+}
+''');
+ validator(response);
+ }
+ // enum
+ {
+ var response = await getTestCodeSuggestions('''
+enum E {
+ v;
+ $declarations
+ E($constructorParameters);
+}
+''');
+ validator(response);
+ }
}
}
diff --git a/runtime/vm/os_macos.cc b/runtime/vm/os_macos.cc
index eed635d..05f9ee4 100644
--- a/runtime/vm/os_macos.cc
+++ b/runtime/vm/os_macos.cc
@@ -106,6 +106,12 @@
}
int64_t OS::GetCurrentThreadCPUMicros() {
+ if (__builtin_available(macOS 10.12, iOS 10.0, *)) {
+ // This is more efficient when available.
+ return clock_gettime_nsec_np(CLOCK_THREAD_CPUTIME_ID) /
+ kNanosecondsPerMicrosecond;
+ }
+
mach_msg_type_number_t count = THREAD_BASIC_INFO_COUNT;
thread_basic_info_data_t info_data;
thread_basic_info_t info = &info_data;
diff --git a/tools/VERSION b/tools/VERSION
index 349b693..caf2558 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -28,4 +28,4 @@
MINOR 17
PATCH 0
PRERELEASE 266
-PRERELEASE_PATCH 1
\ No newline at end of file
+PRERELEASE_PATCH 5
\ No newline at end of file