Version 2.18.0-86.0.dev
Merge commit '7359e2dd7d96e0f019c216aab195f388f79084f2' into 'dev'
diff --git a/DEPS b/DEPS
index f05fe30..52a18ec 100644
--- a/DEPS
+++ b/DEPS
@@ -125,7 +125,7 @@
"linter_rev": "14c916a16e78315e212cf79e7ccf4c19159a1bda",
"lints_rev": "8294e5648ab49474541527e2911e72e4c5aefe55",
"logging_rev": "dfbe88b890c3b4f7bc06da5a7b3b43e9e263b688",
- "markdown_rev": "7479783f0493f6717e1d7ae31cb37d39a91026b2",
+ "markdown_rev": "5699cafa9ef004875fd7de8ae9ea00e5295e87a4", # 5.0.0
"markupsafe_rev": "8f45f5cfa0009d2a70589bcda0349b8cb2b72783",
"matcher_rev": "07595a7739d47a8315caba5a8e58fb9ae3d81261",
"mime_rev": "c2c5ffd594674f32dc277521369da1557a1622d3",
diff --git a/pkg/analysis_server/analysis_options.yaml b/pkg/analysis_server/analysis_options.yaml
index 1b77fd0..548d7ea 100644
--- a/pkg/analysis_server/analysis_options.yaml
+++ b/pkg/analysis_server/analysis_options.yaml
@@ -22,8 +22,6 @@
non_constant_identifier_names: ignore
overridden_fields: ignore
prefer_function_declarations_over_variables: ignore
- # todo: add ignore to `protocol_generated.dart`
- prefer_interpolation_to_compose_strings: ignore
prefer_void_to_null: ignore
provide_deprecation_message: ignore
diff --git a/pkg/analysis_server/lib/protocol/protocol_constants.dart b/pkg/analysis_server/lib/protocol/protocol_constants.dart
index 24ad02a..cc63b35 100644
--- a/pkg/analysis_server/lib/protocol/protocol_constants.dart
+++ b/pkg/analysis_server/lib/protocol/protocol_constants.dart
@@ -6,6 +6,9 @@
// To regenerate the file, use the script
// "pkg/analysis_server/tool/spec/generate_files".
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: prefer_interpolation_to_compose_strings
+
const String PROTOCOL_VERSION = '1.33.0';
const String ANALYSIS_NOTIFICATION_ANALYZED_FILES = 'analysis.analyzedFiles';
diff --git a/pkg/analysis_server/lib/protocol/protocol_generated.dart b/pkg/analysis_server/lib/protocol/protocol_generated.dart
index 37339ee..3db69c3 100644
--- a/pkg/analysis_server/lib/protocol/protocol_generated.dart
+++ b/pkg/analysis_server/lib/protocol/protocol_generated.dart
@@ -6,6 +6,9 @@
// To regenerate the file, use the script
// "pkg/analysis_server/tool/spec/generate_files".
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: prefer_interpolation_to_compose_strings
+
import 'dart:convert' hide JsonDecoder;
import 'package:analysis_server/protocol/protocol.dart';
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
index ce04f9e..f86e1d8 100644
--- a/pkg/analysis_server/test/domain_completion_test.dart
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -2374,9 +2374,9 @@
// Wait for analysis then edit the content
await waitForTasksFinished();
- var revisedContent = testFileContent.substring(0, 0) +
- 'i' +
- testFileContent.substring(completionOffset);
+ var precedingContent = testFileContent.substring(0, 0);
+ var trailingContent = testFileContent.substring(completionOffset);
+ var revisedContent = '${precedingContent}i$trailingContent';
++completionOffset;
server.handleRequest(AnalysisUpdateContentParams(
{testFile.path: AddContentOverlay(revisedContent)}).toRequest('add1'));
diff --git a/pkg/analysis_server/test/integration/support/integration_test_methods.dart b/pkg/analysis_server/test/integration/support/integration_test_methods.dart
index e577b4f..98d2823 100644
--- a/pkg/analysis_server/test/integration/support/integration_test_methods.dart
+++ b/pkg/analysis_server/test/integration/support/integration_test_methods.dart
@@ -6,6 +6,9 @@
// To regenerate the file, use the script
// "pkg/analysis_server/tool/spec/generate_files".
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: prefer_interpolation_to_compose_strings
+
/// Convenience methods for running integration tests.
import 'dart:async';
diff --git a/pkg/analysis_server/test/integration/support/protocol_matchers.dart b/pkg/analysis_server/test/integration/support/protocol_matchers.dart
index c1c7fcc..3e1fb05 100644
--- a/pkg/analysis_server/test/integration/support/protocol_matchers.dart
+++ b/pkg/analysis_server/test/integration/support/protocol_matchers.dart
@@ -6,6 +6,9 @@
// To regenerate the file, use the script
// "pkg/analysis_server/tool/spec/generate_files".
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: prefer_interpolation_to_compose_strings
+
/// Matchers for data types defined in the analysis server API.
import 'package:test/test.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/assign_to_local_variable_test.dart b/pkg/analysis_server/test/src/services/correction/assist/assign_to_local_variable_test.dart
index f2c08ed..3751d7f 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/assign_to_local_variable_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/assign_to_local_variable_test.dart
@@ -23,7 +23,7 @@
Future<void> test_alreadyAssignment() async {
await resolveTestCode('''
-main() {
+void f() {
var vvv;
vvv = 42;
}
@@ -33,14 +33,14 @@
Future<void> test_inClosure() async {
await resolveTestCode(r'''
-main() {
+void f() {
print(() {
12345;
});
}
''');
await assertHasAssistAt('345', '''
-main() {
+void f() {
print(() {
var i = 12345;
});
@@ -50,14 +50,14 @@
Future<void> test_invocation() async {
await resolveTestCode('''
-main() {
+void f() {
List<int> bytes;
readBytes();
}
List<int> readBytes() => <int>[];
''');
await assertHasAssistAt('readBytes();', '''
-main() {
+void f() {
List<int> bytes;
var readBytes = readBytes();
}
@@ -72,10 +72,10 @@
Future<void> test_invocationArgument() async {
await resolveTestCode(r'''
-main() {
- f(12345);
+void f() {
+ g(12345);
}
-void f(p) {}
+void g(p) {}
''');
await assertNoAssistAt('345');
}
@@ -83,12 +83,12 @@
Future<void> test_lint_prefer_final_locals() async {
createAnalysisOptionsFile(lints: [LintNames.prefer_final_locals]);
await resolveTestCode(r'''
-main() {
+void f() {
12345;
}
''');
await assertHasAssistAt('345', '''
-main() {
+void f() {
final i = 12345;
}
''');
@@ -107,7 +107,7 @@
Future<void> test_throw() async {
await resolveTestCode('''
-main() {
+void f() {
throw 42;
}
''');
@@ -116,10 +116,10 @@
Future<void> test_void() async {
await resolveTestCode('''
-main() {
+void f() {
f();
}
-void f() {}
+void g() {}
''');
await assertNoAssistAt('f();');
}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_into_async_body_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_into_async_body_test.dart
index d524c70..80e762e 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_into_async_body_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_into_async_body_test.dart
@@ -37,13 +37,13 @@
Future<void> test_closure() async {
await resolveTestCode('''
-main() {
+void h() {
f(() => 123);
}
f(g) {}
''');
await assertHasAssistAt('=>', '''
-main() {
+void h() {
f(() async => 123);
}
f(g) {}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_into_block_body_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_into_block_body_test.dart
index c135fc2..fb714b5 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_into_block_body_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_into_block_body_test.dart
@@ -37,13 +37,13 @@
Future<void> test_closure() async {
await resolveTestCode('''
setup(x) {}
-main() {
+void f() {
setup(() => 42);
}
''');
await assertHasAssistAt('() => 42', '''
setup(x) {}
-main() {
+void f() {
setup(() {
return 42;
});
@@ -55,13 +55,13 @@
Future<void> test_closure_voidExpression() async {
await resolveTestCode('''
setup(x) {}
-main() {
+void f() {
setup(() => print('done'));
}
''');
await assertHasAssistAt('() => print', '''
setup(x) {}
-main() {
+void f() {
setup(() {
print('done');
});
@@ -91,7 +91,7 @@
Future<void> test_inExpression() async {
await resolveTestCode('''
-main() => 123;
+void f() => 123;
''');
await assertNoAssistAt('123;');
}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_into_expression_body_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_into_expression_body_test.dart
index 10ba918..a7d246b 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_into_expression_body_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_into_expression_body_test.dart
@@ -59,7 +59,7 @@
Future<void> test_closure() async {
await resolveTestCode('''
setup(x) {}
-main() {
+void f() {
setup(() {
return 42;
});
@@ -67,7 +67,7 @@
''');
await assertHasAssistAt('return', '''
setup(x) {}
-main() {
+void f() {
setup(() => 42);
}
''');
@@ -76,7 +76,7 @@
Future<void> test_closure_hasBlockComment_afterReturnStatement() async {
await resolveTestCode('''
setup(x) {}
-main() {
+void f() {
setup(() {
return 42;
// Comment.
@@ -89,7 +89,7 @@
Future<void> test_closure_hasBlockComment_beforeReturnKeyword() async {
await resolveTestCode('''
setup(x) {}
-main() {
+void f() {
setup(() {
// Comment.
return 42;
@@ -102,7 +102,7 @@
Future<void> test_closure_hasBlockComment_multiple() async {
await resolveTestCode('''
setup(x) {}
-main() {
+void f() {
setup(() {
// Comment.
@@ -117,7 +117,7 @@
Future<void> test_closure_hasInlineComment_beforeBodyKeyword() async {
await resolveTestCode('''
setup(x) {}
-main() {
+void f() {
setup(() /* Comment. */ async {
return 42;
});
@@ -129,7 +129,7 @@
Future<void> test_closure_hasInlineComment_beforeOpenBrace() async {
await resolveTestCode('''
setup(x) {}
-main() {
+void f() {
setup(() /* Comment. */ {
return 42;
});
@@ -141,7 +141,7 @@
Future<void> test_closure_hasInlineComment_beforeReturn() async {
await resolveTestCode('''
setup(x) {}
-main() {
+void f() {
setup(() {
/* Comment. */
return 42;
@@ -154,7 +154,7 @@
Future<void> test_closure_hasInlineComment_beforeReturnSemicolon() async {
await resolveTestCode('''
setup(x) {}
-main() {
+void f() {
setup(() {
return 42 /* Comment. */;
});
@@ -166,7 +166,7 @@
Future<void> test_closure_voidExpression() async {
await resolveTestCode('''
setup(x) {}
-main() {
+void f() {
setup((_) {
print('test');
});
@@ -174,7 +174,7 @@
''');
await assertHasAssistAt('(_) {', '''
setup(x) {}
-main() {
+void f() {
setup((_) => print('test'));
}
''');
@@ -236,7 +236,7 @@
Future<void> test_inExpression() async {
await resolveTestCode('''
-main() {
+int f() {
return 42;
}
''');
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_double_quoted_string_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_double_quoted_string_test.dart
index 813e4bc..12cc175 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_double_quoted_string_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_double_quoted_string_test.dart
@@ -21,7 +21,7 @@
Future<void> test_one_embeddedTarget() async {
await resolveTestCode('''
-main() {
+void f() {
print('a"b"c');
}
''');
@@ -30,7 +30,7 @@
Future<void> test_one_enclosingTarget() async {
await resolveTestCode('''
-main() {
+void f() {
print("abc");
}
''');
@@ -39,14 +39,14 @@
Future<void> test_one_interpolation() async {
await resolveTestCode(r'''
-main() {
+void f() {
var b = 'b';
var c = 'c';
print('a $b-${c} d');
}
''');
await assertHasAssistAt(r"'a $b", r'''
-main() {
+void f() {
var b = 'b';
var c = 'c';
print("a $b-${c} d");
@@ -66,12 +66,12 @@
Future<void> test_one_raw() async {
await resolveTestCode('''
-main() {
+void f() {
print(r'abc');
}
''');
await assertHasAssistAt("'ab", '''
-main() {
+void f() {
print(r"abc");
}
''');
@@ -79,12 +79,12 @@
Future<void> test_one_simple() async {
await resolveTestCode('''
-main() {
+void f() {
print('abc');
}
''');
await assertHasAssistAt("'ab", '''
-main() {
+void f() {
print("abc");
}
''');
@@ -102,7 +102,7 @@
Future<void> test_three_embeddedTarget() async {
await resolveTestCode("""
-main() {
+void f() {
print('''a""\"c''');
}
""");
@@ -111,7 +111,7 @@
Future<void> test_three_enclosingTarget() async {
await resolveTestCode('''
-main() {
+void f() {
print("""abc""");
}
''');
@@ -120,14 +120,14 @@
Future<void> test_three_interpolation() async {
await resolveTestCode(r"""
-main() {
+void f() {
var b = 'b';
var c = 'c';
print('''a $b-${c} d''');
}
""");
await assertHasAssistAt(r"'a $b", r'''
-main() {
+void f() {
var b = 'b';
var c = 'c';
print("""a $b-${c} d""");
@@ -137,12 +137,12 @@
Future<void> test_three_raw() async {
await resolveTestCode("""
-main() {
+void f() {
print(r'''abc''');
}
""");
await assertHasAssistAt("'ab", '''
-main() {
+void f() {
print(r"""abc""");
}
''');
@@ -150,12 +150,12 @@
Future<void> test_three_simple() async {
await resolveTestCode("""
-main() {
+void f() {
print('''abc''');
}
""");
await assertHasAssistAt("'ab", '''
-main() {
+void f() {
print("""abc""");
}
''');
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_multiline_string_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_multiline_string_test.dart
index 1e52915..e18bece 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_multiline_string_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_multiline_string_test.dart
@@ -21,12 +21,12 @@
Future<void> test_doubleQuoted() async {
await resolveTestCode('''
-main() {
+void f() {
print("abc");
}
''');
await assertHasAssistAt('abc', '''
-main() {
+void f() {
print("""
abc""");
}
@@ -35,7 +35,7 @@
Future<void> test_doubleQuoted_alreadyMultiline() async {
await resolveTestCode('''
-main() {
+void f() {
print("""abc""");
}
''');
@@ -44,7 +44,7 @@
Future<void> test_doubleQuoted_interpolation_expressionElement() async {
await resolveTestCode(r"""
-main() {
+void f() {
var b = 'b';
var c = 'c';
print("a $b - ${c} d");
@@ -55,14 +55,14 @@
Future<void> test_doubleQuoted_interpolation_stringElement_begin() async {
await resolveTestCode(r"""
-main() {
+void f() {
var b = 'b';
var c = 'c';
print("a $b - ${c} d");
}
""");
await assertHasAssistAt('"a ', r'''
-main() {
+void f() {
var b = 'b';
var c = 'c';
print("""
@@ -73,14 +73,14 @@
Future<void> test_doubleQuoted_interpolation_stringElement_middle() async {
await resolveTestCode(r"""
-main() {
+void f() {
var b = 'b';
var c = 'c';
print("a $b - ${c} d");
}
""");
await assertHasAssistAt('- ', r'''
-main() {
+void f() {
var b = 'b';
var c = 'c';
print("""
@@ -91,12 +91,12 @@
Future<void> test_doubleQuoted_raw() async {
await resolveTestCode('''
-main() {
+void f() {
print(r"abc");
}
''');
await assertHasAssistAt('abc', '''
-main() {
+void f() {
print(r"""
abc""");
}
@@ -125,12 +125,12 @@
Future<void> test_singleQuoted() async {
await resolveTestCode('''
-main() {
+void f() {
print('abc');
}
''');
await assertHasAssistAt('abc', """
-main() {
+void f() {
print('''
abc''');
}
@@ -139,7 +139,7 @@
Future<void> test_singleQuoted_interpolation_expressionElement() async {
await resolveTestCode(r"""
-main() {
+void f() {
var b = 'b';
var c = 'c';
print('a $b - ${c} d');
@@ -150,14 +150,14 @@
Future<void> test_singleQuoted_interpolation_stringElement_begin() async {
await resolveTestCode(r"""
-main() {
+void f() {
var b = 'b';
var c = 'c';
print('a $b - ${c} d');
}
""");
await assertHasAssistAt("'a ", r"""
-main() {
+void f() {
var b = 'b';
var c = 'c';
print('''
@@ -168,14 +168,14 @@
Future<void> test_singleQuoted_interpolation_stringElement_middle() async {
await resolveTestCode(r"""
-main() {
+void f() {
var b = 'b';
var c = 'c';
print('a $b - ${c} d');
}
""");
await assertHasAssistAt('- ', r"""
-main() {
+void f() {
var b = 'b';
var c = 'c';
print('''
@@ -186,12 +186,12 @@
Future<void> test_singleQuoted_raw() async {
await resolveTestCode('''
-main() {
+void f() {
print(r'abc');
}
''');
await assertHasAssistAt('abc', """
-main() {
+void f() {
print(r'''
abc''');
}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_single_quoted_string_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_single_quoted_string_test.dart
index 4214de8..0085058 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_single_quoted_string_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_single_quoted_string_test.dart
@@ -22,7 +22,7 @@
Future<void> test_one_embeddedTarget() async {
await resolveTestCode('''
-main() {
+void f() {
print("a'b'c");
}
''');
@@ -31,7 +31,7 @@
Future<void> test_one_enclosingTarget() async {
await resolveTestCode('''
-main() {
+void f() {
print('abc');
}
''');
@@ -40,14 +40,14 @@
Future<void> test_one_interpolation() async {
await resolveTestCode(r'''
-main() {
+void f() {
var b = 'b';
var c = 'c';
print("a $b-${c} d");
}
''');
await assertHasAssistAt(r'"a $b', r'''
-main() {
+void f() {
var b = 'b';
var c = 'c';
print('a $b-${c} d');
@@ -67,12 +67,12 @@
Future<void> test_one_raw() async {
await resolveTestCode('''
-main() {
+void f() {
print(r"abc");
}
''');
await assertHasAssistAt('"ab', '''
-main() {
+void f() {
print(r'abc');
}
''');
@@ -80,12 +80,12 @@
Future<void> test_one_simple() async {
await resolveTestCode('''
-main() {
+void f() {
print("abc");
}
''');
await assertHasAssistAt('"ab', '''
-main() {
+void f() {
print('abc');
}
''');
@@ -95,7 +95,7 @@
createAnalysisOptionsFile(lints: [LintNames.prefer_single_quotes]);
verifyNoTestUnitErrors = false;
await resolveTestCode('''
-main() {
+void f() {
print("abc");
}
''');
@@ -114,7 +114,7 @@
Future<void> test_three_embeddedTarget() async {
await resolveTestCode('''
-main() {
+void f() {
print("""a''\'bc""");
}
''');
@@ -123,7 +123,7 @@
Future<void> test_three_enclosingTarget() async {
await resolveTestCode("""
-main() {
+void f() {
print('''abc''');
}
""");
@@ -132,14 +132,14 @@
Future<void> test_three_interpolation() async {
await resolveTestCode(r'''
-main() {
+void f() {
var b = 'b';
var c = 'c';
print("""a $b-${c} d""");
}
''');
await assertHasAssistAt(r'"a $b', r"""
-main() {
+void f() {
var b = 'b';
var c = 'c';
print('''a $b-${c} d''');
@@ -149,12 +149,12 @@
Future<void> test_three_raw() async {
await resolveTestCode('''
-main() {
+void f() {
print(r"""abc""");
}
''');
await assertHasAssistAt('"ab', """
-main() {
+void f() {
print(r'''abc''');
}
""");
@@ -162,12 +162,12 @@
Future<void> test_three_simple() async {
await resolveTestCode('''
-main() {
+void f() {
print("""abc""");
}
''');
await assertHasAssistAt('"ab', """
-main() {
+void f() {
print('''abc''');
}
""");
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_stateful_widget_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_stateful_widget_test.dart
index dfb00eb..5e11735 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_stateful_widget_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_stateful_widget_test.dart
@@ -431,7 +431,7 @@
Future<void> test_notClass() async {
await resolveTestCode('''
import 'package:flutter/material.dart';
-/*caret*/main() {}
+/*caret*/void f() {}
''');
await assertNoAssist();
}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_move_down_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_move_down_test.dart
index 3ed98b5..11960c7 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_move_down_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_move_down_test.dart
@@ -30,7 +30,7 @@
Future<void> test_first() async {
await resolveTestCode('''
import 'package:flutter/material.dart';
-main() {
+void f() {
Column(
children: <Widget>[
Text('aaa'),
@@ -42,7 +42,7 @@
''');
await assertHasAssist('''
import 'package:flutter/material.dart';
-main() {
+void f() {
Column(
children: <Widget>[
Text('aaa'),
@@ -58,7 +58,7 @@
Future<void> test_last() async {
await resolveTestCode('''
import 'package:flutter/material.dart';
-main() {
+void f() {
Column(
children: <Widget>[
Text('aaa'),
@@ -74,7 +74,7 @@
Future<void> test_notInList() async {
await resolveTestCode('''
import 'package:flutter/material.dart';
-main() {
+void f() {
Center(
child: /*caret*/Text('aaa'),
);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_move_up_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_move_up_test.dart
index 905d316..80ed31d 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_move_up_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_move_up_test.dart
@@ -30,7 +30,7 @@
Future<void> test_first() async {
await resolveTestCode('''
import 'package:flutter/material.dart';
-main() {
+void f() {
Column(
children: <Widget>[
/*caret*/Text('aaa'),
@@ -46,7 +46,7 @@
Future<void> test_last() async {
await resolveTestCode('''
import 'package:flutter/material.dart';
-main() {
+void f() {
Column(
children: <Widget>[
Text('aaa'),
@@ -58,7 +58,7 @@
''');
await assertHasAssist('''
import 'package:flutter/material.dart';
-main() {
+void f() {
Column(
children: <Widget>[
Text('bbbbbb'),
@@ -74,7 +74,7 @@
Future<void> test_notInList() async {
await resolveTestCode('''
import 'package:flutter/material.dart';
-main() {
+void f() {
Center(
child: /*caret*/Text('aaa'),
);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_remove_widget_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_remove_widget_test.dart
index b4571e7..bf52357 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_remove_widget_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_remove_widget_test.dart
@@ -36,7 +36,7 @@
Future<void> test_childIntoChild_multiLine() async {
await resolveTestCode('''
import 'package:flutter/material.dart';
-main() {
+void f() {
Column(
children: [
Center(
@@ -54,7 +54,7 @@
''');
await assertHasAssist('''
import 'package:flutter/material.dart';
-main() {
+void f() {
Column(
children: [
Center(
@@ -72,7 +72,7 @@
Future<void> test_childIntoChild_singleLine() async {
await resolveTestCode('''
import 'package:flutter/material.dart';
-main() {
+void f() {
Padding(
padding: const EdgeInsets.all(8.0),
child: /*caret*/Center(
@@ -84,7 +84,7 @@
''');
await assertHasAssist('''
import 'package:flutter/material.dart';
-main() {
+void f() {
Padding(
padding: const EdgeInsets.all(8.0),
child: Text('foo'),
@@ -96,7 +96,7 @@
Future<void> test_childIntoChildren() async {
await resolveTestCode('''
import 'package:flutter/material.dart';
-main() {
+void f() {
Column(
children: [
Text('foo'),
@@ -114,7 +114,7 @@
''');
await assertHasAssist('''
import 'package:flutter/material.dart';
-main() {
+void f() {
Column(
children: [
Text('foo'),
@@ -132,7 +132,7 @@
Future<void> test_childrenMultipleIntoChild() async {
await resolveTestCode('''
import 'package:flutter/material.dart';
-main() {
+void f() {
Center(
child: /*caret*/Row(
children: [
@@ -149,7 +149,7 @@
Future<void> test_childrenOneIntoChild() async {
await resolveTestCode('''
import 'package:flutter/material.dart';
-main() {
+void f() {
Center(
child: /*caret*/Column(
children: [
@@ -161,7 +161,7 @@
''');
await assertHasAssist('''
import 'package:flutter/material.dart';
-main() {
+void f() {
Center(
child: Text('foo'),
);
@@ -172,7 +172,7 @@
Future<void> test_childrenOneIntoReturn() async {
await resolveTestCode('''
import 'package:flutter/material.dart';
-main() {
+Widget f() {
return /*caret*/Column(
children: [
Text('foo'),
@@ -182,7 +182,7 @@
''');
await assertHasAssist('''
import 'package:flutter/material.dart';
-main() {
+Widget f() {
return Text('foo');
}
''');
@@ -191,7 +191,7 @@
Future<void> test_intoChildren() async {
await resolveTestCode('''
import 'package:flutter/material.dart';
-main() {
+void f() {
Column(
children: [
Text('aaa'),
@@ -218,7 +218,7 @@
''');
await assertHasAssist('''
import 'package:flutter/material.dart';
-main() {
+void f() {
Column(
children: [
Text('aaa'),
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_surround_with_set_state_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_surround_with_set_state_test.dart
index 94aec91..ff6e892 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_surround_with_set_state_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_surround_with_set_state_test.dart
@@ -31,7 +31,7 @@
// This code selects the `CompilationUnit` node which has previously
// caused errors in code assuming the node would have a parent.
await resolveTestCode('''
-main() {
+void f() {
// start
print(0);
}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_parent_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_parent_test.dart
index 81aeb33..4980dea 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_parent_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_parent_test.dart
@@ -119,7 +119,7 @@
Future<void> test_outerIsInChildren() async {
await resolveTestCode('''
import 'package:flutter/material.dart';
-main() {
+void f() {
Column(
children: [
Column(
@@ -141,7 +141,7 @@
''');
await assertHasAssist('''
import 'package:flutter/material.dart';
-main() {
+void f() {
Column(
children: [
Column(
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_builder_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_builder_test.dart
index 019a040..32237d6 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_builder_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_builder_test.dart
@@ -31,7 +31,7 @@
await resolveTestCode('''
import 'package:flutter/widgets.dart';
-main() {
+void f() {
/*caret*/Builder(
builder: (context) => Text(''),
);
@@ -50,7 +50,7 @@
Widget build(BuildContext context) => Text('');
}
-main() {
+Widget f() {
return MyWidget./*caret*/named();
}
''');
@@ -63,7 +63,7 @@
Widget build(BuildContext context) => Text('');
}
-main() {
+Widget f() {
return Builder(
builder: (context) {
return MyWidget.named();
@@ -77,14 +77,14 @@
await resolveTestCode('''
import 'package:flutter/widgets.dart';
-main() {
+void f() {
/*caret*/Text('a');
}
''');
await assertHasAssist('''
import 'package:flutter/widgets.dart';
-main() {
+void f() {
Builder(
builder: (context) {
return Text('a');
@@ -98,7 +98,7 @@
await resolveTestCode('''
import 'package:flutter/widgets.dart';
-main() {
+void f() {
Widget w;
w = /*caret*/Container();
}
@@ -106,7 +106,7 @@
await assertHasAssist('''
import 'package:flutter/widgets.dart';
-main() {
+void f() {
Widget w;
w = Builder(
builder: (context) {
@@ -121,13 +121,13 @@
await resolveTestCode('''
import 'package:flutter/widgets.dart';
class FakeFlutter {
- main() => /*caret*/Container();
+ void f() => /*caret*/Container();
}
''');
await assertHasAssist('''
import 'package:flutter/widgets.dart';
class FakeFlutter {
- main() => Builder(
+ void f() => Builder(
builder: (context) {
return Container();
}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_center_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_center_test.dart
index 44e6ed2..40bedd9 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_center_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_center_test.dart
@@ -31,7 +31,7 @@
await resolveTestCode('''
import 'package:flutter/widgets.dart';
class FakeFlutter {
- main() {
+ Widget f() {
return /*caret*/Center();
}
}
@@ -43,7 +43,7 @@
await resolveTestCode('''
import 'package:flutter/widgets.dart';
class FakeFlutter {
- main() {
+ Widget f() {
return /*caret*/Container();
}
}
@@ -51,7 +51,7 @@
await assertHasAssist('''
import 'package:flutter/widgets.dart';
class FakeFlutter {
- main() {
+ Widget f() {
return Center(child: Container());
}
}
@@ -68,7 +68,7 @@
Widget build(BuildContext context) => Text('');
}
-main() {
+Widget f() {
return MyWidget./*caret*/named();
}
''');
@@ -81,7 +81,7 @@
Widget build(BuildContext context) => Text('');
}
-main() {
+Widget f() {
return Center(child: MyWidget.named());
}
''');
@@ -91,7 +91,7 @@
await resolveTestCode('''
import 'package:flutter/widgets.dart';
-main() {
+void f() {
Widget w;
w = /*caret*/Container();
}
@@ -99,7 +99,7 @@
await assertHasAssist('''
import 'package:flutter/widgets.dart';
-main() {
+void f() {
Widget w;
w = Center(child: Container());
}
@@ -110,13 +110,13 @@
await resolveTestCode('''
import 'package:flutter/widgets.dart';
class FakeFlutter {
- main() => /*caret*/Container();
+ Widget f() => /*caret*/Container();
}
''');
await assertHasAssist('''
import 'package:flutter/widgets.dart';
class FakeFlutter {
- main() => Center(child: Container());
+ Widget f() => Center(child: Container());
}
''');
}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_column_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_column_test.dart
index 5f53ffdd..96f643b 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_column_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_column_test.dart
@@ -65,7 +65,7 @@
import 'package:flutter/widgets.dart';
class FakeFlutter {
- main() {
+ Widget f() {
return Container(
child: /*caret*/Text('aaa'),
);
@@ -76,7 +76,7 @@
import 'package:flutter/widgets.dart';
class FakeFlutter {
- main() {
+ Widget f() {
return Container(
child: Column(
children: [
@@ -94,7 +94,7 @@
import 'package:flutter/widgets.dart';
class FakeFlutter {
- main() {
+ Widget f() {
return Row(children: [
Text('aaa'),
// start
@@ -110,7 +110,7 @@
import 'package:flutter/widgets.dart';
class FakeFlutter {
- main() {
+ Widget f() {
return Row(children: [
Text('aaa'),
Column(
@@ -131,7 +131,7 @@
import 'package:flutter/widgets.dart';
class FakeFlutter {
- main() {
+ Widget f() {
return Container(
child: Text/*caret*/('aaa'),
);
@@ -142,7 +142,7 @@
import 'package:flutter/widgets.dart';
class FakeFlutter {
- main() {
+ Widget f() {
return Container(
child: Column(
children: [
@@ -160,7 +160,7 @@
import 'package:flutter/widgets.dart';
class FakeFlutter {
- main() {
+ Widget f() {
return Container(
child: Text('aaa'),
);
@@ -173,7 +173,7 @@
import 'package:flutter/widgets.dart';
class FakeFlutter {
- main() {
+ Widget f() {
return Container(
child: Column(
children: [
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_container_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_container_test.dart
index 04702fa..e7cbaf1 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_container_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_container_test.dart
@@ -30,7 +30,7 @@
Future<void> test_aroundContainer() async {
await resolveTestCode('''
import 'package:flutter/widgets.dart';
-main() {
+Widget f() {
return /*caret*/Container();
}
''');
@@ -40,13 +40,13 @@
Future<void> test_aroundText() async {
await resolveTestCode('''
import 'package:flutter/widgets.dart';
-main() {
+void f() {
/*caret*/Text('a');
}
''');
await assertHasAssist('''
import 'package:flutter/widgets.dart';
-main() {
+void f() {
Container(child: Text('a'));
}
''');
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_padding_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_padding_test.dart
index 3a4961a..48dc9e0 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_padding_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_padding_test.dart
@@ -31,7 +31,7 @@
await resolveTestCode('''
import 'package:flutter/widgets.dart';
class FakeFlutter {
- main() {
+ Widget f() {
return /*caret*/Container();
}
}
@@ -39,7 +39,7 @@
await assertHasAssist('''
import 'package:flutter/widgets.dart';
class FakeFlutter {
- main() {
+ Widget f() {
return Padding(
padding: const EdgeInsets.all(8.0),
child: Container(),
@@ -53,7 +53,7 @@
await resolveTestCode('''
import 'package:flutter/widgets.dart';
class FakeFlutter {
- main() {
+ Widget f() {
return Padding(
padding: const EdgeInsets.all(8.0),
child: Container(),
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_row_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_row_test.dart
index a9e6554..c2c97bf 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_row_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_row_test.dart
@@ -32,7 +32,7 @@
import 'package:flutter/widgets.dart';
class FakeFlutter {
- main() {
+ Widget f() {
return Column(children: [
Text('aaa'),
// start
@@ -48,7 +48,7 @@
import 'package:flutter/widgets.dart';
class FakeFlutter {
- main() {
+ Widget f() {
return Column(children: [
Text('aaa'),
Row(
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_sized_box_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_sized_box_test.dart
index d01077a..32fdaeb 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_sized_box_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_sized_box_test.dart
@@ -33,7 +33,7 @@
await resolveTestCode('''
import 'package:flutter/widgets.dart';
class FakeFlutter {
- main() {
+ Widget f() {
return /*caret*/Container();
}
}
@@ -41,7 +41,7 @@
await assertHasAssist('''
import 'package:flutter/widgets.dart';
class FakeFlutter {
- main() {
+ Widget f() {
return SizedBox(child: Container());
}
}
@@ -58,7 +58,7 @@
Widget build(BuildContext context) => Text('');
}
-main() {
+Widget f() {
return MyWidget./*caret*/named();
}
''');
@@ -71,7 +71,7 @@
Widget build(BuildContext context) => Text('');
}
-main() {
+Widget f() {
return SizedBox(child: MyWidget.named());
}
''');
@@ -81,7 +81,7 @@
await resolveTestCode('''
import 'package:flutter/widgets.dart';
class FakeFlutter {
- main() {
+ Widget f() {
return /*caret*/SizedBox();
}
}
@@ -93,7 +93,7 @@
await resolveTestCode('''
import 'package:flutter/widgets.dart';
-main() {
+void f() {
Widget w;
w = /*caret*/Container();
}
@@ -101,7 +101,7 @@
await assertHasAssist('''
import 'package:flutter/widgets.dart';
-main() {
+void f() {
Widget w;
w = SizedBox(child: Container());
}
@@ -112,13 +112,13 @@
await resolveTestCode('''
import 'package:flutter/widgets.dart';
class FakeFlutter {
- main() => /*caret*/Container();
+ Widget f() => /*caret*/Container();
}
''');
await assertHasAssist('''
import 'package:flutter/widgets.dart';
class FakeFlutter {
- main() => SizedBox(child: Container());
+ Widget f() => SizedBox(child: Container());
}
''');
}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_stream_builder_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_stream_builder_test.dart
index 69847f9..389b609 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_stream_builder_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_stream_builder_test.dart
@@ -45,14 +45,14 @@
await resolveTestCode('''
import 'package:flutter/widgets.dart';
-main() {
+void f() {
/*caret*/Text('a');
}
''');
await assertHasAssist('''
import 'package:flutter/widgets.dart';
-main() {
+void f() {
StreamBuilder<Object>(
stream: null,
builder: (context, snapshot) {
diff --git a/pkg/analysis_server/test/src/services/correction/assist/invert_if_statement_test.dart b/pkg/analysis_server/test/src/services/correction/assist/invert_if_statement_test.dart
index b86a190..8714a3f 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/invert_if_statement_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/invert_if_statement_test.dart
@@ -21,7 +21,7 @@
Future<void> test_blocks() async {
await resolveTestCode('''
-main() {
+void f() {
if (true) {
0;
} else {
@@ -30,7 +30,7 @@
}
''');
await assertHasAssistAt('if (', '''
-main() {
+void f() {
if (false) {
1;
} else {
@@ -42,7 +42,7 @@
Future<void> test_statements() async {
await resolveTestCode('''
-main() {
+void f() {
if (true)
0;
else
@@ -50,7 +50,7 @@
}
''');
await assertHasAssistAt('if (', '''
-main() {
+void f() {
if (false)
1;
else
diff --git a/pkg/analysis_server/test/src/services/correction/assist/join_if_with_inner_test.dart b/pkg/analysis_server/test/src/services/correction/assist/join_if_with_inner_test.dart
index 3c19528..c24a598 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/join_if_with_inner_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/join_if_with_inner_test.dart
@@ -21,7 +21,7 @@
Future<void> test_conditionAndOr() async {
await resolveTestCode('''
-main() {
+void f() {
if (1 == 1) {
if (2 == 2 || 3 == 3) {
print(0);
@@ -30,7 +30,7 @@
}
''');
await assertHasAssistAt('if (1 ==', '''
-main() {
+void f() {
if (1 == 1 && (2 == 2 || 3 == 3)) {
print(0);
}
@@ -40,7 +40,7 @@
Future<void> test_conditionInvocation() async {
await resolveTestCode('''
-main() {
+void f() {
if (isCheck()) {
if (2 == 2) {
print(0);
@@ -50,7 +50,7 @@
bool isCheck() => false;
''');
await assertHasAssistAt('if (isCheck', '''
-main() {
+void f() {
if (isCheck() && 2 == 2) {
print(0);
}
@@ -61,7 +61,7 @@
Future<void> test_conditionOrAnd() async {
await resolveTestCode('''
-main() {
+void f() {
if (1 == 1 || 2 == 2) {
if (3 == 3) {
print(0);
@@ -70,7 +70,7 @@
}
''');
await assertHasAssistAt('if (1 ==', '''
-main() {
+void f() {
if ((1 == 1 || 2 == 2) && 3 == 3) {
print(0);
}
@@ -80,7 +80,7 @@
Future<void> test_innerNotIf() async {
await resolveTestCode('''
-main() {
+void f() {
if (1 == 1) {
print(0);
}
@@ -91,7 +91,7 @@
Future<void> test_innerWithElse() async {
await resolveTestCode('''
-main() {
+void f() {
if (1 == 1) {
if (2 == 2) {
print(0);
@@ -106,7 +106,7 @@
Future<void> test_onCondition() async {
await resolveTestCode('''
-main() {
+void f() {
if (1 == 1) {
if (2 == 2) {
print(0);
@@ -115,7 +115,7 @@
}
''');
await assertHasAssistAt('1 ==', '''
-main() {
+void f() {
if (1 == 1 && 2 == 2) {
print(0);
}
@@ -125,7 +125,7 @@
Future<void> test_simpleConditions_block_block() async {
await resolveTestCode('''
-main() {
+void f() {
if (1 == 1) {
if (2 == 2) {
print(0);
@@ -134,7 +134,7 @@
}
''');
await assertHasAssistAt('if (1 ==', '''
-main() {
+void f() {
if (1 == 1 && 2 == 2) {
print(0);
}
@@ -144,7 +144,7 @@
Future<void> test_simpleConditions_block_single() async {
await resolveTestCode('''
-main() {
+void f() {
if (1 == 1) {
if (2 == 2)
print(0);
@@ -152,7 +152,7 @@
}
''');
await assertHasAssistAt('if (1 ==', '''
-main() {
+void f() {
if (1 == 1 && 2 == 2) {
print(0);
}
@@ -162,7 +162,7 @@
Future<void> test_simpleConditions_single_blockMulti() async {
await resolveTestCode('''
-main() {
+void f() {
if (1 == 1) {
if (2 == 2) {
print(1);
@@ -173,7 +173,7 @@
}
''');
await assertHasAssistAt('if (1 ==', '''
-main() {
+void f() {
if (1 == 1 && 2 == 2) {
print(1);
print(2);
@@ -185,7 +185,7 @@
Future<void> test_simpleConditions_single_blockOne() async {
await resolveTestCode('''
-main() {
+void f() {
if (1 == 1)
if (2 == 2) {
print(0);
@@ -193,7 +193,7 @@
}
''');
await assertHasAssistAt('if (1 ==', '''
-main() {
+void f() {
if (1 == 1 && 2 == 2) {
print(0);
}
@@ -203,7 +203,7 @@
Future<void> test_statementAfterInner() async {
await resolveTestCode('''
-main() {
+void f() {
if (1 == 1) {
if (2 == 2) {
print(2);
@@ -217,7 +217,7 @@
Future<void> test_statementBeforeInner() async {
await resolveTestCode('''
-main() {
+void f() {
if (1 == 1) {
print(1);
if (2 == 2) {
@@ -231,7 +231,7 @@
Future<void> test_targetNotIf() async {
await resolveTestCode('''
-main() {
+void f() {
print(0);
}
''');
@@ -240,7 +240,7 @@
Future<void> test_targetWithElse() async {
await resolveTestCode('''
-main() {
+void f() {
if (1 == 1) {
if (2 == 2) {
print(0);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/join_if_with_outer_test.dart b/pkg/analysis_server/test/src/services/correction/assist/join_if_with_outer_test.dart
index a31c29e..5486082 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/join_if_with_outer_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/join_if_with_outer_test.dart
@@ -21,7 +21,7 @@
Future<void> test_conditionAndOr() async {
await resolveTestCode('''
-main() {
+void f() {
if (1 == 1) {
if (2 == 2 || 3 == 3) {
print(0);
@@ -30,7 +30,7 @@
}
''');
await assertHasAssistAt('if (2 ==', '''
-main() {
+void f() {
if (1 == 1 && (2 == 2 || 3 == 3)) {
print(0);
}
@@ -40,7 +40,7 @@
Future<void> test_conditionInvocation() async {
await resolveTestCode('''
-main() {
+void f() {
if (1 == 1) {
if (isCheck()) {
print(0);
@@ -50,7 +50,7 @@
bool isCheck() => false;
''');
await assertHasAssistAt('if (isCheck', '''
-main() {
+void f() {
if (1 == 1 && isCheck()) {
print(0);
}
@@ -61,7 +61,7 @@
Future<void> test_conditionOrAnd() async {
await resolveTestCode('''
-main() {
+void f() {
if (1 == 1 || 2 == 2) {
if (3 == 3) {
print(0);
@@ -70,7 +70,7 @@
}
''');
await assertHasAssistAt('if (3 == 3', '''
-main() {
+void f() {
if ((1 == 1 || 2 == 2) && 3 == 3) {
print(0);
}
@@ -80,7 +80,7 @@
Future<void> test_onCondition() async {
await resolveTestCode('''
-main() {
+void f() {
if (1 == 1) {
if (2 == 2) {
print(0);
@@ -89,7 +89,7 @@
}
''');
await assertHasAssistAt('if (2 == 2', '''
-main() {
+void f() {
if (1 == 1 && 2 == 2) {
print(0);
}
@@ -99,7 +99,7 @@
Future<void> test_outerNotIf() async {
await resolveTestCode('''
-main() {
+void f() {
if (1 == 1) {
print(0);
}
@@ -110,7 +110,7 @@
Future<void> test_outerWithElse() async {
await resolveTestCode('''
-main() {
+void f() {
if (1 == 1) {
if (2 == 2) {
print(0);
@@ -125,7 +125,7 @@
Future<void> test_simpleConditions_block_block() async {
await resolveTestCode('''
-main() {
+void f() {
if (1 == 1) {
if (2 == 2) {
print(0);
@@ -134,7 +134,7 @@
}
''');
await assertHasAssistAt('if (2 == 2', '''
-main() {
+void f() {
if (1 == 1 && 2 == 2) {
print(0);
}
@@ -144,7 +144,7 @@
Future<void> test_simpleConditions_block_single() async {
await resolveTestCode('''
-main() {
+void f() {
if (1 == 1) {
if (2 == 2)
print(0);
@@ -152,7 +152,7 @@
}
''');
await assertHasAssistAt('if (2 == 2', '''
-main() {
+void f() {
if (1 == 1 && 2 == 2) {
print(0);
}
@@ -162,7 +162,7 @@
Future<void> test_simpleConditions_single_blockMulti() async {
await resolveTestCode('''
-main() {
+void f() {
if (1 == 1) {
if (2 == 2) {
print(1);
@@ -173,7 +173,7 @@
}
''');
await assertHasAssistAt('if (2 == 2', '''
-main() {
+void f() {
if (1 == 1 && 2 == 2) {
print(1);
print(2);
@@ -185,7 +185,7 @@
Future<void> test_simpleConditions_single_blockOne() async {
await resolveTestCode('''
-main() {
+void f() {
if (1 == 1)
if (2 == 2) {
print(0);
@@ -193,7 +193,7 @@
}
''');
await assertHasAssistAt('if (2 == 2', '''
-main() {
+void f() {
if (1 == 1 && 2 == 2) {
print(0);
}
@@ -203,7 +203,7 @@
Future<void> test_statementAfterInner() async {
await resolveTestCode('''
-main() {
+void f() {
if (1 == 1) {
if (2 == 2) {
print(2);
@@ -217,7 +217,7 @@
Future<void> test_statementBeforeInner() async {
await resolveTestCode('''
-main() {
+void f() {
if (1 == 1) {
print(1);
if (2 == 2) {
@@ -231,7 +231,7 @@
Future<void> test_targetNotIf() async {
await resolveTestCode('''
-main() {
+void f() {
print(0);
}
''');
@@ -240,7 +240,7 @@
Future<void> test_targetWithElse() async {
await resolveTestCode('''
-main() {
+void f() {
if (1 == 1) {
if (2 == 2) {
print(0);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/remove_type_annotation_test.dart b/pkg/analysis_server/test/src/services/correction/assist/remove_type_annotation_test.dart
index e503c28..99f4ab7 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/remove_type_annotation_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/remove_type_annotation_test.dart
@@ -58,7 +58,7 @@
await resolveTestCode('''
class A {}
-main() {
+void f() {
A();
}
''');
@@ -67,12 +67,12 @@
Future<void> test_localVariable() async {
await resolveTestCode('''
-main() {
+void f() {
int a = 1, b = 2;
}
''');
await assertHasAssistAt('int ', '''
-main() {
+void f() {
var a = 1, b = 2;
}
''');
@@ -80,12 +80,12 @@
Future<void> test_localVariable_const() async {
await resolveTestCode('''
-main() {
+void f() {
const int v = 1;
}
''');
await assertHasAssistAt('int ', '''
-main() {
+void f() {
const v = 1;
}
''');
@@ -93,12 +93,12 @@
Future<void> test_localVariable_final() async {
await resolveTestCode('''
-main() {
+void f() {
final int v = 1;
}
''');
await assertHasAssistAt('int ', '''
-main() {
+void f() {
final v = 1;
}
''');
@@ -106,7 +106,7 @@
Future<void> test_localVariable_noInitializer() async {
await resolveTestCode('''
-main() {
+void f() {
int v;
}
''');
@@ -115,7 +115,7 @@
Future<void> test_localVariable_onInitializer() async {
await resolveTestCode('''
-main() {
+void f() {
final int v = 1;
}
''');
@@ -124,12 +124,12 @@
Future<void> test_loopVariable() async {
await resolveTestCode('''
-main() {
+void f() {
for(int i = 0; i < 3; i++) {}
}
''');
await assertHasAssistAt('int ', '''
-main() {
+void f() {
for(var i = 0; i < 3; i++) {}
}
''');
@@ -137,14 +137,14 @@
Future<void> test_loopVariable_nested() async {
await resolveTestCode('''
-main() {
+void f() {
var v = () {
for (int x in <int>[]) {}
};
}
''');
await assertHasAssistAt('int x', '''
-main() {
+void f() {
var v = () {
for (var x in <int>[]) {}
};
@@ -154,7 +154,7 @@
Future<void> test_loopVariable_noType() async {
await resolveTestCode('''
-main() {
+void f() {
for(var i = 0; i < 3; i++) {}
}
''');
diff --git a/pkg/analysis_server/test/src/services/correction/assist/replace_if_else_with_conditional_test.dart b/pkg/analysis_server/test/src/services/correction/assist/replace_if_else_with_conditional_test.dart
index 7641070..0e3d44e 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/replace_if_else_with_conditional_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/replace_if_else_with_conditional_test.dart
@@ -21,7 +21,7 @@
Future<void> test_assignment() async {
await resolveTestCode('''
-main() {
+void f() {
int vvv;
if (true) {
vvv = 111;
@@ -31,7 +31,7 @@
}
''');
await assertHasAssistAt('if (true)', '''
-main() {
+void f() {
int vvv;
vvv = true ? 111 : 222;
}
@@ -40,7 +40,7 @@
Future<void> test_expressionVsReturn() async {
await resolveTestCode('''
-main() {
+void f() {
if (true) {
print(42);
} else {
@@ -53,7 +53,7 @@
Future<void> test_notIfStatement() async {
await resolveTestCode('''
-main() {
+void f() {
print(0);
}
''');
@@ -62,7 +62,7 @@
Future<void> test_notSingleStatement() async {
await resolveTestCode('''
-main() {
+void f() {
int vvv;
if (true) {
print(0);
@@ -78,7 +78,7 @@
Future<void> test_return_expression_expression() async {
await resolveTestCode('''
-main() {
+int f() {
if (true) {
return 111;
} else {
@@ -87,7 +87,7 @@
}
''');
await assertHasAssistAt('if (true)', '''
-main() {
+int f() {
return true ? 111 : 222;
}
''');
diff --git a/pkg/analysis_server/test/src/services/correction/assist/sort_child_property_last_test.dart b/pkg/analysis_server/test/src/services/correction/assist/sort_child_property_last_test.dart
index b407482..c9d3e0e 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/sort_child_property_last_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/sort_child_property_last_test.dart
@@ -31,7 +31,7 @@
Future<void> test_already_sorted() async {
await resolveTestCode('''
import 'package:flutter/material.dart';
-main() {
+void f() {
Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
@@ -48,7 +48,7 @@
Future<void> test_already_sorted_one_prop() async {
await resolveTestCode('''
import 'package:flutter/material.dart';
-main() {
+void f() {
Column(
children: <Widget>[
Text('aaa'),
@@ -64,7 +64,7 @@
Future<void> test_no_children() async {
await resolveTestCode('''
import 'package:flutter/material.dart';
-main() {
+void f() {
Column(
crossAxisAlignment: CrossAxisAlignment.center,
);
@@ -76,7 +76,7 @@
Future<void> test_sort_middleArgument() async {
await resolveTestCode('''
import 'package:flutter/material.dart';
-main() {
+void f() {
Column(
mainAxisAlignment: MainAxisAlignment.start,
/*caret*/children: <Widget>[
@@ -90,7 +90,7 @@
''');
await assertHasAssist('''
import 'package:flutter/material.dart';
-main() {
+void f() {
Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center,
@@ -110,7 +110,7 @@
verifyNoTestUnitErrors = false;
await resolveTestCode('''
import 'package:flutter/material.dart';
-main() {
+void f() {
Column(
/*caret*/children: <Widget>[
Text('aaa'),
@@ -127,7 +127,7 @@
Future<void> test_sort_noTrailingComma() async {
await resolveTestCode('''
import 'package:flutter/material.dart';
-main() {
+void f() {
Column(
/*caret*/children: <Widget>[
Text('aaa'),
@@ -140,7 +140,7 @@
''');
await assertHasAssist('''
import 'package:flutter/material.dart';
-main() {
+void f() {
Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
@@ -157,7 +157,7 @@
Future<void> test_sort_trailingComma() async {
await resolveTestCode('''
import 'package:flutter/material.dart';
-main() {
+void f() {
Column(
/*caret*/children: <Widget>[
Text('aaa'),
@@ -170,7 +170,7 @@
''');
await assertHasAssist('''
import 'package:flutter/material.dart';
-main() {
+void f() {
Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
diff --git a/pkg/analysis_server/test/src/services/correction/assist/split_and_condition_test.dart b/pkg/analysis_server/test/src/services/correction/assist/split_and_condition_test.dart
index bf448d7..4707477 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/split_and_condition_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/split_and_condition_test.dart
@@ -21,7 +21,7 @@
Future<void> test_hasElse() async {
await resolveTestCode('''
-main() {
+void f() {
if (1 == 1 && 2 == 2) {
print(1);
} else {
@@ -34,14 +34,14 @@
Future<void> test_innerAndExpression() async {
await resolveTestCode('''
-main() {
+void f() {
if (1 == 1 && 2 == 2 && 3 == 3) {
print(0);
}
}
''');
await assertHasAssistAt('&& 2 == 2', '''
-main() {
+void f() {
if (1 == 1) {
if (2 == 2 && 3 == 3) {
print(0);
@@ -53,7 +53,7 @@
Future<void> test_notAnd() async {
await resolveTestCode('''
-main() {
+void f() {
if (1 == 1 || 2 == 2) {
print(0);
}
@@ -64,19 +64,19 @@
Future<void> test_notOnOperator() async {
await resolveTestCode('''
-main() {
+void f() {
if (1 == 1 && 2 == 2) {
print(0);
}
print(3 == 3 && 4 == 4);
}
''');
- await assertNoAssistAt('main() {');
+ await assertNoAssistAt('f() {');
}
Future<void> test_notPartOfIf() async {
await resolveTestCode('''
-main() {
+void f() {
print(1 == 1 && 2 == 2);
}
''');
@@ -85,7 +85,7 @@
Future<void> test_notTopLevelAnd() async {
await resolveTestCode('''
-main() {
+void f() {
if (true || (1 == 1 && 2 == 2)) {
print(0);
}
@@ -100,7 +100,7 @@
Future<void> test_selectionTooLarge() async {
await resolveTestCode('''
-main() {
+void f() {
if (1 == 1
// start
&& 2
@@ -117,7 +117,7 @@
Future<void> test_thenBlock() async {
await resolveTestCode('''
-main() {
+void f() {
if (true && false) {
print(0);
if (3 == 3) {
@@ -127,7 +127,7 @@
}
''');
await assertHasAssistAt('&& false', '''
-main() {
+void f() {
if (true) {
if (false) {
print(0);
@@ -142,13 +142,13 @@
Future<void> test_thenStatement() async {
await resolveTestCode('''
-main() {
+void f() {
if (true && false)
print(0);
}
''');
await assertHasAssistAt('&& false', '''
-main() {
+void f() {
if (true)
if (false)
print(0);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/split_variable_declaration_test.dart b/pkg/analysis_server/test/src/services/correction/assist/split_variable_declaration_test.dart
index b02dad3..1024290 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/split_variable_declaration_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/split_variable_declaration_test.dart
@@ -21,7 +21,7 @@
Future<void> test_const() async {
await resolveTestCode('''
-main() {
+void f() {
const v = 1;
}
''');
@@ -30,7 +30,7 @@
Future<void> test_final() async {
await resolveTestCode('''
-main() {
+void f() {
final v = 1;
}
''');
@@ -39,7 +39,7 @@
Future<void> test_notOneVariable() async {
await resolveTestCode('''
-main() {
+void f() {
var v = 1, v2;
}
''');
@@ -48,12 +48,12 @@
Future<void> test_onName() async {
await resolveTestCode('''
-main() {
+void f() {
var v = 1;
}
''');
await assertHasAssistAt('v =', '''
-main() {
+void f() {
int v;
v = 1;
}
@@ -63,13 +63,13 @@
Future<void> test_onName_functionStatement_noType() async {
await resolveTestCode('''
f() => 1;
-main() {
+void g() {
var v = f();
}
''');
await assertHasAssistAt('v =', '''
f() => 1;
-main() {
+void g() {
var v;
v = f();
}
@@ -78,12 +78,12 @@
Future<void> test_onType() async {
await resolveTestCode('''
-main() {
+void f() {
int v = 1;
}
''');
await assertHasAssistAt('int ', '''
-main() {
+void f() {
int v;
v = 1;
}
@@ -93,12 +93,12 @@
@failingTest
Future<void> test_onType_prefixedByComment() async {
await resolveTestCode('''
-main() {
+void f() {
/*comment*/int v = 1;
}
''');
await assertHasAssistAt('int ', '''
-main() {
+void f() {
/*comment*/int v;
v = 1;
}
@@ -107,12 +107,12 @@
Future<void> test_onVar() async {
await resolveTestCode('''
-main() {
+void f() {
var v = 1;
}
''');
await assertHasAssistAt('var ', '''
-main() {
+void f() {
int v;
v = 1;
}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_block_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_block_test.dart
index 54ef449..56bfd62 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/surround_with_block_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_block_test.dart
@@ -21,7 +21,7 @@
Future<void> test_notStatementInBlock() async {
await resolveTestCode('''
-main() {
+void f() {
while (true)
// start
print(0);
@@ -33,7 +33,7 @@
Future<void> test_twoStatements() async {
await resolveTestCode('''
-main() {
+void f() {
// start
print(0);
print(1);
@@ -41,7 +41,7 @@
}
''');
await assertHasAssist('''
-main() {
+void f() {
{
print(0);
print(1);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_do_while_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_do_while_test.dart
index d6ad18f..3976f23 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/surround_with_do_while_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_do_while_test.dart
@@ -21,7 +21,7 @@
Future<void> test_twoStatements() async {
await resolveTestCode('''
-main() {
+void f() {
// start
print(0);
print(1);
@@ -29,7 +29,7 @@
}
''');
await assertHasAssist('''
-main() {
+void f() {
do {
print(0);
print(1);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_in_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_in_test.dart
index 6b7ca74..89c3cb9 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_in_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_in_test.dart
@@ -21,7 +21,7 @@
Future<void> test_twoStatements() async {
await resolveTestCode('''
-main() {
+void f() {
// start
print(0);
print(1);
@@ -29,7 +29,7 @@
}
''');
await assertHasAssist('''
-main() {
+void f() {
for (var item in iterable) {
print(0);
print(1);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_test.dart
index ca39826..8bdab05 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_test.dart
@@ -21,7 +21,7 @@
Future<void> test_twoStatements() async {
await resolveTestCode('''
-main() {
+void f() {
// start
print(0);
print(1);
@@ -29,7 +29,7 @@
}
''');
await assertHasAssist('''
-main() {
+void f() {
for (var v = init; condition; increment) {
print(0);
print(1);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_if_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_if_test.dart
index 91ed08c..ec24255 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/surround_with_if_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_if_test.dart
@@ -21,7 +21,7 @@
Future<void> test_twoStatements() async {
await resolveTestCode('''
-main() {
+void f() {
// start
print(0);
print(1);
@@ -29,7 +29,7 @@
}
''');
await assertHasAssist('''
-main() {
+void f() {
if (condition) {
print(0);
print(1);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_catch_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_catch_test.dart
index 3fa1377..e3cfe45 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_catch_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_catch_test.dart
@@ -21,7 +21,7 @@
Future<void> test_twoStatements() async {
await resolveTestCode('''
-main() {
+void f() {
// start
print(0);
print(1);
@@ -29,7 +29,7 @@
}
''');
await assertHasAssist('''
-main() {
+void f() {
try {
print(0);
print(1);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_finally_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_finally_test.dart
index e6d5010..24b8943 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_finally_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_finally_test.dart
@@ -21,7 +21,7 @@
Future<void> test_twoStatements() async {
await resolveTestCode('''
-main() {
+void f() {
// start
print(0);
print(1);
@@ -29,7 +29,7 @@
}
''');
await assertHasAssist('''
-main() {
+void f() {
try {
print(0);
print(1);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_while_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_while_test.dart
index 24eb591..5513842 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/surround_with_while_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_while_test.dart
@@ -21,7 +21,7 @@
Future<void> test_twoStatements() async {
await resolveTestCode('''
-main() {
+void f() {
// start
print(0);
print(1);
@@ -29,7 +29,7 @@
}
''');
await assertHasAssist('''
-main() {
+void f() {
while (condition) {
print(0);
print(1);
diff --git a/pkg/analysis_server/tool/code_completion/completion_metrics.dart b/pkg/analysis_server/tool/code_completion/completion_metrics.dart
index 9f14280..0520b3f 100644
--- a/pkg/analysis_server/tool/code_completion/completion_metrics.dart
+++ b/pkg/analysis_server/tool/code_completion/completion_metrics.dart
@@ -155,11 +155,11 @@
)
..addOption(CompletionMetricsOptions.OVERLAY,
allowed: [
- CompletionMetricsOptions.OVERLAY_NONE,
- CompletionMetricsOptions.OVERLAY_REMOVE_TOKEN,
- CompletionMetricsOptions.OVERLAY_REMOVE_REST_OF_FILE
+ OverlayMode.none.flag,
+ OverlayMode.removeRestOfFile.flag,
+ OverlayMode.removeToken.flag,
],
- defaultsTo: CompletionMetricsOptions.OVERLAY_NONE,
+ defaultsTo: OverlayMode.none.flag,
help:
'Before attempting a completion at the location of each token, the '
'token can be removed, or the rest of the file can be removed to '
@@ -745,17 +745,20 @@
ExpectedCompletion expectedCompletion,
) async {
// If an overlay option is being used, compute the overlay file, and
- // have the context reanalyze the file
- if (options.overlay != CompletionMetricsOptions.OVERLAY_NONE) {
- var overlayContents = CompletionMetricsComputer.getOverlayContents(
- resolvedUnitResult.content,
- expectedCompletion,
- options.overlay,
- options.prefixLength);
+ // have the context reanalyze the file.
+ if (options.overlay != OverlayMode.none) {
+ final overlayContents = CompletionMetricsComputer.getOverlayContent(
+ resolvedUnitResult.content,
+ expectedCompletion,
+ options.overlay,
+ options.prefixLength,
+ );
- provider.setOverlay(filePath,
- content: overlayContents,
- modificationStamp: overlayModificationStamp++);
+ provider.setOverlay(
+ filePath,
+ content: overlayContents,
+ modificationStamp: overlayModificationStamp++,
+ );
context.changeFile(filePath);
await context.applyPendingFileChanges();
resolvedUnitResult = await context.currentSession
@@ -1396,10 +1399,10 @@
}
@override
- void removeOverlay(String filePath) {
+ Future<void> removeOverlay(String filePath) async {
// If an overlay option is being used, remove the overlay applied
// earlier.
- if (options.overlay != CompletionMetricsOptions.OVERLAY_NONE) {
+ if (options.overlay != OverlayMode.none) {
provider.removeOverlay(filePath);
}
}
diff --git a/pkg/analysis_server/tool/code_completion/completion_metrics_base.dart b/pkg/analysis_server/tool/code_completion/completion_metrics_base.dart
index 24cf9c6..34056c4 100644
--- a/pkg/analysis_server/tool/code_completion/completion_metrics_base.dart
+++ b/pkg/analysis_server/tool/code_completion/completion_metrics_base.dart
@@ -87,7 +87,7 @@
documentationCache,
);
- removeOverlay(filePath);
+ await removeOverlay(filePath);
}
progress.tick();
}
@@ -113,7 +113,7 @@
);
/// Removes the overlay which has been applied to [filePath].
- void removeOverlay(String filePath);
+ Future<void> removeOverlay(String filePath);
/// Resolves all analyzed files within [context].
Future<List<ResolvedUnitResult>> resolveAnalyzedFiles({
@@ -171,17 +171,16 @@
return null;
}
- /// Gets overlay contents for [contents], applying a change at
+ /// Gets overlay content for [content], applying a change at
/// [expectedCompletion] with [prefixLength], according to [overlay], one of
/// the [CompletionMetricsOptions].
- static String getOverlayContents(
- String contents,
+ static String getOverlayContent(
+ String content,
ExpectedCompletion expectedCompletion,
- // TODO(srawlins): Replace this with an enum.
- String overlay,
+ OverlayMode overlay,
int prefixLength,
) {
- assert(contents.isNotEmpty);
+ assert(content.isNotEmpty);
var offset = expectedCompletion.offset;
final length = expectedCompletion.syntacticEntity.length;
assert(offset >= 0);
@@ -192,16 +191,12 @@
// the given prefix length.
offset += prefixLength;
}
- if (overlay == CompletionMetricsOptions.OVERLAY_REMOVE_TOKEN) {
- return contents.substring(0, offset) + contents.substring(tokenEndOffset);
- } else if (overlay ==
- CompletionMetricsOptions.OVERLAY_REMOVE_REST_OF_FILE) {
- return contents.substring(0, offset);
+ if (overlay == OverlayMode.removeToken) {
+ return content.substring(0, offset) + content.substring(tokenEndOffset);
+ } else if (overlay == OverlayMode.removeRestOfFile) {
+ return content.substring(0, offset);
} else {
- final removeToken = CompletionMetricsOptions.OVERLAY_REMOVE_TOKEN;
- final removeRest = CompletionMetricsOptions.OVERLAY_REMOVE_REST_OF_FILE;
- throw Exception('\'getOverlayContents\' called with option other than'
- '$removeToken and $removeRest: $overlay');
+ throw ArgumentError.value(overlay, 'overlay');
}
}
}
@@ -211,18 +206,6 @@
/// An option to control whether and how overlays should be produced.
static const String OVERLAY = 'overlay';
- /// A mode indicating that no overlays should be produced.
- /// TODO(srawlins): Replace this and the other two overlay values with enums.
- static const String OVERLAY_NONE = 'none';
-
- /// A mode indicating that everything from the completion offset to the end of
- /// the file should be removed.
- static const String OVERLAY_REMOVE_REST_OF_FILE = 'remove-rest-of-file';
-
- /// A mode indicating that the token whose offset is the same as the
- /// completion offset should be removed.
- static const String OVERLAY_REMOVE_TOKEN = 'remove-token';
-
/// An option controlling how long of a prefix should be used.
///
/// This affects the offset of the completion request, and how much content is
@@ -234,8 +217,7 @@
static const String PRINT_SLOWEST_RESULTS = 'print-slowest-results';
/// The overlay mode that should be used.
- /// TODO(srawlins): Replace this with an enum.
- final String overlay;
+ final OverlayMode overlay;
final int prefixLength;
@@ -244,12 +226,34 @@
final bool printSlowestResults;
CompletionMetricsOptions(ArgResults results)
- : overlay = results[OVERLAY] as String,
+ : overlay = OverlayMode.parseFlag(results[OVERLAY] as String),
prefixLength = int.parse(results[PREFIX_LENGTH] as String),
- printSlowestResults = results[PRINT_SLOWEST_RESULTS] as bool {
- assert(overlay == OVERLAY_NONE ||
- overlay == OVERLAY_REMOVE_TOKEN ||
- overlay == OVERLAY_REMOVE_REST_OF_FILE);
+ printSlowestResults = results[PRINT_SLOWEST_RESULTS] as bool;
+}
+
+enum OverlayMode {
+ /// A mode indicating that no overlays should be produced.
+ none('none'),
+
+ /// A mode indicating that everything from the completion offset to the end of
+ /// the file should be removed.
+ removeRestOfFile('remove-rest-of-file'),
+
+ /// A mode indicating that the token whose offset is the same as the
+ /// completion offset should be removed.
+ removeToken('remove-token');
+
+ final String flag;
+
+ const OverlayMode(this.flag);
+
+ static OverlayMode parseFlag(String flag) {
+ for (final mode in values) {
+ if (flag == mode.flag) {
+ return mode;
+ }
+ }
+ throw ArgumentError.value(flag, 'overlay');
}
}
diff --git a/pkg/analysis_server/tool/code_completion/completion_metrics_client.dart b/pkg/analysis_server/tool/code_completion/completion_metrics_client.dart
index 2248b30..ad666a8 100644
--- a/pkg/analysis_server/tool/code_completion/completion_metrics_client.dart
+++ b/pkg/analysis_server/tool/code_completion/completion_metrics_client.dart
@@ -68,11 +68,11 @@
..addOption(
CompletionMetricsOptions.OVERLAY,
allowed: [
- CompletionMetricsOptions.OVERLAY_NONE,
- CompletionMetricsOptions.OVERLAY_REMOVE_TOKEN,
- CompletionMetricsOptions.OVERLAY_REMOVE_REST_OF_FILE,
+ OverlayMode.none.flag,
+ OverlayMode.removeRestOfFile.flag,
+ OverlayMode.removeToken.flag,
],
- defaultsTo: CompletionMetricsOptions.OVERLAY_NONE,
+ defaultsTo: OverlayMode.none.flag,
help: 'Before attempting a completion at the location of each token, the '
'token can be removed, or the rest of the file can be removed to '
'test code completion with diverse methods. The default mode is to '
@@ -143,7 +143,21 @@
String filePath,
ExpectedCompletion expectedCompletion,
) async {
- // TODO(srawlins): Support overlays.
+ if (options.overlay != OverlayMode.none) {
+ final overlayContent = CompletionMetricsComputer.getOverlayContent(
+ resolvedUnitResult.content,
+ expectedCompletion,
+ options.overlay,
+ options.prefixLength,
+ );
+
+ provider.setOverlay(
+ filePath,
+ content: overlayContent,
+ modificationStamp: overlayModificationStamp++,
+ );
+ await client.addOverlay(filePath, overlayContent);
+ }
}
@override
@@ -193,8 +207,10 @@
}
@override
- void removeOverlay(String filePath) {
- // TODO(srawlins): Support overlays.
+ Future<void> removeOverlay(String filePath) async {
+ if (options.overlay != OverlayMode.none) {
+ await client.removeOverlay(filePath);
+ }
}
@override
@@ -275,19 +291,55 @@
Future<int> get onExit => _process!.exitCode;
+ Future<AnalysisUpdateContentResult> addOverlay(
+ String file, String content) async {
+ final response = await _sendCommand(
+ 'analysis.updateContent',
+ params: {
+ 'files': {
+ file: {'type': 'add', 'content': content},
+ }
+ },
+ );
+ final result = response['result'] as Map<String, dynamic>;
+
+ return AnalysisUpdateContentResult.fromJson(
+ ResponseDecoder(null),
+ 'result',
+ result,
+ );
+ }
+
Future<bool> dispose() async {
return _process?.kill() ?? true;
}
+ Future<AnalysisUpdateContentResult> removeOverlay(String file) async {
+ final response = await _sendCommand(
+ 'analysis.updateContent',
+ params: {
+ 'files': {
+ file: {'type': 'remove'},
+ }
+ },
+ );
+ final result = response['result'] as Map<String, dynamic>;
+
+ return AnalysisUpdateContentResult.fromJson(
+ ResponseDecoder(null),
+ 'result',
+ result,
+ );
+ }
+
/// Requests a completion for [file] at [offset].
Future<_SuggestionsData> requestCompletion(
String file, int offset, int maxResults) async {
- final response = await _sendCommand('completion.getSuggestions2',
- params: <String, dynamic>{
- 'file': file,
- 'offset': offset,
- 'maxResults': maxResults,
- });
+ final response = await _sendCommand('completion.getSuggestions2', params: {
+ 'file': file,
+ 'offset': offset,
+ 'maxResults': maxResults,
+ });
final result = response['result'] as Map<String, dynamic>;
final metadata = _requestMetadata[response['id']]!;
@@ -440,10 +492,7 @@
.remove(id)
?.completeError(_RequestError.parse(error));
} else {
- _requestCompleters.remove(id)?.complete(
- //response['result'] as Map<String, dynamic>? ??
- // <String, dynamic>{});
- response);
+ _requestCompleters.remove(id)?.complete(response);
}
}
}
diff --git a/pkg/analysis_server_client/lib/handler/notification_handler.dart b/pkg/analysis_server_client/lib/handler/notification_handler.dart
index 2d8715a..8394584 100644
--- a/pkg/analysis_server_client/lib/handler/notification_handler.dart
+++ b/pkg/analysis_server_client/lib/handler/notification_handler.dart
@@ -6,6 +6,9 @@
// To regenerate the file, use the script
// "pkg/analysis_server/tool/spec/generate_files".
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: prefer_interpolation_to_compose_strings
+
import 'package:analysis_server_client/protocol.dart';
/// [NotificationHandler] processes analysis server notifications
diff --git a/pkg/analysis_server_client/lib/src/protocol/protocol_common.dart b/pkg/analysis_server_client/lib/src/protocol/protocol_common.dart
index e129eed..749b941 100644
--- a/pkg/analysis_server_client/lib/src/protocol/protocol_common.dart
+++ b/pkg/analysis_server_client/lib/src/protocol/protocol_common.dart
@@ -6,6 +6,9 @@
// To regenerate the file, use the script
// "pkg/analysis_server/tool/spec/generate_files".
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: prefer_interpolation_to_compose_strings
+
import 'dart:convert' hide JsonDecoder;
import 'package:analysis_server_client/src/protocol/protocol_base.dart';
diff --git a/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart b/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart
index 24ad02a..cc63b35 100644
--- a/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart
+++ b/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart
@@ -6,6 +6,9 @@
// To regenerate the file, use the script
// "pkg/analysis_server/tool/spec/generate_files".
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: prefer_interpolation_to_compose_strings
+
const String PROTOCOL_VERSION = '1.33.0';
const String ANALYSIS_NOTIFICATION_ANALYZED_FILES = 'analysis.analyzedFiles';
diff --git a/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart b/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart
index f4bb221..dd65279 100644
--- a/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart
+++ b/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart
@@ -6,6 +6,9 @@
// To regenerate the file, use the script
// "pkg/analysis_server/tool/spec/generate_files".
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: prefer_interpolation_to_compose_strings
+
import 'dart:convert' hide JsonDecoder;
import 'package:analysis_server_client/src/protocol/protocol_base.dart';
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index a446cae..5e0d327 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -84,7 +84,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 = 217;
+ static const int DATA_VERSION = 218;
/// 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 0f7bb2d..3d1e18c 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -3709,7 +3709,7 @@
List<ExtensionElement> get accessibleExtensions => scope.extensions;
@override
- CompilationUnitElement get definingCompilationUnit =>
+ CompilationUnitElementImpl get definingCompilationUnit =>
_definingCompilationUnit;
/// Set the compilation unit that defines this library to the given
diff --git a/pkg/analyzer/lib/src/summary2/element_flags.dart b/pkg/analyzer/lib/src/summary2/element_flags.dart
index 9481899..a8ba866 100644
--- a/pkg/analyzer/lib/src/summary2/element_flags.dart
+++ b/pkg/analyzer/lib/src/summary2/element_flags.dart
@@ -312,6 +312,7 @@
static const int _isExternal = 1 << 2;
static const int _isFinal = 1 << 3;
static const int _isLate = 1 << 4;
+ static const int _isTempAugmentation = 1 << 5;
static void read(
SummaryDataReader reader,
@@ -323,6 +324,7 @@
element.isExternal = (byte & _isExternal) != 0;
element.isFinal = (byte & _isFinal) != 0;
element.isLate = (byte & _isLate) != 0;
+ element.isTempAugmentation = (byte & _isTempAugmentation) != 0;
}
static void write(BufferedSink sink, TopLevelVariableElementImpl element) {
@@ -332,6 +334,7 @@
result |= element.isExternal ? _isExternal : 0;
result |= element.isFinal ? _isFinal : 0;
result |= element.isLate ? _isLate : 0;
+ result |= element.isTempAugmentation ? _isTempAugmentation : 0;
sink.writeByte(result);
}
}
diff --git a/pkg/analyzer/lib/src/summary2/library_builder.dart b/pkg/analyzer/lib/src/summary2/library_builder.dart
index 7fcbfcc..50e62f5 100644
--- a/pkg/analyzer/lib/src/summary2/library_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/library_builder.dart
@@ -238,6 +238,7 @@
TypesBuilder(linker).build(nodesToBuildType);
// Transplant built elements as if the augmentation was applied.
+ final augmentedUnitElement = element.definingCompilationUnit;
for (final augmentation in unitElement.classes) {
// TODO(scheglov) if augmentation
final augmented = element.getType(augmentation.name);
@@ -260,6 +261,14 @@
];
}
}
+ augmentedUnitElement.accessors = [
+ ...augmentedUnitElement.accessors,
+ ...unitElement.accessors,
+ ];
+ augmentedUnitElement.topLevelVariables = [
+ ...augmentedUnitElement.topLevelVariables,
+ ...unitElement.topLevelVariables,
+ ];
}
Future<void> executeMacroTypesPhase() async {
diff --git a/pkg/analyzer/lib/src/summary2/macro.dart b/pkg/analyzer/lib/src/summary2/macro.dart
index a87f832..46f36e9 100644
--- a/pkg/analyzer/lib/src/summary2/macro.dart
+++ b/pkg/analyzer/lib/src/summary2/macro.dart
@@ -5,7 +5,6 @@
import 'dart:isolate';
import 'dart:typed_data';
-import 'package:_fe_analyzer_shared/src/macros/api.dart' as macro;
import 'package:_fe_analyzer_shared/src/macros/bootstrap.dart' as macro;
import 'package:_fe_analyzer_shared/src/macros/executor.dart' as macro;
import 'package:_fe_analyzer_shared/src/macros/executor/isolated_executor.dart'
@@ -53,19 +52,17 @@
}
}
- Future<MacroClassInstance> instantiate({
+ /// Any macro must be instantiated using this method to guarantee that
+ /// the corresponding kernel was registered first. Although as it is now,
+ /// it is still possible to request an unrelated [libraryUri].
+ Future<macro.MacroInstanceIdentifier> instantiate({
required Uri libraryUri,
required String className,
required String constructorName,
required macro.Arguments arguments,
- required macro.IdentifierResolver identifierResolver,
- required macro.DeclarationKind declarationKind,
- required macro.Declaration declaration,
}) async {
- var instanceIdentifier = await macroExecutor.instantiateMacro(
+ return await macroExecutor.instantiateMacro(
libraryUri, className, constructorName, arguments);
- return MacroClassInstance._(this, identifierResolver, instanceIdentifier,
- declarationKind, declaration);
}
}
@@ -79,41 +76,6 @@
});
}
-class MacroClassInstance {
- final BundleMacroExecutor _bundleExecutor;
- final macro.IdentifierResolver _identifierResolver;
- final macro.MacroInstanceIdentifier _instanceIdentifier;
- final macro.DeclarationKind _declarationKind;
- final macro.Declaration _declaration;
-
- MacroClassInstance._(
- this._bundleExecutor,
- this._identifierResolver,
- this._instanceIdentifier,
- this._declarationKind,
- this._declaration,
- );
-
- Future<macro.MacroExecutionResult> executeDeclarationsPhase({
- required macro.TypeResolver typeResolver,
- required macro.ClassIntrospector classIntrospector,
- }) async {
- macro.MacroExecutor executor = _bundleExecutor.macroExecutor;
- return await executor.executeDeclarationsPhase(_instanceIdentifier,
- _declaration, _identifierResolver, typeResolver, classIntrospector);
- }
-
- Future<macro.MacroExecutionResult> executeTypesPhase() async {
- macro.MacroExecutor executor = _bundleExecutor.macroExecutor;
- return await executor.executeTypesPhase(
- _instanceIdentifier, _declaration, _identifierResolver);
- }
-
- bool shouldExecute(macro.Phase phase) {
- return _instanceIdentifier.shouldExecute(_declarationKind, phase);
- }
-}
-
abstract class MacroFileEntry {
String get content;
diff --git a/pkg/analyzer/lib/src/summary2/macro_application.dart b/pkg/analyzer/lib/src/summary2/macro_application.dart
index 6d75973..e3cb33d 100644
--- a/pkg/analyzer/lib/src/summary2/macro_application.dart
+++ b/pkg/analyzer/lib/src/summary2/macro_application.dart
@@ -17,7 +17,6 @@
import 'package:analyzer/src/dart/element/element.dart';
import 'package:analyzer/src/summary2/library_builder.dart';
import 'package:analyzer/src/summary2/link.dart';
-import 'package:analyzer/src/summary2/macro.dart';
import 'package:analyzer/src/summary2/macro_application_error.dart';
class LibraryMacroApplier {
@@ -26,7 +25,10 @@
final List<_MacroTarget> _targets = [];
- final Map<ClassDeclaration, macro.ClassDeclaration> _classDeclarations = {};
+ final Map<ClassDeclaration, macro.ClassDeclarationImpl> _classDeclarations =
+ {};
+
+ final macro.IdentifierResolver _identifierResolver = _IdentifierResolver();
final macro.TypeResolver _typeResolver = _TypeResolver();
@@ -48,6 +50,7 @@
await _buildApplications(
targetElement,
targetNode.metadata,
+ macro.DeclarationKind.clazz,
() => getClassDeclaration(targetNode),
);
}
@@ -61,11 +64,7 @@
if (application.shouldExecute(macro.Phase.declarations)) {
await _runWithCatchingExceptions(
() async {
- final result =
- await application.instance.executeDeclarationsPhase(
- typeResolver: _typeResolver,
- classIntrospector: _classIntrospector,
- );
+ final result = await application.executeDeclarationsPhase();
if (result.isNotEmpty) {
results.add(result);
}
@@ -88,7 +87,7 @@
if (application.shouldExecute(macro.Phase.types)) {
await _runWithCatchingExceptions(
() async {
- final result = await application.instance.executeTypesPhase();
+ final result = await application.executeTypesPhase();
if (result.isNotEmpty) {
results.add(result);
}
@@ -106,7 +105,7 @@
/// TODO(scheglov) Do we need this caching?
/// Or do we need it only during macro applications creation?
- macro.ClassDeclaration getClassDeclaration(ClassDeclaration node) {
+ macro.ClassDeclarationImpl getClassDeclaration(ClassDeclaration node) {
return _classDeclarations[node] ??= _buildClassDeclaration(node);
}
@@ -115,12 +114,13 @@
Future<void> _buildApplications(
MacroTargetElement targetElement,
List<Annotation> annotations,
- macro.Declaration Function() getDeclaration,
+ macro.DeclarationKind declarationKind,
+ macro.DeclarationImpl Function() getDeclaration,
) async {
final applications = <_MacroApplication>[];
for (var i = 0; i < annotations.length; i++) {
- Future<MacroClassInstance?> instantiateSingle({
+ Future<macro.MacroInstanceIdentifier?> instantiateSingle({
required ClassElementImpl macroClass,
required String constructorName,
required ArgumentList argumentsNode,
@@ -139,9 +139,6 @@
className: macroClass.name,
constructorName: constructorName,
arguments: arguments,
- identifierResolver: _IdentifierResolver(),
- declarationKind: macro.DeclarationKind.clazz,
- declaration: getDeclaration(),
);
},
annotationIndex: i,
@@ -185,7 +182,7 @@
applications.add(
_MacroApplication(
annotationIndex: i,
- instance: macroInstance,
+ instanceIdentifier: macroInstance,
),
);
}
@@ -194,7 +191,10 @@
if (applications.isNotEmpty) {
_targets.add(
_MacroTarget(
+ applier: this,
element: targetElement,
+ declarationKind: declarationKind,
+ declaration: getDeclaration(),
applications: applications,
),
);
@@ -614,25 +614,60 @@
}
class _MacroApplication {
+ late final _MacroTarget target;
final int annotationIndex;
- final MacroClassInstance instance;
+ final macro.MacroInstanceIdentifier instanceIdentifier;
_MacroApplication({
required this.annotationIndex,
- required this.instance,
+ required this.instanceIdentifier,
});
- bool shouldExecute(macro.Phase phase) => instance.shouldExecute(phase);
+ Future<macro.MacroExecutionResult> executeDeclarationsPhase() async {
+ final applier = target.applier;
+ final executor = applier.macroExecutor;
+ return await executor.executeDeclarationsPhase(
+ instanceIdentifier,
+ target.declaration,
+ applier._identifierResolver,
+ applier._typeResolver,
+ applier._classIntrospector,
+ );
+ }
+
+ Future<macro.MacroExecutionResult> executeTypesPhase() async {
+ final applier = target.applier;
+ final executor = applier.macroExecutor;
+ return await executor.executeTypesPhase(
+ instanceIdentifier,
+ target.declaration,
+ applier._identifierResolver,
+ );
+ }
+
+ bool shouldExecute(macro.Phase phase) {
+ return instanceIdentifier.shouldExecute(target.declarationKind, phase);
+ }
}
class _MacroTarget {
+ final LibraryMacroApplier applier;
final MacroTargetElement element;
+ final macro.DeclarationKind declarationKind;
+ final macro.DeclarationImpl declaration;
final List<_MacroApplication> applications;
_MacroTarget({
+ required this.applier,
required this.element,
+ required this.declarationKind,
+ required this.declaration,
required this.applications,
- });
+ }) {
+ for (final application in applications) {
+ application.target = this;
+ }
+ }
}
class _MacroTargetElementCollector extends GeneralizingElementVisitor<void> {
diff --git a/pkg/analyzer/test/src/dart/element/element_test.dart b/pkg/analyzer/test/src/dart/element/element_test.dart
index aaeb60b..d105672 100644
--- a/pkg/analyzer/test/src/dart/element/element_test.dart
+++ b/pkg/analyzer/test/src/dart/element/element_test.dart
@@ -177,8 +177,7 @@
String methodName = "m";
MethodElement method = ElementFactory.methodElement(methodName, intNone);
classA.methods = <MethodElement>[method];
- (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
- <ClassElement>[classA];
+ (library.definingCompilationUnit).classes = <ClassElement>[classA];
expect(classA.lookUpConcreteMethod(methodName, library), same(method));
}
@@ -193,8 +192,7 @@
ElementFactory.methodElement(methodName, intNone);
method.isAbstract = true;
classA.methods = <MethodElement>[method];
- (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
- <ClassElement>[classA];
+ (library.definingCompilationUnit).classes = <ClassElement>[classA];
expect(classA.lookUpConcreteMethod(methodName, library), isNull);
}
@@ -217,8 +215,7 @@
ElementFactory.methodElement(methodName, intNone);
method.isAbstract = true;
classB.methods = <MethodElement>[method];
- (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
- <ClassElement>[classA, classB];
+ (library.definingCompilationUnit).classes = <ClassElement>[classA, classB];
expect(classB.lookUpConcreteMethod(methodName, library),
same(inheritedMethod));
}
@@ -240,8 +237,7 @@
ElementFactory.classElement("B", interfaceTypeStar(classA));
MethodElement method = ElementFactory.methodElement(methodName, intNone);
classB.methods = <MethodElement>[method];
- (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
- <ClassElement>[classA, classB];
+ (library.definingCompilationUnit).classes = <ClassElement>[classA, classB];
expect(classB.lookUpConcreteMethod(methodName, library), same(method));
}
@@ -264,8 +260,7 @@
ElementFactory.classElement("B", interfaceTypeStar(classA));
MethodElement method = ElementFactory.methodElement(methodName, intNone);
classB.methods = <MethodElement>[method];
- (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
- <ClassElement>[classA, classB];
+ (library.definingCompilationUnit).classes = <ClassElement>[classA, classB];
expect(classB.lookUpConcreteMethod(methodName, library), same(method));
}
@@ -283,8 +278,7 @@
classA.methods = <MethodElement>[inheritedMethod];
ClassElementImpl classB =
ElementFactory.classElement("B", interfaceTypeStar(classA));
- (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
- <ClassElement>[classA, classB];
+ (library.definingCompilationUnit).classes = <ClassElement>[classA, classB];
expect(classB.lookUpConcreteMethod(methodName, library),
same(inheritedMethod));
}
@@ -294,8 +288,7 @@
// }
LibraryElementImpl library = _newLibrary();
var classA = class_(name: 'A');
- (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
- <ClassElement>[classA];
+ (library.definingCompilationUnit).classes = <ClassElement>[classA];
expect(classA.lookUpConcreteMethod("m", library), isNull);
}
@@ -309,8 +302,7 @@
PropertyAccessorElement getter =
ElementFactory.getterElement(getterName, false, intNone);
classA.accessors = <PropertyAccessorElement>[getter];
- (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
- <ClassElement>[classA];
+ (library.definingCompilationUnit).classes = <ClassElement>[classA];
expect(classA.lookUpGetter(getterName, library), same(getter));
}
@@ -328,8 +320,7 @@
classA.accessors = <PropertyAccessorElement>[getter];
ClassElementImpl classB =
ElementFactory.classElement("B", interfaceTypeStar(classA));
- (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
- <ClassElement>[classA, classB];
+ (library.definingCompilationUnit).classes = <ClassElement>[classA, classB];
expect(classB.lookUpGetter(getterName, library), same(getter));
}
@@ -338,8 +329,7 @@
// }
LibraryElementImpl library = _newLibrary();
var classA = class_(name: 'A');
- (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
- <ClassElement>[classA];
+ (library.definingCompilationUnit).classes = <ClassElement>[classA];
expect(classA.lookUpGetter("g", library), isNull);
}
@@ -353,8 +343,7 @@
ClassElementImpl classB =
ElementFactory.classElement("B", interfaceTypeStar(classA));
classA.supertype = interfaceTypeStar(classB);
- (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
- <ClassElement>[classA, classB];
+ (library.definingCompilationUnit).classes = <ClassElement>[classA, classB];
expect(classA.lookUpGetter("g", library), isNull);
}
@@ -364,8 +353,7 @@
String methodName = "m";
MethodElement method = ElementFactory.methodElement(methodName, intNone);
classA.methods = <MethodElement>[method];
- (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
- <ClassElement>[classA];
+ (library.definingCompilationUnit).classes = <ClassElement>[classA];
expect(classA.lookUpMethod(methodName, library), same(method));
}
@@ -377,16 +365,14 @@
classA.methods = <MethodElement>[method];
ClassElementImpl classB =
ElementFactory.classElement("B", interfaceTypeStar(classA));
- (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
- <ClassElement>[classA, classB];
+ (library.definingCompilationUnit).classes = <ClassElement>[classA, classB];
expect(classB.lookUpMethod(methodName, library), same(method));
}
void test_lookUpMethod_undeclared() {
LibraryElementImpl library = _newLibrary();
var classA = class_(name: 'A');
- (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
- <ClassElement>[classA];
+ (library.definingCompilationUnit).classes = <ClassElement>[classA];
expect(classA.lookUpMethod("m", library), isNull);
}
@@ -396,8 +382,7 @@
ClassElementImpl classB =
ElementFactory.classElement("B", interfaceTypeStar(classA));
classA.supertype = interfaceTypeStar(classB);
- (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
- <ClassElement>[classA, classB];
+ (library.definingCompilationUnit).classes = <ClassElement>[classA, classB];
expect(classA.lookUpMethod("m", library), isNull);
}
@@ -411,8 +396,7 @@
PropertyAccessorElement setter =
ElementFactory.setterElement(setterName, false, intNone);
classA.accessors = <PropertyAccessorElement>[setter];
- (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
- <ClassElement>[classA];
+ (library.definingCompilationUnit).classes = <ClassElement>[classA];
expect(classA.lookUpSetter(setterName, library), same(setter));
}
@@ -430,8 +414,7 @@
classA.accessors = <PropertyAccessorElement>[setter];
ClassElementImpl classB =
ElementFactory.classElement("B", interfaceTypeStar(classA));
- (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
- <ClassElement>[classA, classB];
+ (library.definingCompilationUnit).classes = <ClassElement>[classA, classB];
expect(classB.lookUpSetter(setterName, library), same(setter));
}
@@ -440,8 +423,7 @@
// }
LibraryElementImpl library = _newLibrary();
var classA = class_(name: 'A');
- (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
- <ClassElement>[classA];
+ (library.definingCompilationUnit).classes = <ClassElement>[classA];
expect(classA.lookUpSetter("s", library), isNull);
}
@@ -455,8 +437,7 @@
ClassElementImpl classB =
ElementFactory.classElement("B", interfaceTypeStar(classA));
classA.supertype = interfaceTypeStar(classB);
- (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
- <ClassElement>[classA, classB];
+ (library.definingCompilationUnit).classes = <ClassElement>[classA, classB];
expect(classA.lookUpSetter("s", library), isNull);
}
@@ -516,8 +497,7 @@
void test_equals() {
LibraryElementImpl library = ElementFactory.library(analysisContext, "lib");
ClassElementImpl classElement = ElementFactory.classElement2("C");
- (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
- <ClassElement>[classElement];
+ (library.definingCompilationUnit).classes = <ClassElement>[classElement];
FieldElement field = ElementFactory.fieldElement(
"next",
false,
@@ -541,8 +521,7 @@
LibraryElementImpl library1 =
ElementFactory.library(analysisContext, "lib1");
ClassElement classElement = ElementFactory.classElement2("_C");
- (library1.definingCompilationUnit as CompilationUnitElementImpl).classes =
- <ClassElement>[classElement];
+ (library1.definingCompilationUnit).classes = <ClassElement>[classElement];
LibraryElementImpl library2 =
ElementFactory.library(analysisContext, "lib2");
expect(classElement.isAccessibleIn(library2), isFalse);
@@ -551,8 +530,7 @@
void test_isAccessibleIn_private_sameLibrary() {
LibraryElementImpl library = ElementFactory.library(analysisContext, "lib");
ClassElement classElement = ElementFactory.classElement2("_C");
- (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
- <ClassElement>[classElement];
+ (library.definingCompilationUnit).classes = <ClassElement>[classElement];
expect(classElement.isAccessibleIn(library), isTrue);
}
@@ -560,8 +538,7 @@
LibraryElementImpl library1 =
ElementFactory.library(analysisContext, "lib1");
ClassElement classElement = ElementFactory.classElement2("C");
- (library1.definingCompilationUnit as CompilationUnitElementImpl).classes =
- <ClassElement>[classElement];
+ (library1.definingCompilationUnit).classes = <ClassElement>[classElement];
LibraryElementImpl library2 =
ElementFactory.library(analysisContext, "lib2");
expect(classElement.isAccessibleIn(library2), isTrue);
@@ -570,8 +547,7 @@
void test_isAccessibleIn_public_sameLibrary() {
LibraryElementImpl library = ElementFactory.library(analysisContext, "lib");
ClassElement classElement = ElementFactory.classElement2("C");
- (library.definingCompilationUnit as CompilationUnitElementImpl).classes =
- <ClassElement>[classElement];
+ (library.definingCompilationUnit).classes = <ClassElement>[classElement];
expect(classElement.isAccessibleIn(library), isTrue);
}
diff --git a/pkg/analyzer/test/src/summary/elements_test.dart b/pkg/analyzer/test/src/summary/elements_test.dart
index 5d2bb23..1ad15af 100644
--- a/pkg/analyzer/test/src/summary/elements_test.dart
+++ b/pkg/analyzer/test/src/summary/elements_test.dart
@@ -38084,8 +38084,7 @@
Element _elementOfDefiningUnit(
LibraryElementImpl library, List<String> names) {
- var unit = library.definingCompilationUnit as CompilationUnitElementImpl;
- var reference = unit.reference!;
+ var reference = library.definingCompilationUnit.reference!;
for (var name in names) {
reference = reference.getChild(name);
}
diff --git a/pkg/analyzer/test/src/summary/macro_test.dart b/pkg/analyzer/test/src/summary/macro_test.dart
index 097547d..0762782 100644
--- a/pkg/analyzer/test/src/summary/macro_test.dart
+++ b/pkg/analyzer/test/src/summary/macro_test.dart
@@ -1091,6 +1091,58 @@
''');
}
+ test_declarationsPhase_unit_variables() async {
+ newFile('$testPackageLibPath/a.dart', r'''
+import 'package:_fe_analyzer_shared/src/macros/api.dart';
+
+macro class MyMacro implements ClassDeclarationsMacro {
+ const MyMacro();
+
+ buildDeclarationsForClass(clazz, builder) async {
+ builder.declareInLibrary(
+ DeclarationCode.fromString('final x = 42;'),
+ );
+ }
+}
+
+const myMacro = MyMacro();
+''');
+
+ var library = await buildLibrary(r'''
+import 'a.dart';
+
+@myMacro
+class A {}
+''', preBuildSequence: [
+ {'package:test/a.dart'}
+ ]);
+
+ checkElementText(library, r'''
+library
+ imports
+ package:test/a.dart
+ definingUnit
+ classes
+ class A @33
+ metadata
+ Annotation
+ atSign: @ @18
+ name: SimpleIdentifier
+ token: myMacro @19
+ staticElement: package:test/a.dart::@getter::myMacro
+ staticType: null
+ element: package:test/a.dart::@getter::myMacro
+ constructors
+ synthetic @-1
+ topLevelVariables
+ static final x @-1
+ type: int
+ accessors
+ synthetic static get x @-1
+ returnType: int
+''');
+ }
+
test_introspect_types_ClassDeclaration_interfaces() async {
await _assertTypesPhaseIntrospectionText(r'''
class A implements B, C<int, String> {}
diff --git a/pkg/analyzer_plugin/lib/protocol/protocol_common.dart b/pkg/analyzer_plugin/lib/protocol/protocol_common.dart
index 85dd6d6..6259d9a 100644
--- a/pkg/analyzer_plugin/lib/protocol/protocol_common.dart
+++ b/pkg/analyzer_plugin/lib/protocol/protocol_common.dart
@@ -6,6 +6,9 @@
// To regenerate the file, use the script
// "pkg/analysis_server/tool/spec/generate_files".
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: prefer_interpolation_to_compose_strings
+
import 'dart:convert' hide JsonDecoder;
import 'package:analyzer_plugin/protocol/protocol.dart';
diff --git a/pkg/analyzer_plugin/lib/protocol/protocol_constants.dart b/pkg/analyzer_plugin/lib/protocol/protocol_constants.dart
index fe304d5..7192e9a 100644
--- a/pkg/analyzer_plugin/lib/protocol/protocol_constants.dart
+++ b/pkg/analyzer_plugin/lib/protocol/protocol_constants.dart
@@ -6,6 +6,9 @@
// To regenerate the file, use the script
// "pkg/analysis_server/tool/spec/generate_files".
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: prefer_interpolation_to_compose_strings
+
const String ANALYSIS_NOTIFICATION_ERRORS = 'analysis.errors';
const String ANALYSIS_NOTIFICATION_ERRORS_ERRORS = 'errors';
const String ANALYSIS_NOTIFICATION_ERRORS_FILE = 'file';
diff --git a/pkg/analyzer_plugin/lib/protocol/protocol_generated.dart b/pkg/analyzer_plugin/lib/protocol/protocol_generated.dart
index e8ee6b4..cae7d66 100644
--- a/pkg/analyzer_plugin/lib/protocol/protocol_generated.dart
+++ b/pkg/analyzer_plugin/lib/protocol/protocol_generated.dart
@@ -6,6 +6,9 @@
// To regenerate the file, use the script
// "pkg/analysis_server/tool/spec/generate_files".
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: prefer_interpolation_to_compose_strings
+
import 'dart:convert' hide JsonDecoder;
import 'package:analyzer_plugin/protocol/protocol.dart';
diff --git a/pkg/analyzer_plugin/test/integration/support/integration_test_methods.dart b/pkg/analyzer_plugin/test/integration/support/integration_test_methods.dart
index 79c042c..443bc76 100644
--- a/pkg/analyzer_plugin/test/integration/support/integration_test_methods.dart
+++ b/pkg/analyzer_plugin/test/integration/support/integration_test_methods.dart
@@ -6,6 +6,9 @@
// To regenerate the file, use the script
// "pkg/analysis_server/tool/spec/generate_files".
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: prefer_interpolation_to_compose_strings
+
/// Convenience methods for running integration tests.
import 'dart:async';
diff --git a/pkg/analyzer_plugin/test/integration/support/protocol_matchers.dart b/pkg/analyzer_plugin/test/integration/support/protocol_matchers.dart
index 9639648..d360ead 100644
--- a/pkg/analyzer_plugin/test/integration/support/protocol_matchers.dart
+++ b/pkg/analyzer_plugin/test/integration/support/protocol_matchers.dart
@@ -6,6 +6,9 @@
// To regenerate the file, use the script
// "pkg/analysis_server/tool/spec/generate_files".
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: prefer_interpolation_to_compose_strings
+
/// Matchers for data types defined in the analysis server API.
import 'package:test/test.dart';
diff --git a/pkg/analyzer_utilities/lib/tools.dart b/pkg/analyzer_utilities/lib/tools.dart
index aae7a2a..b57f35a 100644
--- a/pkg/analyzer_utilities/lib/tools.dart
+++ b/pkg/analyzer_utilities/lib/tools.dart
@@ -168,6 +168,9 @@
// This file has been automatically generated. Please do not edit it manually.
// To regenerate the file, use the script
// "pkg/analysis_server/tool/spec/generate_files".
+
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: prefer_interpolation_to_compose_strings
''';
}
writeln(header.trim());
diff --git a/pkg/vm_service/pubspec.yaml b/pkg/vm_service/pubspec.yaml
index 8d8a774..8936629 100644
--- a/pkg/vm_service/pubspec.yaml
+++ b/pkg/vm_service/pubspec.yaml
@@ -14,7 +14,7 @@
async: ^2.5.0
expect: any
lints: any
- markdown: ^4.0.0
+ markdown: '>=4.0.0 <6.0.0'
mockito: any
path: ^1.8.0
process: ^4.0.0
diff --git a/runtime/vm/app_snapshot.cc b/runtime/vm/app_snapshot.cc
index a6a4766..c8f2ca5 100644
--- a/runtime/vm/app_snapshot.cc
+++ b/runtime/vm/app_snapshot.cc
@@ -53,6 +53,11 @@
write_v8_snapshot_profile_to,
NULL,
"Write a snapshot profile in V8 format to a file.");
+DEFINE_FLAG(bool,
+ print_array_optimization_candidates,
+ false,
+ "Print information about how many array are candidates for Smi and "
+ "ROData optimizations.");
#endif // defined(DART_PRECOMPILER)
namespace {
@@ -5401,7 +5406,64 @@
}
}
+#if defined(DART_PRECOMPILER)
+ static bool IsReadOnlyCid(intptr_t cid) {
+ switch (cid) {
+ case kPcDescriptorsCid:
+ case kCodeSourceMapCid:
+ case kCompressedStackMapsCid:
+ case kOneByteStringCid:
+ case kTwoByteStringCid:
+ return true;
+ default:
+ return false;
+ }
+ }
+#endif // defined(DART_PRECOMPILER)
+
void WriteAlloc(Serializer* s) {
+#if defined(DART_PRECOMPILER)
+ if (FLAG_print_array_optimization_candidates) {
+ intptr_t array_count = objects_.length();
+ intptr_t array_count_allsmi = 0;
+ intptr_t array_count_allro = 0;
+ intptr_t array_count_empty = 0;
+ intptr_t element_count = 0;
+ intptr_t element_count_allsmi = 0;
+ intptr_t element_count_allro = 0;
+ for (intptr_t i = 0; i < array_count; i++) {
+ ArrayPtr array = objects_[i];
+ bool allsmi = true;
+ bool allro = true;
+ const intptr_t length = Smi::Value(array->untag()->length());
+ for (intptr_t i = 0; i < length; i++) {
+ ObjectPtr element = array->untag()->element(i);
+ intptr_t cid = element->GetClassIdMayBeSmi();
+ if (!IsReadOnlyCid(cid)) allro = false;
+ if (cid != kSmiCid) allsmi = false;
+ }
+ element_count += length;
+ if (length == 0) {
+ array_count_empty++;
+ } else if (allsmi) {
+ array_count_allsmi++;
+ element_count_allsmi += length;
+ } else if (allro) {
+ array_count_allro++;
+ element_count_allro += length;
+ }
+ }
+ OS::PrintErr("Arrays\n");
+ OS::PrintErr(" total: %" Pd ", % " Pd " elements\n", array_count,
+ element_count);
+ OS::PrintErr(" smi-only:%" Pd ", % " Pd " elements\n",
+ array_count_allsmi, element_count_allsmi);
+ OS::PrintErr(" ro-only:%" Pd " , % " Pd " elements\n", array_count_allro,
+ element_count_allro);
+ OS::PrintErr(" empty:%" Pd "\n", array_count_empty);
+ }
+#endif // defined(DART_PRECOMPILER)
+
const intptr_t count = objects_.length();
s->WriteUnsigned(count);
for (intptr_t i = 0; i < count; i++) {
diff --git a/runtime/vm/heap/gc_shared.h b/runtime/vm/heap/gc_shared.h
index 1a0d98d7..a3112ff 100644
--- a/runtime/vm/heap/gc_shared.h
+++ b/runtime/vm/heap/gc_shared.h
@@ -233,6 +233,18 @@
finalizer_dart->untag()->exchange_entries_collected(current_entry);
current_entry->untag()->set_next(previous_head);
const bool first_entry = previous_head.IsRawNull();
+
+ // If we're in the marker, we need to ensure that we release the store
+ // buffer afterwards.
+ // If we're in the scavenger and have the finalizer in old space and
+ // a new space entry, we don't need to release the store buffer.
+ if (!first_entry && previous_head->IsNewObject() &&
+ current_entry->IsOldObject()) {
+ TRACE_FINALIZER("Entry %p (old) next is %p (new)",
+ current_entry->untag(), previous_head->untag());
+ // We must release the thread's store buffer block.
+ }
+
// Schedule calling Dart finalizer.
if (first_entry) {
Isolate* isolate = finalizer->untag()->isolate_;
diff --git a/runtime/vm/heap/marker.cc b/runtime/vm/heap/marker.cc
index 2b77843..452e0d4 100644
--- a/runtime/vm/heap/marker.cc
+++ b/runtime/vm/heap/marker.cc
@@ -273,6 +273,15 @@
work_list_.Finalize();
deferred_work_list_.Finalize();
MournFinalized(this);
+ // MournFinalized inserts newly discovered dead entries into the
+ // linked list attached to the Finalizer. This might create
+ // cross-generational references which might be added to the store
+ // buffer. Release the store buffer to satisfy the invariant that
+ // thread local store buffer is empty after marking and all references
+ // are processed.
+ // TODO(http://dartbug.com/48957): `thread_` can differ from
+ // `Thread::Current()`.
+ Thread::Current()->ReleaseStoreBuffer();
}
void MournWeakProperties() {
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index e042e93..207a9a4 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -5043,6 +5043,87 @@
#undef FINALIZER_CROSS_GEN_TEST_CASE
+// Force the marker to add a FinalizerEntry to the store buffer during marking.
+//
+// This test requires two entries, one in new space, one in old space.
+// The scavenger should run first, adding the entry to collected_entries.
+// The marker runs right after, swapping the collected_entries with the entry
+// in old space, _and_ setting the next field to the entry in new space.
+// This forces the entry to be added to the store-buffer _during_ marking.
+//
+// Then, the compacter needs to be used. Which will move the entry in old
+// space.
+//
+// If the thread's store buffer block is not released after that, the compactor
+// will not update it, causing an outdated address to be released to the store
+// buffer later.
+//
+// This causes two types of errors to trigger with --verify-store-buffer:
+// 1. We see the address in the store buffer but the object is no entry there.
+// Also can cause segfaults on reading garbage or unallocated memory.
+// 2. We see the entry has a marked bit, but can't find it in the store buffer.
+ISOLATE_UNIT_TEST_CASE(Finalizer_Regress_48843) {
+#ifdef DEBUG
+ SetFlagScope<bool> sfs(&FLAG_trace_finalizers, true);
+ SetFlagScope<bool> sfs2(&FLAG_verify_store_buffer, true);
+#endif
+ SetFlagScope<bool> sfs3(&FLAG_use_compactor, true);
+
+ const auto& finalizer = Finalizer::Handle(Finalizer::New(Heap::kOld));
+ finalizer.set_isolate(thread->isolate());
+
+ const auto& detach1 =
+ String::Handle(OneByteString::New("detach1", Heap::kNew));
+ const auto& token1 = String::Handle(OneByteString::New("token1", Heap::kNew));
+ const auto& detach2 =
+ String::Handle(OneByteString::New("detach2", Heap::kOld));
+ const auto& token2 = String::Handle(OneByteString::New("token2", Heap::kOld));
+
+ {
+ HANDLESCOPE(thread);
+ const auto& entry1 =
+ FinalizerEntry::Handle(FinalizerEntry::New(finalizer, Heap::kNew));
+ entry1.set_detach(detach1);
+ entry1.set_token(token1);
+
+ const auto& entry2 =
+ FinalizerEntry::Handle(FinalizerEntry::New(finalizer, Heap::kOld));
+ entry2.set_detach(detach2);
+ entry2.set_token(token2);
+
+ {
+ HANDLESCOPE(thread);
+ const auto& value1 =
+ String::Handle(OneByteString::New("value1", Heap::kNew));
+ entry1.set_value(value1);
+ const auto& value2 =
+ String::Handle(OneByteString::New("value2", Heap::kOld));
+ entry2.set_value(value2);
+ // Lose both values.
+ }
+
+ // First collect new space.
+ GCTestHelper::CollectNewSpace();
+ // Then old space, this will make the old space entry point to the new
+ // space entry.
+ // Also, this must be a mark compact, not a mark sweep, to move the entry.
+ GCTestHelper::CollectOldSpace();
+ }
+
+ // Imagine callbacks running.
+ // Entries themselves become unreachable.
+ finalizer.set_entries_collected(
+ FinalizerEntry::Handle(FinalizerEntry::null()));
+
+ // There should be a single entry in the store buffer.
+ // And it should crash when seeing the address in the buffer.
+ GCTestHelper::CollectNewSpace();
+
+ // We should no longer be processing the entries.
+ GCTestHelper::CollectOldSpace();
+ GCTestHelper::CollectNewSpace();
+}
+
void NativeFinalizer_TwoEntriesCrossGen_Finalizer(void* peer) {
intptr_t* token = reinterpret_cast<intptr_t*>(peer);
(*token)++;
diff --git a/runtime/vm/thread.cc b/runtime/vm/thread.cc
index 573e775..2a6495b 100644
--- a/runtime/vm/thread.cc
+++ b/runtime/vm/thread.cc
@@ -380,8 +380,10 @@
void Thread::ReleaseStoreBuffer() {
ASSERT(IsAtSafepoint());
+ if (store_buffer_block_ == nullptr || store_buffer_block_->IsEmpty()) {
+ return; // Nothing to release.
+ }
// Prevent scheduling another GC by ignoring the threshold.
- ASSERT(store_buffer_block_ != nullptr);
StoreBufferRelease(StoreBuffer::kIgnoreThreshold);
// Make sure to get an *empty* block; the isolate needs all entries
// at GC time.
diff --git a/sdk/lib/core/weak.dart b/sdk/lib/core/weak.dart
index e7832d8..60790e8 100644
--- a/sdk/lib/core/weak.dart
+++ b/sdk/lib/core/weak.dart
@@ -191,7 +191,7 @@
/// No promises are made that the callback will ever be called.
/// The only thing that is guaranteed is that if a finalizer's callback
/// is called with a specific finalization token as argument,
-/// then at least one value with an attachment to to the finalizer
+/// then at least one value with an attachment to the finalizer
/// that has that finalization token,
/// is no longer accessible to the program.
///
diff --git a/tools/VERSION b/tools/VERSION
index 97aecf2..d56cb22 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 18
PATCH 0
-PRERELEASE 85
+PRERELEASE 86
PRERELEASE_PATCH 0
\ No newline at end of file