Version 2.14.0-145.0.dev
Merge commit '538e47a1fc83687a0f5d15080807a6c41599cce7' into 'dev'
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_returned_value.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_returned_value.dart
new file mode 100644
index 0000000..cf69624
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_returned_value.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class RemoveReturnedValue extends CorrectionProducer {
+ @override
+ FixKind get fixKind => DartFixKind.REMOVE_RETURNED_VALUE;
+
+ @override
+ FixKind get multiFixKind => DartFixKind.REMOVE_RETURNED_VALUE_MULTI;
+
+ @override
+ Future<void> compute(ChangeBuilder builder) async {
+ final node = this.node;
+ if (node is ReturnStatement) {
+ await builder.addDartFileEdit(file, (builder) {
+ builder.addDeletion(range.endStart(node.returnKeyword, node.semicolon));
+ });
+ }
+ }
+
+ /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+ static RemoveReturnedValue newInstance() => RemoveReturnedValue();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index 661861a..f76a542 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -621,6 +621,12 @@
'dart.fix.remove.questionMark.multi',
DartFixKindPriority.IN_FILE,
'Remove unnecessary question marks in file');
+ static const REMOVE_RETURNED_VALUE = FixKind('dart.fix.remove.returnedValue',
+ DartFixKindPriority.DEFAULT, 'Remove invalid returned value');
+ static const REMOVE_RETURNED_VALUE_MULTI = FixKind(
+ 'dart.fix.remove.returnedValue.multi',
+ DartFixKindPriority.IN_FILE,
+ 'Remove invalid returned values in file');
static const REMOVE_THIS_EXPRESSION = FixKind(
'dart.fix.remove.thisExpression',
DartFixKindPriority.DEFAULT,
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index 6359410..4ebbaad 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -109,6 +109,7 @@
import 'package:analysis_server/src/services/correction/dart/remove_parameters_in_getter_declaration.dart';
import 'package:analysis_server/src/services/correction/dart/remove_parentheses_in_getter_invocation.dart';
import 'package:analysis_server/src/services/correction/dart/remove_question_mark.dart';
+import 'package:analysis_server/src/services/correction/dart/remove_returned_value.dart';
import 'package:analysis_server/src/services/correction/dart/remove_this_expression.dart';
import 'package:analysis_server/src/services/correction/dart/remove_type_annotation.dart';
import 'package:analysis_server/src/services/correction/dart/remove_type_arguments.dart';
@@ -458,6 +459,15 @@
],
)
],
+ LintNames.avoid_returning_null_for_void: [
+ FixInfo(
+ canBeAppliedToFile: true,
+ canBeBulkApplied: true,
+ generators: [
+ RemoveReturnedValue.newInstance,
+ ],
+ )
+ ],
LintNames.avoid_single_cascade_in_expression_statements: [
FixInfo(
canBeAppliedToFile: true,
diff --git a/pkg/analysis_server/lib/src/services/linter/lint_names.dart b/pkg/analysis_server/lib/src/services/linter/lint_names.dart
index 4f9fd95..15a8e7a 100644
--- a/pkg/analysis_server/lib/src/services/linter/lint_names.dart
+++ b/pkg/analysis_server/lib/src/services/linter/lint_names.dart
@@ -25,6 +25,8 @@
'avoid_return_types_on_setters';
static const String avoid_returning_null_for_future =
'avoid_returning_null_for_future';
+ static const String avoid_returning_null_for_void =
+ 'avoid_returning_null_for_void';
static const String avoid_single_cascade_in_expression_statements =
'avoid_single_cascade_in_expression_statements';
static const String avoid_types_as_parameter_names =
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_returned_value_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_returned_value_test.dart
new file mode 100644
index 0000000..41d65eb
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_returned_value_test.dart
@@ -0,0 +1,67 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/linter/lint_names.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'bulk/bulk_fix_processor.dart';
+import 'fix_processor.dart';
+
+void main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(RemoveReturnedValueBulkTest);
+ defineReflectiveTests(RemoveReturnedValueTest);
+ });
+}
+
+@reflectiveTest
+class RemoveReturnedValueBulkTest extends BulkFixProcessorTest {
+ @override
+ String get lintCode => LintNames.avoid_returning_null_for_void;
+
+ Future<void> test_simple() async {
+ await resolveTestCode('''
+void f(bool b) {
+ if (b) {
+ return null;
+ } else {
+ return null;
+ }
+}
+''');
+ await assertHasFix('''
+void f(bool b) {
+ if (b) {
+ return;
+ } else {
+ return;
+ }
+}
+''');
+ }
+}
+
+@reflectiveTest
+class RemoveReturnedValueTest extends FixProcessorLintTest {
+ @override
+ FixKind get kind => DartFixKind.REMOVE_RETURNED_VALUE;
+
+ @override
+ String get lintCode => LintNames.avoid_returning_null_for_void;
+
+ Future<void> test_simple() async {
+ await resolveTestCode('''
+void f() {
+ return null;
+}
+''');
+ await assertHasFix('''
+void f() {
+ return;
+}
+''');
+ }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
index acc1caf..fe58f4e 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
@@ -126,6 +126,7 @@
import 'remove_parentheses_in_getter_invocation_test.dart'
as remove_parentheses_in_getter_invocation;
import 'remove_question_mark_test.dart' as remove_question_mark;
+import 'remove_returned_value_test.dart' as remove_returned_value;
import 'remove_this_expression_test.dart' as remove_this_expression;
import 'remove_type_annotation_test.dart' as remove_type_annotation;
import 'remove_type_arguments_test.dart' as remove_type_arguments;
@@ -290,6 +291,7 @@
remove_parameters_in_getter_declaration.main();
remove_parentheses_in_getter_invocation.main();
remove_question_mark.main();
+ remove_returned_value.main();
remove_this_expression.main();
remove_type_annotation.main();
remove_type_arguments.main();
diff --git a/pkg/analyzer/lib/src/summary2/library_builder.dart b/pkg/analyzer/lib/src/summary2/library_builder.dart
index b4e210f..d78d0d5 100644
--- a/pkg/analyzer/lib/src/summary2/library_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/library_builder.dart
@@ -82,39 +82,6 @@
}
}
- /// Add top-level declaration of the library units to the local scope.
- void addLocalDeclarations() {
- for (var linkingUnit in context.units) {
- for (var node in linkingUnit.unit.declarations) {
- if (node is ast.ClassDeclaration) {
- // Handled in ElementBuilder.
- } else if (node is ast.ClassTypeAlias) {
- // Handled in ElementBuilder.
- } else if (node is ast.EnumDeclarationImpl) {
- // Handled in ElementBuilder.
- } else if (node is ast.ExtensionDeclarationImpl) {
- // Handled in ElementBuilder.
- } else if (node is ast.FunctionDeclarationImpl) {
- // Handled in ElementBuilder.
- } else if (node is ast.FunctionTypeAlias) {
- // Handled in ElementBuilder.
- } else if (node is ast.GenericTypeAlias) {
- // Handled in ElementBuilder.
- } else if (node is ast.MixinDeclarationImpl) {
- // Handled in ElementBuilder.
- } else if (node is ast.TopLevelVariableDeclaration) {
- // Handled in ElementBuilder.
- } else {
- throw UnimplementedError('${node.runtimeType}');
- }
- }
- }
- if ('$uri' == 'dart:core') {
- localScope.declare('dynamic', reference.getChild('dynamic'));
- localScope.declare('Never', reference.getChild('Never'));
- }
- }
-
/// Return `true` if the export scope was modified.
bool addToExportScope(String name, Reference reference) {
if (name.startsWith('_')) return false;
@@ -135,6 +102,8 @@
as LibraryElementImpl;
}
+ /// Build elements for declarations in the library units, add top-level
+ /// declarations to the local scope, for combining into export scopes.
void buildElements() {
for (var unitContext in context.units) {
var elementBuilder = ElementBuilder(
@@ -147,6 +116,10 @@
}
elementBuilder.buildDeclarationElements(unitContext.unit);
}
+ if ('$uri' == 'dart:core') {
+ localScope.declare('dynamic', reference.getChild('dynamic'));
+ localScope.declare('Never', reference.getChild('Never'));
+ }
}
void buildEnumChildren() {
diff --git a/pkg/analyzer/lib/src/summary2/link.dart b/pkg/analyzer/lib/src/summary2/link.dart
index a6ee88f..d3408d6 100644
--- a/pkg/analyzer/lib/src/summary2/link.dart
+++ b/pkg/analyzer/lib/src/summary2/link.dart
@@ -119,7 +119,6 @@
}
for (var library in builders.values) {
- library.addLocalDeclarations();
library.buildElements();
}
diff --git a/pkg/analyzer/test/src/diagnostics/implicit_dynamic_field_test.dart b/pkg/analyzer/test/src/diagnostics/implicit_dynamic_field_test.dart
new file mode 100644
index 0000000..fd002a6
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/implicit_dynamic_field_test.dart
@@ -0,0 +1,119 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(ImplicitDynamicFieldTest);
+ defineReflectiveTests(ImplicitDynamicFieldWithoutNullSafetyTest);
+ });
+}
+
+@reflectiveTest
+class ImplicitDynamicFieldTest extends PubPackageResolutionTest
+ with ImplicitDynamicFieldTestCases {}
+
+mixin ImplicitDynamicFieldTestCases on PubPackageResolutionTest {
+ @override
+ void setUp() {
+ super.setUp();
+ writeTestPackageAnalysisOptionsFile(
+ AnalysisOptionsFileConfig(implicitDynamic: false),
+ );
+ }
+
+ test_instance_explicitDynamic_initialized() async {
+ await assertNoErrorsInCode('''
+class C {
+ dynamic f = (<dynamic>[])[0];
+}
+''');
+ }
+
+ test_instance_explicitDynamic_uninitialized() async {
+ await assertNoErrorsInCode('''
+class C {
+ dynamic f;
+}
+''');
+ }
+
+ test_instance_final_initialized() async {
+ await assertErrorsInCode('''
+class C {
+ final f = (<dynamic>[])[0];
+}
+''', [
+ error(LanguageCode.IMPLICIT_DYNAMIC_FIELD, 18, 20),
+ ]);
+ }
+
+ test_instance_final_uninitialized() async {
+ await assertErrorsInCode('''
+class C {
+ final f;
+ C(this.f);
+}
+''', [
+ error(LanguageCode.IMPLICIT_DYNAMIC_FIELD, 18, 1),
+ ]);
+ }
+
+ test_instance_var_initialized() async {
+ await assertErrorsInCode('''
+class C {
+ var f = (<dynamic>[])[0];
+}
+''', [
+ error(LanguageCode.IMPLICIT_DYNAMIC_FIELD, 16, 20),
+ ]);
+ }
+
+ test_instance_var_initialized_inference() async {
+ await assertNoErrorsInCode('''
+class C {
+ var f = 0;
+}
+''');
+ }
+
+ test_instance_var_uninitialized() async {
+ await assertErrorsInCode('''
+class C {
+ var f;
+}
+''', [
+ error(LanguageCode.IMPLICIT_DYNAMIC_FIELD, 16, 1),
+ ]);
+ }
+
+ test_instance_var_uninitialized_multiple() async {
+ await assertErrorsInCode('''
+class C {
+ var f, g = 42, h;
+}
+''', [
+ error(LanguageCode.IMPLICIT_DYNAMIC_FIELD, 16, 1),
+ error(LanguageCode.IMPLICIT_DYNAMIC_FIELD, 27, 1),
+ ]);
+ }
+
+ test_static_var_initialized() async {
+ await assertErrorsInCode('''
+class C {
+ static var f = (<dynamic>[])[0];
+}
+''', [
+ error(LanguageCode.IMPLICIT_DYNAMIC_FIELD, 23, 20),
+ ]);
+ }
+}
+
+@reflectiveTest
+class ImplicitDynamicFieldWithoutNullSafetyTest extends PubPackageResolutionTest
+ with ImplicitDynamicFieldTestCases, WithoutNullSafetyMixin {}
diff --git a/pkg/analyzer/test/src/diagnostics/implicit_dynamic_function_test.dart b/pkg/analyzer/test/src/diagnostics/implicit_dynamic_function_test.dart
new file mode 100644
index 0000000..1ec587d
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/implicit_dynamic_function_test.dart
@@ -0,0 +1,142 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(ImplicitDynamicFunctionTest);
+ defineReflectiveTests(ImplicitDynamicFunctionWithoutNullSafetyTest);
+ });
+}
+
+@reflectiveTest
+class ImplicitDynamicFunctionTest extends PubPackageResolutionTest
+ with ImplicitDynamicFunctionTestCases {}
+
+mixin ImplicitDynamicFunctionTestCases on PubPackageResolutionTest {
+ @override
+ void setUp() {
+ super.setUp();
+ writeTestPackageAnalysisOptionsFile(
+ AnalysisOptionsFileConfig(implicitDynamic: false),
+ );
+ }
+
+ test_local_downwardInferenceGivesInt() async {
+ await assertNoErrorsInCode('''
+void f(int d) {
+ T g<T>() => throw 'x';
+ d = g();
+}
+''');
+ }
+
+ test_local_noDownwardsInference() async {
+ await assertErrorsInCode('''
+void f(dynamic d) {
+ T a<T>() => throw 'x';
+ d = a();
+}
+''', [
+ error(LanguageCode.IMPLICIT_DYNAMIC_FUNCTION, 51, 1),
+ ]);
+ }
+
+ test_local_noInference() async {
+ await assertErrorsInCode('''
+void f(dynamic d) {
+ void a<T>() {};
+ a();
+}
+''', [
+ error(LanguageCode.IMPLICIT_DYNAMIC_FUNCTION, 40, 1),
+ ]);
+ }
+
+ test_local_upwardsInferenceGivesDynamic() async {
+ await assertErrorsInCode('''
+void f(dynamic d) {
+ void a<T>(T t) {};
+ a(d);
+}
+''', [
+ error(LanguageCode.IMPLICIT_DYNAMIC_FUNCTION, 43, 1),
+ ]);
+ }
+
+ test_local_upwardsInferenceGivesInt() async {
+ await assertNoErrorsInCode('''
+void f() {
+ void a<T>(T t) {};
+ a(42);
+}
+''');
+ }
+
+ test_topLevel_downwardInferenceGivesDynamic() async {
+ await assertErrorsInCode('''
+external T a<T>();
+
+void f(dynamic d) {
+ d = a();
+}
+''', [
+ error(LanguageCode.IMPLICIT_DYNAMIC_FUNCTION, 46, 1),
+ ]);
+ }
+
+ test_topLevel_downwardInferenceGivesInt() async {
+ await assertNoErrorsInCode('''
+external T a<T>();
+
+void f(int d) {
+ d = a();
+}
+''');
+ }
+
+ test_topLevel_dynamicAssignmentToTypeVariable() async {
+ await assertErrorsInCode('''
+T a<T>(T t) => t;
+
+void f(dynamic d) {
+ a(d);
+ a(42);
+}
+''', [
+ error(LanguageCode.IMPLICIT_DYNAMIC_FUNCTION, 41, 1),
+ ]);
+ }
+
+ test_topLevel_intAssignmentToTypeVariable() async {
+ await assertNoErrorsInCode('''
+T a<T>(T t) => t;
+
+void f() {
+ a(42);
+}
+''');
+ }
+
+ test_topLevel_noInference() async {
+ await assertErrorsInCode('''
+void a<T>() {}
+
+void f() {
+ a();
+}
+''', [
+ error(LanguageCode.IMPLICIT_DYNAMIC_FUNCTION, 29, 1),
+ ]);
+ }
+}
+
+@reflectiveTest
+class ImplicitDynamicFunctionWithoutNullSafetyTest
+ extends PubPackageResolutionTest
+ with ImplicitDynamicFunctionTestCases, WithoutNullSafetyMixin {}
diff --git a/pkg/analyzer/test/src/diagnostics/implicit_dynamic_list_literal_test.dart b/pkg/analyzer/test/src/diagnostics/implicit_dynamic_list_literal_test.dart
new file mode 100644
index 0000000..85f8b79
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/implicit_dynamic_list_literal_test.dart
@@ -0,0 +1,92 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(ImplicitDynamicListLiteralTest);
+ defineReflectiveTests(ImplicitDynamicListLiteralWithoutNullSafetyTest);
+ });
+}
+
+@reflectiveTest
+class ImplicitDynamicListLiteralTest extends PubPackageResolutionTest
+ with ImplicitDynamicListLiteralTestCases {}
+
+mixin ImplicitDynamicListLiteralTestCases on PubPackageResolutionTest {
+ @override
+ void setUp() {
+ super.setUp();
+ writeTestPackageAnalysisOptionsFile(
+ AnalysisOptionsFileConfig(implicitDynamic: false),
+ );
+ }
+
+ test_assignedToListWithExplicitTypeArgument_dynamic() async {
+ await assertErrorsInCode('''
+List<dynamic> a = [];
+''', [
+ error(LanguageCode.IMPLICIT_DYNAMIC_LIST_LITERAL, 18, 2),
+ ]);
+ }
+
+ test_assignedToListWithExplicitTypeArgument_int() async {
+ await assertNoErrorsInCode('''
+List<int> a = [];
+''');
+ }
+
+ test_assignedToRawList() async {
+ await assertErrorsInCode('''
+List a = [];
+''', [
+ error(LanguageCode.IMPLICIT_DYNAMIC_LIST_LITERAL, 9, 2),
+ ]);
+ }
+
+ test_assignedToVar_empty() async {
+ await assertErrorsInCode('''
+var a = [];
+''', [
+ error(LanguageCode.IMPLICIT_DYNAMIC_LIST_LITERAL, 8, 2),
+ ]);
+ }
+
+ test_assignedToVar_nonDynamicElements() async {
+ await assertNoErrorsInCode('''
+var a = [42];
+''');
+ }
+
+ test_dynamicElements() async {
+ await assertErrorsInCode('''
+void f(dynamic d) {
+ [d, d];
+}
+''', [
+ error(LanguageCode.IMPLICIT_DYNAMIC_LIST_LITERAL, 22, 6),
+ ]);
+ }
+
+ test_explicitTypeArgument_dynamic() async {
+ await assertNoErrorsInCode('''
+var a = <dynamic>[];
+''');
+ }
+
+ test_explicitTypeArgument_int() async {
+ await assertNoErrorsInCode('''
+var a = <int>[];
+''');
+ }
+}
+
+@reflectiveTest
+class ImplicitDynamicListLiteralWithoutNullSafetyTest
+ extends PubPackageResolutionTest
+ with ImplicitDynamicListLiteralTestCases, WithoutNullSafetyMixin {}
diff --git a/pkg/analyzer/test/src/diagnostics/implicit_dynamic_map_literal_test.dart b/pkg/analyzer/test/src/diagnostics/implicit_dynamic_map_literal_test.dart
new file mode 100644
index 0000000..b9941ca
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/implicit_dynamic_map_literal_test.dart
@@ -0,0 +1,100 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(ImplicitDynamicMapLiteralTest);
+ defineReflectiveTests(ImplicitDynamicMapLiteralWithoutNullSafetyTest);
+ });
+}
+
+@reflectiveTest
+class ImplicitDynamicMapLiteralTest extends PubPackageResolutionTest
+ with ImplicitDynamicMapLiteralTestCases {}
+
+mixin ImplicitDynamicMapLiteralTestCases on PubPackageResolutionTest {
+ @override
+ void setUp() {
+ super.setUp();
+ writeTestPackageAnalysisOptionsFile(
+ AnalysisOptionsFileConfig(implicitDynamic: false),
+ );
+ }
+
+ test_assignedToMapWithExplicitTypeArguments_dynamic() async {
+ await assertErrorsInCode('''
+Map<dynamic, dynamic> a = {};
+''', [
+ error(LanguageCode.IMPLICIT_DYNAMIC_MAP_LITERAL, 26, 2),
+ ]);
+ }
+
+ test_assignedToMapWithExplicitTypeArguments_int() async {
+ await assertNoErrorsInCode('''
+Map<int, int> a = {};
+''');
+ }
+
+ test_assignedToRawMap() async {
+ await assertErrorsInCode('''
+Map a = {};
+''', [
+ error(LanguageCode.IMPLICIT_DYNAMIC_MAP_LITERAL, 8, 2),
+ ]);
+ }
+
+ test_assignedToVar_empty() async {
+ await assertErrorsInCode('''
+var a = {};
+''', [
+ error(LanguageCode.IMPLICIT_DYNAMIC_MAP_LITERAL, 8, 2),
+ ]);
+ }
+
+ test_assignedToVar_nonDynamicElements() async {
+ await assertNoErrorsInCode('''
+var a = {0: 1};
+''');
+ }
+
+ test_dynamicKey() async {
+ await assertErrorsInCode('''
+dynamic d = 1;
+var a = {d: 'x'};
+''', [
+ error(LanguageCode.IMPLICIT_DYNAMIC_MAP_LITERAL, 23, 8),
+ ]);
+ }
+
+ test_dynamicValue() async {
+ await assertErrorsInCode('''
+dynamic d = 1;
+var a = {'x': d};
+''', [
+ error(LanguageCode.IMPLICIT_DYNAMIC_MAP_LITERAL, 23, 8),
+ ]);
+ }
+
+ test_explicitTypeArguments_dynamic() async {
+ await assertNoErrorsInCode('''
+var a = <dynamic, dynamic>{};
+''');
+ }
+
+ test_explicitTypeArguments_int() async {
+ await assertNoErrorsInCode('''
+var a = <int, int>{};
+''');
+ }
+}
+
+@reflectiveTest
+class ImplicitDynamicMapLiteralWithoutNullSafetyTest
+ extends PubPackageResolutionTest
+ with ImplicitDynamicMapLiteralTestCases, WithoutNullSafetyMixin {}
diff --git a/pkg/analyzer/test/src/diagnostics/test_all.dart b/pkg/analyzer/test/src/diagnostics/test_all.dart
index 66018e3..78fe8d7 100644
--- a/pkg/analyzer/test/src/diagnostics/test_all.dart
+++ b/pkg/analyzer/test/src/diagnostics/test_all.dart
@@ -240,6 +240,11 @@
import 'implements_super_class_test.dart' as implements_super_class;
import 'implements_type_alias_expands_to_type_parameter_test.dart'
as implements_type_alias_expands_to_type_parameter;
+import 'implicit_dynamic_field_test.dart' as implicit_dynamic_field;
+import 'implicit_dynamic_function_test.dart' as implicit_dynamic_function;
+import 'implicit_dynamic_list_literal_test.dart'
+ as implicit_dynamic_list_literal;
+import 'implicit_dynamic_map_literal_test.dart' as implicit_dynamic_map_literal;
import 'implicit_this_reference_in_initializer_test.dart'
as implicit_this_reference_in_initializer;
import 'import_deferred_library_with_load_function_test.dart'
@@ -851,6 +856,10 @@
implements_repeated.main();
implements_super_class.main();
implements_type_alias_expands_to_type_parameter.main();
+ implicit_dynamic_field.main();
+ implicit_dynamic_function.main();
+ implicit_dynamic_list_literal.main();
+ implicit_dynamic_map_literal.main();
implicit_this_reference_in_initializer.main();
import_deferred_library_with_load_function.main();
import_internal_library.main();
diff --git a/pkg/analyzer/test/src/task/strong/checker_test.dart b/pkg/analyzer/test/src/task/strong/checker_test.dart
index 61cbee9..dfad546 100644
--- a/pkg/analyzer/test/src/task/strong/checker_test.dart
+++ b/pkg/analyzer/test/src/task/strong/checker_test.dart
@@ -1790,111 +1790,6 @@
]);
}
- test_implicitDynamic_field() async {
- _disableTestPackageImplicitDynamic();
- await assertErrorsInCode(r'''
-class C {
- var x0;
- var x1 = (<dynamic>[])[0];
- var x2, x3 = 42, x4;
- dynamic y0;
- dynamic y1 = (<dynamic>[])[0];
-}
-''', [
- error(LanguageCode.IMPLICIT_DYNAMIC_FIELD, 16, 2),
- error(LanguageCode.IMPLICIT_DYNAMIC_FIELD, 26, 21),
- error(LanguageCode.IMPLICIT_DYNAMIC_FIELD, 55, 2),
- error(LanguageCode.IMPLICIT_DYNAMIC_FIELD, 68, 2),
- ]);
- }
-
- test_implicitDynamic_function() async {
- _disableTestPackageImplicitDynamic();
- await assertErrorsInCode(r'''
-T a<T>(T t) => t;
-T b<T>() => null;
-
-void main<S>() {
- dynamic d;
- int i;
- a(d);
- a(42);
- b();
- d = b();
- i = b();
-
- void f<T>(T t) {};
- T g<T>() => null;
-
- f(d);
- f(42);
- g();
- d = g();
- i = g();
-
- (<T>(T t) => t)(d);
- (<T>(T t) => t)(42);
- (<T>() => null as T)<int>();
-}
-''', [
- error(HintCode.UNUSED_LOCAL_VARIABLE, 73, 1),
- error(LanguageCode.IMPLICIT_DYNAMIC_FUNCTION, 78, 1),
- error(LanguageCode.IMPLICIT_DYNAMIC_FUNCTION, 95, 1),
- error(LanguageCode.IMPLICIT_DYNAMIC_FUNCTION, 106, 1),
- error(LanguageCode.IMPLICIT_DYNAMIC_FUNCTION, 167, 1),
- error(LanguageCode.IMPLICIT_DYNAMIC_FUNCTION, 184, 1),
- error(LanguageCode.IMPLICIT_DYNAMIC_FUNCTION, 195, 1),
- error(LanguageCode.IMPLICIT_DYNAMIC_INVOKE, 214, 15),
- error(HintCode.UNNECESSARY_CAST, 269, 9),
- ]);
- }
-
- test_implicitDynamic_listLiteral() async {
- _disableTestPackageImplicitDynamic();
- await assertErrorsInCode(r'''
-var l0 = [];
-List l1 = [];
-List<dynamic> l2 = [];
-dynamic d = 42;
-var l3 = [d, d];
-
-var l4 = <dynamic>[];
-var l5 = <int>[];
-List<int> l6 = [];
-var l7 = [42];
-''', [
- error(LanguageCode.IMPLICIT_DYNAMIC_LIST_LITERAL, 9, 2),
- error(LanguageCode.IMPLICIT_DYNAMIC_LIST_LITERAL, 23, 2),
- error(LanguageCode.IMPLICIT_DYNAMIC_LIST_LITERAL, 46, 2),
- error(LanguageCode.IMPLICIT_DYNAMIC_LIST_LITERAL, 75, 6),
- ]);
- }
-
- test_implicitDynamic_mapLiteral() async {
- _disableTestPackageImplicitDynamic();
- await assertErrorsInCode(r'''
-var m0 = {};
-Map m1 = {};
-Map<dynamic, dynamic> m2 = {};
-dynamic d = 42;
-var m3 = {d: d};
-var m4 = {'x': d, 'y': d};
-var m5 = {d: 'x'};
-
-var m6 = <dynamic, dynamic>{};
-var m7 = <String, String>{};
-Map<String, String> m8 = {};
-var m9 = {'hi': 'there'};
-''', [
- error(LanguageCode.IMPLICIT_DYNAMIC_MAP_LITERAL, 9, 2),
- error(LanguageCode.IMPLICIT_DYNAMIC_MAP_LITERAL, 22, 2),
- error(LanguageCode.IMPLICIT_DYNAMIC_MAP_LITERAL, 53, 2),
- error(LanguageCode.IMPLICIT_DYNAMIC_MAP_LITERAL, 82, 6),
- error(LanguageCode.IMPLICIT_DYNAMIC_MAP_LITERAL, 99, 16),
- error(LanguageCode.IMPLICIT_DYNAMIC_MAP_LITERAL, 126, 8),
- ]);
- }
-
test_implicitDynamic_method() async {
_disableTestPackageImplicitDynamic();
await assertErrorsInCode(r'''
diff --git a/tools/VERSION b/tools/VERSION
index 32421ed..237e5a0 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 14
PATCH 0
-PRERELEASE 144
+PRERELEASE 145
PRERELEASE_PATCH 0
\ No newline at end of file