Apply resolution to list literal type arguments.
R=brianwilkerson@google.com, paulberry@google.com
Change-Id: I27eeb30b452a5fa74cda61b6926d48ec92918c8f
Reviewed-on: https://dart-review.googlesource.com/65025
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/fasta/resolution_applier.dart b/pkg/analyzer/lib/src/fasta/resolution_applier.dart
index 0f5bf34..99c1af3 100644
--- a/pkg/analyzer/lib/src/fasta/resolution_applier.dart
+++ b/pkg/analyzer/lib/src/fasta/resolution_applier.dart
@@ -430,6 +430,7 @@
@override
void visitListLiteral(ListLiteral node) {
+ node.typeArguments?.accept(this);
node.elements.accept(this);
DartType type = _get(node.constKeyword ?? node.leftBracket).inferredType;
node.staticType = type;
diff --git a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart
index deb8881..28e878d 100644
--- a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart
@@ -89,13 +89,6 @@
await super.test_fieldFormalParameterNotAssignableToField_map_keyMismatch();
}
- @override
- @failingTest
- test_fieldFormalParameterAssignableToField_list_nonDynamic() {
- // Failed to resolve 1 nodes
- return super.test_fieldFormalParameterAssignableToField_list_nonDynamic();
- }
-
@failingTest
@override
test_fieldFormalParameterNotAssignableToField_map_valueMismatch() async {
diff --git a/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart b/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
index 4c45c7f..73bce7e 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
@@ -157,13 +157,6 @@
@override
@failingTest
- test_expectedOneListTypeArgument() {
- // Failed to resolve 1 nodes
- return super.test_expectedOneListTypeArgument();
- }
-
- @override
- @failingTest
test_fieldFormalParameter_genericFunctionTyped() {
// Expected 0 errors of type ParserErrorCode.EXPECTED_TOKEN, found 1 (88)
return super.test_fieldFormalParameter_genericFunctionTyped();
@@ -214,13 +207,6 @@
@override
@failingTest
- test_invalidTypeArgumentInConstList() {
- // Failed to resolve 1 nodes
- return super.test_invalidTypeArgumentInConstList();
- }
-
- @override
- @failingTest
test_invocationOfNonFunction_functionTypeTypeParameter() {
// Bad state: Not found #lib2::C::T in null
return super.test_invocationOfNonFunction_functionTypeTypeParameter();
@@ -235,13 +221,6 @@
@override
@failingTest
- test_listElementTypeNotAssignable() {
- // Failed to resolve 2 nodes
- return super.test_listElementTypeNotAssignable();
- }
-
- @override
- @failingTest
@FastaProblem('https://github.com/dart-lang/sdk/issues/30609')
test_metadata_enumConstantDeclaration() {
// Failed to resolve 2 nodes
@@ -257,13 +236,6 @@
@override
@failingTest
- test_nonConstantDefaultValue_typedConstList() {
- // Failed to resolve 2 nodes
- return super.test_nonConstantDefaultValue_typedConstList();
- }
-
- @override
- @failingTest
@FastaProblem('https://github.com/dart-lang/sdk/issues/31628')
test_nonConstCaseExpression_constField() async {
return super.test_nonConstCaseExpression_constField();
diff --git a/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart b/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart
index 363b81f..9bd78f3 100644
--- a/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart
@@ -64,13 +64,6 @@
@override
@failingTest
- test_expectedOneListTypeArgument() async {
- // Bad state: Found 1 argument types for 2 type arguments
- await super.test_expectedOneListTypeArgument();
- }
-
- @override
- @failingTest
test_expectedTwoMapTypeArguments_one() async {
// Bad state: Found 2 argument types for 1 type arguments
await super.test_expectedTwoMapTypeArguments_one();
@@ -85,13 +78,6 @@
@override
@failingTest
- test_forIn_declaredVariableRightType() {
- // Failed to resolve 1 nodes
- return super.test_forIn_declaredVariableRightType();
- }
-
- @override
- @failingTest
test_forIn_declaredVariableWrongType() async {
// Expected 1 errors of type StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, found 0
await super.test_forIn_declaredVariableWrongType();
@@ -99,27 +85,6 @@
@override
@failingTest
- test_forIn_downcast() {
- // Failed to resolve 1 nodes
- return super.test_forIn_downcast();
- }
-
- @override
- @failingTest
- test_forIn_dynamicVariable() {
- // Failed to resolve 1 nodes
- return super.test_forIn_dynamicVariable();
- }
-
- @override
- @failingTest
- test_forIn_existingVariableRightType() {
- // Failed to resolve 1 nodes
- return super.test_forIn_existingVariableRightType();
- }
-
- @override
- @failingTest
test_forIn_existingVariableWrongType() async {
// Expected 1 errors of type StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, found 0
await super.test_forIn_existingVariableWrongType();
@@ -141,13 +106,6 @@
@override
@failingTest
- test_forIn_upcast() {
- // Failed to resolve 1 nodes
- return super.test_forIn_upcast();
- }
-
- @override
- @failingTest
test_illegalAsyncGeneratorReturnType_function_nonStream() async {
// Expected 1 errors of type StaticTypeWarningCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE, found 0
await super.test_illegalAsyncGeneratorReturnType_function_nonStream();
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
index d30217a..685a711 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -44,8 +44,14 @@
FindNode findNode;
FindElement findElement;
+ ClassElement get doubleElement => typeProvider.doubleType.element;
+
InterfaceType get doubleType => typeProvider.doubleType;
+ DynamicTypeImpl get dynamicType => DynamicTypeImpl.instance;
+
+ ClassElement get intElement => typeProvider.intType.element;
+
InterfaceType get intType => typeProvider.intType;
ClassElement get mapElement => typeProvider.mapType.element;
@@ -3531,6 +3537,55 @@
expect(breakStatement.label.staticType, isNull);
}
+ test_listLiteral_01() async {
+ addTestFile(r'''
+main() {
+ var v = [];
+}
+''');
+ await resolveTestFile();
+ expect(result.errors, isNotEmpty);
+
+ var literal = findNode.listLiteral('[];');
+ expect(literal.typeArguments, isNull);
+ assertType(literal, 'List<dynamic>');
+ }
+
+ test_listLiteral_02() async {
+ addTestFile(r'''
+main() {
+ var v = <>[];
+}
+''');
+ await resolveTestFile();
+ expect(result.errors, isNotEmpty);
+
+ var literal = findNode.listLiteral('[];');
+ expect(literal.typeArguments, isNotNull);
+ assertType(literal, 'List<dynamic>');
+ }
+
+ test_listLiteral_2() async {
+ addTestFile(r'''
+main() {
+ var v = <int, double>[];
+}
+''');
+ await resolveTestFile();
+ expect(result.errors, isNotEmpty);
+
+ var literal = findNode.listLiteral('<int, double>[]');
+ assertType(literal, 'List<dynamic>');
+
+ var intRef = findNode.simple('int, double');
+ assertElement(intRef, intElement);
+ assertType(intRef, 'int');
+
+ var doubleRef = findNode.simple('double>[]');
+ assertElement(doubleRef, doubleElement);
+ assertType(doubleRef, 'double');
+ }
+
test_local_function() async {
addTestFile(r'''
void main() {
@@ -8500,6 +8555,10 @@
return _node(search).getAncestor((n) => n is InstanceCreationExpression);
}
+ ListLiteral listLiteral(String search) {
+ return _node(search).getAncestor((n) => n is ListLiteral);
+ }
+
MethodInvocation methodInvocation(String search) {
return _node(search).getAncestor((n) => n is MethodInvocation);
}
diff --git a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
index f4419ea..700338f 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
@@ -4215,8 +4215,10 @@
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const MessageCode messageListLiteralTooManyTypeArguments = const MessageCode(
"ListLiteralTooManyTypeArguments",
+ analyzerCode: "EXPECTED_ONE_LIST_TYPE_ARGUMENTS",
+ dart2jsCode: "*fatal*",
severity: Severity.errorLegacyWarning,
- message: r"""Too many type arguments on List literal.""");
+ message: r"""List literal requires exactly one type argument.""");
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Code<Null> codeListLiteralTypeArgumentMismatch =
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index 5c65c75..8517bbc 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -212,7 +212,6 @@
InvalidVoid/script2: Fail
LibraryDirectiveNotFirst/script2: Fail
LibraryDirectiveNotFirst/script3: Fail
-ListLiteralTooManyTypeArguments/analyzerCode: Fail
ListLiteralTooManyTypeArguments/example: Fail
ListLiteralTypeArgumentMismatch/analyzerCode: Fail
ListLiteralTypeArgumentMismatch/example: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index e868c75..4e00d0d 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -1218,8 +1218,10 @@
severity: CONTEXT
ListLiteralTooManyTypeArguments:
- template: "Too many type arguments on List literal."
+ template: "List literal requires exactly one type argument."
severity: ERROR_LEGACY_WARNING
+ analyzerCode: EXPECTED_ONE_LIST_TYPE_ARGUMENTS
+ dart2jsCode: "*fatal*"
ListLiteralTypeArgumentMismatch:
template: "Map literal requires two type arguments."