Error for ambiguous set/map literals with too many type arguments
Change-Id: Icfdeb5e13ecefbc0a431c2d36904c8064a29a5b2
Reviewed-on: https://dart-review.googlesource.com/c/87041
Commit-Queue: Aske Simon Christensen <askesc@google.com>
Reviewed-by: Dan Rubel <danrubel@google.com>
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 0cb1431..bdee95c 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
@@ -5931,7 +5931,7 @@
"MapLiteralTypeArgumentMismatch",
analyzerCodes: <String>["EXPECTED_TWO_MAP_TYPE_ARGUMENTS"],
severity: Severity.errorLegacyWarning,
- message: r"""Map literal requires exactly two type arguments.""");
+ message: r"""A map literal requires exactly two type arguments.""");
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Code<Null> codeMemberWithSameNameAsClass =
@@ -7861,7 +7861,18 @@
const MessageCode messageSetLiteralTooManyTypeArguments = const MessageCode(
"SetLiteralTooManyTypeArguments",
severity: Severity.errorLegacyWarning,
- message: r"""Set literal requires exactly one type argument.""");
+ message: r"""A set literal requires exactly one type argument.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeSetOrMapLiteralTooManyTypeArguments =
+ messageSetOrMapLiteralTooManyTypeArguments;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageSetOrMapLiteralTooManyTypeArguments = const MessageCode(
+ "SetOrMapLiteralTooManyTypeArguments",
+ severity: Severity.errorLegacyWarning,
+ message:
+ r"""A set or map literal requires exactly one or two type arguments, respectively.""");
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<Message Function(String name)> templateSetterNotFound =
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 5d3ad9e..a6659ff 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -2345,7 +2345,13 @@
debugEvent("EmptyLiteralSetOrMap");
// Treat as map literal - type inference will find the right type.
List<UnresolvedType<KernelTypeBuilder>> typeArguments = pop();
- assert(typeArguments == null);
+ assert(typeArguments == null || typeArguments.length > 2);
+ if (typeArguments != null && typeArguments.length > 2) {
+ addProblem(
+ fasta.messageSetOrMapLiteralTooManyTypeArguments,
+ offsetForToken(leftBrace),
+ lengthOfSpan(leftBrace, leftBrace.endGroup));
+ }
push(forest.literalMap(
constKeyword,
constKeyword != null || constantContext == ConstantContext.inferred,
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index 9e1f015..8b0ff26 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -4451,8 +4451,6 @@
case 2:
return parseLiteralMapSuffix(token, constKeyword);
default:
- // TODO(danrubel): Add a compile time warning that set literals
- // require one type argument and map literals require two.
return parseLiteralSetOrMapSuffix(token, constKeyword);
}
}
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index c444a6d..8001c80 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -313,6 +313,8 @@
SdkSummaryNotFound/example: Fail
SetLiteralTooManyTypeArguments/analyzerCode: Fail
SetLiteralTooManyTypeArguments/example: Fail
+SetOrMapLiteralTooManyTypeArguments/analyzerCode: Fail
+SetOrMapLiteralTooManyTypeArguments/example: Fail
SetterNotFound/example: Fail
SetterNotSync/example: Fail
SetterWithWrongNumberOfFormals/example: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 86aad34..5f6e9b5 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -1440,14 +1440,18 @@
analyzerCode: EXPECTED_ONE_LIST_TYPE_ARGUMENTS
SetLiteralTooManyTypeArguments:
- template: "Set literal requires exactly one type argument."
+ template: "A set literal requires exactly one type argument."
severity: ERROR_LEGACY_WARNING
MapLiteralTypeArgumentMismatch:
- template: "Map literal requires exactly two type arguments."
+ template: "A map literal requires exactly two type arguments."
severity: ERROR_LEGACY_WARNING
analyzerCode: EXPECTED_TWO_MAP_TYPE_ARGUMENTS
+SetOrMapLiteralTooManyTypeArguments:
+ template: "A set or map literal requires exactly one or two type arguments, respectively."
+ severity: ERROR_LEGACY_WARNING
+
LoadLibraryTakesNoArguments:
template: "'loadLibrary' takes no arguments."
severity: ERROR_LEGACY_WARNING