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."