Update TypeInfo to correctly parse "T<void>"
Change-Id: I2fe4d1c36c52a599d9d80809d88562657100dcdf
Reviewed-on: https://dart-review.googlesource.com/46480
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Dan Rubel <danrubel@google.com>
diff --git a/pkg/front_end/lib/src/fasta/parser/type_info.dart b/pkg/front_end/lib/src/fasta/parser/type_info.dart
index 9c56333..8a012ce 100644
--- a/pkg/front_end/lib/src/fasta/parser/type_info.dart
+++ b/pkg/front_end/lib/src/fasta/parser/type_info.dart
@@ -113,7 +113,8 @@
if (optional('<', next)) {
if (next.endGroup != null) {
next = next.next;
- if (isValidTypeReference(next)) {
+ // identifier `<` `void` `>` is handled by ComplexTypeInfo.
+ if (isValidTypeReference(next) && !identical('void', next.stringValue)) {
next = next.next;
if (optional('>', next)) {
// We've seen identifier `<` identifier `>`
diff --git a/pkg/front_end/test/fasta/parser/type_info_test.dart b/pkg/front_end/test/fasta/parser/type_info_test.dart
index 33153ca..4efa647 100644
--- a/pkg/front_end/test/fasta/parser/type_info_test.dart
+++ b/pkg/front_end/test/fasta/parser/type_info_test.dart
@@ -230,11 +230,19 @@
expectInfo(noTypeInfo, 'C<T>;', required: false);
expectInfo(noTypeInfo, 'C<T>(', required: false);
expectInfo(noTypeInfo, 'C<T> do', required: false);
+ expectInfo(noTypeInfo, 'C<void>', required: false);
expectInfo(simpleTypeArgumentsInfo, 'C<T>', required: true);
expectInfo(simpleTypeArgumentsInfo, 'C<T>;', required: true);
expectInfo(simpleTypeArgumentsInfo, 'C<T>(', required: true);
expectInfo(simpleTypeArgumentsInfo, 'C<T> do', required: true);
+ expectComplexInfo('C<void>', required: true, expectedCalls: [
+ 'handleIdentifier C typeReference',
+ 'beginTypeArguments <',
+ 'handleVoidKeyword void',
+ 'endTypeArguments 1 < >',
+ 'handleType C ',
+ ]);
expectInfo(simpleTypeArgumentsInfo, 'C<T> foo');
expectInfo(simpleTypeArgumentsInfo, 'C<T> get');