diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart index bb0a12964251..aebb4f0a7a25 100644 --- a/pkg/analyzer/lib/src/fasta/ast_builder.dart +++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart @@ -960,8 +960,9 @@ class AstBuilder extends StackListener { } @override - void handleType(Token beginToken) { + void handleType(Token beginToken, Token questionMark) { debugEvent("Type"); + reportErrorIfNullableType(questionMark); TypeArgumentList arguments = pop(); Identifier name = pop(); @@ -2552,7 +2553,7 @@ class AstBuilder extends StackListener { // keyword up to an element? handleIdentifier(voidKeyword, IdentifierContext.typeReference); handleNoTypeArguments(voidKeyword); - handleType(voidKeyword); + handleType(voidKeyword, null); } @override diff --git a/pkg/analyzer/tool/summary/mini_ast.dart b/pkg/analyzer/tool/summary/mini_ast.dart index 2559cb9b7671..031b497bf029 100644 --- a/pkg/analyzer/tool/summary/mini_ast.dart +++ b/pkg/analyzer/tool/summary/mini_ast.dart @@ -478,8 +478,9 @@ class MiniAstBuilder extends StackListener { } @override - void handleType(Token beginToken) { + void handleType(Token beginToken, Token questionMark) { debugEvent("Type"); + reportErrorIfNullableType(questionMark); List typeArguments = popTypedList(); String name = pop(); push(new TypeName(name, typeArguments)); 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 dc8f3dbbd2ff..c9e159979ebf 100644 --- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart +++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart @@ -2467,9 +2467,10 @@ abstract class BodyBuilder extends ScopeListener } @override - void handleType(Token beginToken) { + void handleType(Token beginToken, Token questionMark) { // TODO(ahe): The scope is wrong for return types of generic functions. debugEvent("Type"); + reportErrorIfNullableType(questionMark); List> arguments = pop(); Object name = pop(); if (name is QualifiedName) { diff --git a/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart b/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart index 166d266fcb59..f297798b87d7 100644 --- a/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart +++ b/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart @@ -1349,8 +1349,8 @@ class ForwardingListener implements Listener { } @override - void handleType(Token beginToken) { - listener?.handleType(beginToken); + void handleType(Token beginToken, Token questionMark) { + listener?.handleType(beginToken, questionMark); } @override @@ -1398,6 +1398,11 @@ class ForwardingListener implements Listener { listener?.logEvent(name); } + @override + void reportErrorIfNullableType(Token questionMark) { + listener?.reportErrorIfNullableType(questionMark); + } + @override set suppressParseErrors(bool value) { listener?.suppressParseErrors = value; diff --git a/pkg/front_end/lib/src/fasta/parser/listener.dart b/pkg/front_end/lib/src/fasta/parser/listener.dart index 457928db3b3d..720f2443a1c0 100644 --- a/pkg/front_end/lib/src/fasta/parser/listener.dart +++ b/pkg/front_end/lib/src/fasta/parser/listener.dart @@ -6,7 +6,7 @@ library fasta.parser.listener; import '../../scanner/token.dart' show Token; -import '../fasta_codes.dart' show Message; +import '../fasta_codes.dart' show Message, templateUnexpectedToken; import '../quote.dart' show UnescapeErrorListener; @@ -18,6 +18,8 @@ import 'identifier_context.dart' show IdentifierContext; import 'member_kind.dart' show MemberKind; +import 'util.dart' show optional; + /// A parser event listener that does nothing except throw exceptions /// on parser errors. /// @@ -933,10 +935,22 @@ class Listener implements UnescapeErrorListener { logEvent("TryStatement"); } - void handleType(Token beginToken) { + void handleType(Token beginToken, Token questionMark) { logEvent("Type"); } + // TODO(danrubel): Remove this once all listeners have been updated + // to properly handle nullable types + void reportErrorIfNullableType(Token questionMark) { + if (questionMark != null) { + assert(optional('?', questionMark)); + handleRecoverableError( + templateUnexpectedToken.withArguments(questionMark), + questionMark, + questionMark); + } + } + void handleNoName(Token token) { logEvent("NoName"); } diff --git a/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart b/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart index f46d8190a1b9..6ec0d201459a 100644 --- a/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart +++ b/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart @@ -148,7 +148,7 @@ class PrefixedType implements TypeInfo { listener.handleQualified(period); listener.handleNoTypeArguments(token.next); - listener.handleType(start); + listener.handleType(start, null); return token; } @@ -183,10 +183,13 @@ class SimpleTypeWith1Argument implements TypeInfo { Token parseType(Token token, Parser parser) { Token start = token = token.next; assert(token.isKeywordOrIdentifier); - Listener listener = parser.listener; - listener.handleIdentifier(token, IdentifierContext.typeReference); + parser.listener.handleIdentifier(token, IdentifierContext.typeReference); token = typeArg.parseArguments(token, parser); - listener.handleType(start); + return parseTypeRest(start, token, parser); + } + + Token parseTypeRest(Token start, Token token, Parser parser) { + parser.listener.handleType(start, null); return token; } @@ -221,10 +224,13 @@ class SimpleType implements TypeInfo { Token parseType(Token token, Parser parser) { token = token.next; assert(isValidTypeReference(token)); - Listener listener = parser.listener; - listener.handleIdentifier(token, IdentifierContext.typeReference); + parser.listener.handleIdentifier(token, IdentifierContext.typeReference); token = noTypeParamOrArg.parseArguments(token, parser); - listener.handleType(token); + return parseTypeRest(token, parser); + } + + Token parseTypeRest(Token token, Parser parser) { + parser.listener.handleType(token, null); return token; } @@ -372,7 +378,7 @@ class ComplexTypeInfo implements TypeInfo { } } token = typeArguments.parseArguments(token, parser); - parser.listener.handleType(typeRefOrPrefix); + parser.listener.handleType(typeRefOrPrefix, null); } } diff --git a/pkg/front_end/lib/src/fasta/source/diet_listener.dart b/pkg/front_end/lib/src/fasta/source/diet_listener.dart index 56575bace79a..e8015fc5318c 100644 --- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart +++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart @@ -148,7 +148,7 @@ class DietListener extends StackListener { } @override - void handleType(Token beginToken) { + void handleType(Token beginToken, Token questionMark) { debugEvent("Type"); discard(1); } diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart index 5b1f67f69142..c39ef6a60c56 100644 --- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart +++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart @@ -961,8 +961,9 @@ class OutlineBuilder extends StackListener { } @override - void handleType(Token beginToken) { + void handleType(Token beginToken, Token questionMark) { debugEvent("Type"); + reportErrorIfNullableType(questionMark); List arguments = pop(); int charOffset = pop(); Object name = pop(); diff --git a/pkg/front_end/lib/src/fasta/source/type_promotion_look_ahead_listener.dart b/pkg/front_end/lib/src/fasta/source/type_promotion_look_ahead_listener.dart index 3778a4cf2909..1fa2e5d81d03 100644 --- a/pkg/front_end/lib/src/fasta/source/type_promotion_look_ahead_listener.dart +++ b/pkg/front_end/lib/src/fasta/source/type_promotion_look_ahead_listener.dart @@ -1212,7 +1212,7 @@ class TypePromotionLookAheadListener extends Listener { } @override - void handleType(Token beginToken) { + void handleType(Token beginToken, Token questionMark) { debugEvent("Type", beginToken); state.pop(); } 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 975eda8f8b47..84d523151df2 100644 --- a/pkg/front_end/test/fasta/parser/type_info_test.dart +++ b/pkg/front_end/test/fasta/parser/type_info_test.dart @@ -141,7 +141,7 @@ class NoTypeInfoTest { expect(listener.calls, [ 'handleIdentifier typeReference', 'handleNoTypeArguments ;', - 'handleType ', + 'handleType null', ]); expect(listener.errors, [new ExpectedError(codeExpectedType, 7, 1)]); } @@ -155,7 +155,7 @@ class NoTypeInfoTest { expect(listener.calls, [ 'handleIdentifier typeReference', 'handleNoTypeArguments ;', - 'handleType ', + 'handleType null', ]); expect(listener.errors, [new ExpectedError(codeExpectedType, 7, 1)]); } @@ -219,7 +219,7 @@ class VoidTypeInfoTest { expect(listener.calls, [ 'handleIdentifier void typeReference', 'handleNoTypeArguments ;', - 'handleType void', + 'handleType void null', ]); expect(listener.errors, [new ExpectedError(codeInvalidVoid, 7, 4)]); } @@ -250,7 +250,7 @@ class VoidTypeInfoTest { expect(listener.calls, [ 'handleIdentifier void typeReference', 'handleNoTypeArguments ;', - 'handleType void', + 'handleType void null', ]); expect(listener.errors, [new ExpectedError(codeInvalidVoid, 7, 4)]); } @@ -289,7 +289,7 @@ class PrefixedTypeInfoTest { 'handleIdentifier a typeReferenceContinuation', 'handleQualified .', 'handleNoTypeArguments ;', - 'handleType C', + 'handleType C null', ]); expect(listener.errors, isNull); } @@ -349,7 +349,7 @@ class SimpleTypeInfoTest { expect(listener.calls, [ 'handleIdentifier C typeReference', 'handleNoTypeArguments ;', - 'handleType C', + 'handleType C null', ]); expect(listener.errors, isNull); } @@ -425,9 +425,9 @@ class SimpleTypeWith1ArgumentTest { 'beginTypeArguments <', 'handleIdentifier T typeReference', 'handleNoTypeArguments >', - 'handleType T', + 'handleType T null', 'endTypeArguments 1 < >', - 'handleType C', + 'handleType C null', ]); expect(listener.errors, isNull); } @@ -471,9 +471,9 @@ class SimpleTypeWith1ArgumentTest { 'beginTypeArguments <', 'handleIdentifier T typeReference', 'handleNoTypeArguments >', - 'handleType T', + 'handleType T null', 'endTypeArguments 1 < >', - 'handleType C', + 'handleType C null', ]); expect(listener.errors, isNull); } @@ -516,9 +516,9 @@ class SimpleTypeWith1ArgumentTest { 'beginTypeArguments <', 'handleIdentifier T typeReference', 'handleNoTypeArguments >', - 'handleType T', + 'handleType T null', 'endTypeArguments 1 < >', - 'handleType C', + 'handleType C null', ]); expect(listener.errors, isNull); } @@ -609,7 +609,7 @@ class TypeInfoTest { 'beginFormalParameter int MemberKind.GeneralizedFunctionType', 'handleIdentifier int typeReference', 'handleNoTypeArguments )', - 'handleType int', + 'handleType int null', 'handleNoName )', 'handleFormalParameterWithoutValue )', 'endFormalParameter null null ) FormalParameterKind.mandatory ' @@ -635,7 +635,7 @@ class TypeInfoTest { 'beginFormalParameter int MemberKind.GeneralizedFunctionType', 'handleIdentifier int typeReference', 'handleNoTypeArguments )', - 'handleType int', + 'handleType int null', 'handleNoName )', 'handleFormalParameterWithoutValue )', 'endFormalParameter null null ) FormalParameterKind.mandatory' @@ -674,7 +674,7 @@ class TypeInfoTest { 'beginFunctionType C', 'handleIdentifier C typeReference', 'handleNoTypeArguments Function', - 'handleType C', + 'handleType C null', 'beginFormalParameters ( MemberKind.GeneralizedFunctionType', 'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType', 'endFunctionType Function', @@ -687,7 +687,7 @@ class TypeInfoTest { 'beginTypeArguments <', 'handleVoidKeyword void', 'endTypeArguments 1 < >', - 'handleType C', + 'handleType C null', ]); } @@ -697,12 +697,12 @@ class TypeInfoTest { 'beginTypeArguments <', 'handleIdentifier S typeReference', 'handleNoTypeArguments ,', - 'handleType S', + 'handleType S null', 'handleIdentifier T typeReference', 'handleNoTypeArguments >', - 'handleType T', + 'handleType T null', 'endTypeArguments 2 < >', - 'handleType C', + 'handleType C null', ]); expectComplexInfo('C>', required: true, expectedCalls: [ 'handleIdentifier C typeReference', @@ -711,23 +711,23 @@ class TypeInfoTest { 'beginTypeArguments <', 'handleIdentifier T typeReference', 'handleNoTypeArguments >', - 'handleType T', + 'handleType T null', 'endTypeArguments 1 < >', - 'handleType S', + 'handleType S null', 'endTypeArguments 1 < >', - 'handleType C', + 'handleType C null', ]); expectComplexInfo('C f', expectedAfter: 'f', expectedCalls: [ 'handleIdentifier C typeReference', 'beginTypeArguments <', 'handleIdentifier S typeReference', 'handleNoTypeArguments ,', - 'handleType S', + 'handleType S null', 'handleIdentifier T typeReference', 'handleNoTypeArguments >', - 'handleType T', + 'handleType T null', 'endTypeArguments 2 < >', - 'handleType C', + 'handleType C null', ]); expectComplexInfo('C> f', expectedAfter: 'f', expectedCalls: [ 'handleIdentifier C typeReference', @@ -736,11 +736,11 @@ class TypeInfoTest { 'beginTypeArguments <', 'handleIdentifier T typeReference', 'handleNoTypeArguments >', - 'handleType T', + 'handleType T null', 'endTypeArguments 1 < >', - 'handleType S', + 'handleType S null', 'endTypeArguments 1 < >', - 'handleType C', + 'handleType C null', ]); } @@ -754,9 +754,9 @@ class TypeInfoTest { 'beginTypeArguments <', 'handleIdentifier T typeReference', 'handleNoTypeArguments >', - 'handleType T', + 'handleType T null', 'endTypeArguments 1 < >', - 'handleType C', + 'handleType C null', 'beginFormalParameters ( MemberKind.GeneralizedFunctionType', 'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType', 'endFunctionType Function', @@ -780,12 +780,12 @@ class TypeInfoTest { 'beginTypeArguments <', 'handleIdentifier int typeReference', 'handleNoTypeArguments double' /* was , */, - 'handleType int' /* was , */, + 'handleType int null' /* was , */, 'handleIdentifier double typeReference', 'handleNoTypeArguments >', - 'handleType double', + 'handleType double null', 'endTypeArguments 2 < >', - 'handleType G', + 'handleType G null', ], expectedErrors: [ error(codeExpectedButGot, 6, 6) @@ -797,9 +797,9 @@ class TypeInfoTest { 'beginTypeArguments <', 'handleIdentifier typeReference', 'handleNoTypeArguments >', - 'handleType ', + 'handleType null', 'endTypeArguments 1 < >', - 'handleType C', + 'handleType C null', ], expectedErrors: [ error(codeExpectedType, 2, 1) ]); @@ -811,9 +811,9 @@ class TypeInfoTest { 'beginTypeArguments <', 'handleIdentifier typeReference', 'handleNoTypeArguments >', - 'handleType ', + 'handleType null', 'endTypeArguments 1 < >', - 'handleType C', + 'handleType C null', ], expectedErrors: [ error(codeExpectedType, 2, 1) @@ -865,7 +865,7 @@ class TypeInfoTest { 'handleIdentifier a typeReferenceContinuation', 'handleQualified .', 'handleNoTypeArguments Function', - 'handleType C', + 'handleType C null', 'beginFormalParameters ( MemberKind.GeneralizedFunctionType', 'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType', 'endFunctionType Function', @@ -884,9 +884,9 @@ class TypeInfoTest { 'beginTypeArguments <', 'handleIdentifier T typeReference', 'handleNoTypeArguments >', - 'handleType T', + 'handleType T null', 'endTypeArguments 1 < >', - 'handleType C', + 'handleType C null', ]); expectComplexInfo('C.a f', expectedAfter: 'f', expectedCalls: [ @@ -896,9 +896,9 @@ class TypeInfoTest { 'beginTypeArguments <', 'handleIdentifier T typeReference', 'handleNoTypeArguments >', - 'handleType T', + 'handleType T null', 'endTypeArguments 1 < >', - 'handleType C', + 'handleType C null', ]); } @@ -932,16 +932,16 @@ class TypeInfoTest { 'beginTypeArguments <', 'handleIdentifier T typeReference', 'handleNoTypeArguments >', - 'handleType T', + 'handleType T null', 'endTypeArguments 1 < >', - 'handleType C', + 'handleType C null', 'beginFormalParameters ( MemberKind.GeneralizedFunctionType', 'beginMetadataStar int', 'endMetadataStar 0', 'beginFormalParameter int MemberKind.GeneralizedFunctionType', 'handleIdentifier int typeReference', 'handleNoTypeArguments x', - 'handleType int', + 'handleType int null', 'handleIdentifier x formalParameterDeclaration', 'handleFormalParameterWithoutValue )', 'endFormalParameter null null x FormalParameterKind.mandatory ' @@ -954,7 +954,7 @@ class TypeInfoTest { 'beginFormalParameter int MemberKind.GeneralizedFunctionType', 'handleIdentifier int typeReference', 'handleNoTypeArguments x', - 'handleType int', + 'handleType int null', 'handleIdentifier x formalParameterDeclaration', 'handleFormalParameterWithoutValue )', 'endFormalParameter null null x FormalParameterKind.mandatory ' @@ -1132,7 +1132,7 @@ class SimpleTypeParamOrArgTest { 'beginTypeArguments <', 'handleIdentifier T typeReference', 'handleNoTypeArguments >', - 'handleType T', + 'handleType T null', 'endTypeArguments 1 < >' ]); expect(listener.errors, isNull); @@ -1200,10 +1200,10 @@ class TypeParamOrArgInfoTest { 'beginTypeArguments <', 'handleIdentifier S typeReference', 'handleNoTypeArguments ,', - 'handleType S', + 'handleType S null', 'handleIdentifier T typeReference', 'handleNoTypeArguments >', - 'handleType T', + 'handleType T null', 'endTypeArguments 2 < >' ]); expectComplexTypeArg('=', @@ -1213,10 +1213,10 @@ class TypeParamOrArgInfoTest { 'beginTypeArguments <', 'handleIdentifier S typeReference', 'handleNoTypeArguments ,', - 'handleType S', + 'handleType S null', 'handleIdentifier T typeReference', 'handleNoTypeArguments >=', - 'handleType T', + 'handleType T null', 'endTypeArguments 2 < >' ]); expectComplexTypeArg('>=', @@ -1226,10 +1226,10 @@ class TypeParamOrArgInfoTest { 'beginTypeArguments <', 'handleIdentifier S typeReference', 'handleNoTypeArguments ,', - 'handleType S', + 'handleType S null', 'handleIdentifier T typeReference', 'handleNoTypeArguments >>=', - 'handleType T', + 'handleType T null', 'endTypeArguments 2 < >' ]); expectComplexTypeArg('', @@ -1240,7 +1240,7 @@ class TypeParamOrArgInfoTest { 'beginFunctionType S', 'handleIdentifier S typeReference', 'handleNoTypeArguments Function', - 'handleType S', + 'handleType S null', 'beginFormalParameters ( MemberKind.GeneralizedFunctionType', 'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType', 'endFunctionType Function', @@ -1264,9 +1264,9 @@ class TypeParamOrArgInfoTest { 'beginTypeArguments <', 'handleIdentifier T typeReference', 'handleNoTypeArguments >', - 'handleType T', + 'handleType T null', 'endTypeArguments 1 < >', - 'handleType S', + 'handleType S null', 'endTypeArguments 1 < >' ]); expectComplexTypeArg('>=', @@ -1278,9 +1278,9 @@ class TypeParamOrArgInfoTest { 'beginTypeArguments <', 'handleIdentifier T typeReference', 'handleNoTypeArguments >>=', - 'handleType T', + 'handleType T null', 'endTypeArguments 1 < >', - 'handleType S', + 'handleType S null', 'endTypeArguments 1 < >' ]); expectComplexTypeArg('>>', typeArgumentCount: 1, expectedCalls: [ @@ -1291,11 +1291,11 @@ class TypeParamOrArgInfoTest { 'beginTypeArguments <', 'handleIdentifier U typeReference', 'handleNoTypeArguments >>>', - 'handleType U', + 'handleType U null', 'endTypeArguments 1 < >', - 'handleType T', + 'handleType T null', 'endTypeArguments 1 < >', - 'handleType S', + 'handleType S null', 'endTypeArguments 1 < >' ]); expectComplexTypeArg('>>', typeArgumentCount: 1, expectedCalls: [ @@ -1306,14 +1306,14 @@ class TypeParamOrArgInfoTest { 'beginTypeArguments <', 'handleIdentifier U typeReference', 'handleNoTypeArguments ,', - 'handleType U', + 'handleType U null', 'handleIdentifier V typeReference', 'handleNoTypeArguments >>>', - 'handleType V', + 'handleType V null', 'endTypeArguments 2 < >', - 'handleType T', + 'handleType T null', 'endTypeArguments 1 < >', - 'handleType S', + 'handleType S null', 'endTypeArguments 1 < >' ]); expectComplexTypeArg('>', @@ -1329,7 +1329,7 @@ class TypeParamOrArgInfoTest { 'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType', 'endFunctionType Function', 'endTypeArguments 1 < >', - 'handleType S', + 'handleType S null', 'endTypeArguments 1 < >' ]); expectComplexTypeArg('>=', @@ -1346,7 +1346,7 @@ class TypeParamOrArgInfoTest { 'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType', 'endFunctionType Function', 'endTypeArguments 1 < >', - 'handleType S', + 'handleType S null', 'endTypeArguments 1 < >' ]); expectComplexTypeArg('>', @@ -1362,7 +1362,7 @@ class TypeParamOrArgInfoTest { 'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType', 'endFunctionType Function', 'endTypeArguments 1 < >', - 'handleType S', + 'handleType S null', 'endTypeArguments 1 < >' ]); expectComplexTypeArg('>>', @@ -1380,9 +1380,9 @@ class TypeParamOrArgInfoTest { 'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType', 'endFunctionType Function', 'endTypeArguments 1 < >', - 'handleType T', + 'handleType T null', 'endTypeArguments 1 < >', - 'handleType S', + 'handleType S null', 'endTypeArguments 1 < >' ]); } @@ -1397,7 +1397,7 @@ class TypeParamOrArgInfoTest { 'beginTypeArguments <', 'handleIdentifier S typeReference', 'handleNoTypeArguments extends', - 'handleType S', + 'handleType S null', 'endTypeArguments 1 < >', ]); expectComplexTypeArg('>', @@ -1409,7 +1409,7 @@ class TypeParamOrArgInfoTest { 'beginTypeArguments <', 'handleIdentifier S typeReference', 'handleNoTypeArguments extends', - 'handleType S', + 'handleType S null', 'endTypeArguments 1 < >', ]); expectComplexTypeArg('<@A S,T>', typeArgumentCount: 2, expectedErrors: [ @@ -1418,10 +1418,10 @@ class TypeParamOrArgInfoTest { 'beginTypeArguments <', 'handleIdentifier S typeReference', 'handleNoTypeArguments ,', - 'handleType S', + 'handleType S null', 'handleIdentifier T typeReference', 'handleNoTypeArguments >', - 'handleType T', + 'handleType T null', 'endTypeArguments 2 < >' ]); expectComplexTypeArg('<@A() S,T>', typeArgumentCount: 2, expectedErrors: [ @@ -1430,10 +1430,10 @@ class TypeParamOrArgInfoTest { 'beginTypeArguments <', 'handleIdentifier S typeReference', 'handleNoTypeArguments ,', - 'handleType S', + 'handleType S null', 'handleIdentifier T typeReference', 'handleNoTypeArguments >', - 'handleType T', + 'handleType T null', 'endTypeArguments 2 < >' ]); expectComplexTypeArg('<@A() @B S,T>', @@ -1446,10 +1446,10 @@ class TypeParamOrArgInfoTest { 'beginTypeArguments <', 'handleIdentifier S typeReference', 'handleNoTypeArguments ,', - 'handleType S', + 'handleType S null', 'handleIdentifier T typeReference', 'handleNoTypeArguments >', - 'handleType T', + 'handleType T null', 'endTypeArguments 2 < >' ]); expectComplexTypeArg('', @@ -1479,9 +1479,9 @@ class TypeParamOrArgInfoTest { 'beginTypeArguments <', 'handleIdentifier T typeReference', 'handleNoTypeArguments ', - 'handleType T', + 'handleType T null', 'endTypeArguments 1 < >', - 'handleType S', + 'handleType S null', 'endTypeArguments 1 < >' ]); } @@ -1515,7 +1515,7 @@ class TypeParamOrArgInfoTest { 'handleTypeVariablesDefined T 1', 'handleIdentifier T typeReference', 'handleNoTypeArguments >', - 'handleType T', + 'handleType T null', 'endTypeVariable > 0 extends', 'endTypeVariables < >', ]); @@ -1532,9 +1532,9 @@ class TypeParamOrArgInfoTest { 'beginTypeArguments <', 'handleIdentifier T typeReference', 'handleNoTypeArguments >', - 'handleType T', + 'handleType T null', 'endTypeArguments 1 < >', - 'handleType List', + 'handleType List null', 'endTypeVariable > 0 extends', 'endTypeVariables < >', ]); @@ -1654,7 +1654,7 @@ class TypeParamOrArgInfoTest { 'handleTypeVariablesDefined void 1', 'handleIdentifier void typeReference', 'handleNoTypeArguments >', - 'handleType void', + 'handleType void null', 'endTypeVariable > 0 extends', 'endTypeVariables < >' ]); @@ -1743,9 +1743,9 @@ class TypeParamOrArgInfoTest { 'beginTypeArguments <', 'handleIdentifier T typeReference', 'handleNoTypeArguments fieldName', - 'handleType T', + 'handleType T null', 'endTypeArguments 1 < >', - 'handleType List', + 'handleType List null', 'endTypeVariable fieldName 0 extends', 'endTypeVariables < >', ]); @@ -1765,9 +1765,9 @@ class TypeParamOrArgInfoTest { 'beginTypeArguments <', 'handleIdentifier T typeReference', 'handleNoTypeArguments >', - 'handleType T', + 'handleType T null', 'endTypeArguments 1 < >', - 'handleType Comparable', + 'handleType Comparable null', 'endTypeVariable > 0 extends', 'endTypeVariables < >', ]); @@ -1790,9 +1790,9 @@ class TypeParamOrArgInfoTest { 'beginTypeArguments <', 'handleIdentifier S typeReference', 'handleNoTypeArguments >', - 'handleType S', + 'handleType S null', 'endTypeArguments 1 < >', - 'handleType Comparable', + 'handleType Comparable null', 'endTypeVariable , 0 extends', 'endTypeVariables < >' ]); @@ -1814,7 +1814,7 @@ class TypeParamOrArgInfoTest { 'beginFormalParameter T MemberKind.GeneralizedFunctionType', 'handleIdentifier T typeReference', 'handleNoTypeArguments )', - 'handleType T', + 'handleType T null', 'handleNoName )', 'handleFormalParameterWithoutValue )', 'endFormalParameter null null ) FormalParameterKind.mandatory MemberKind.GeneralizedFunctionType', @@ -1838,11 +1838,11 @@ class TypeParamOrArgInfoTest { 'beginTypeArguments <', 'handleIdentifier T typeReference', 'handleNoTypeArguments >>>', - 'handleType T', + 'handleType T null', 'endTypeArguments 1 < >', - 'handleType List', + 'handleType List null', 'endTypeArguments 1 < >', - 'handleType List', + 'handleType List null', 'endTypeVariable > 0 extends', 'endTypeVariables < >' ]); @@ -1861,14 +1861,14 @@ class TypeParamOrArgInfoTest { 'beginTypeArguments <', 'handleIdentifier S typeReference', 'handleNoTypeArguments ,', - 'handleType S', + 'handleType S null', 'handleIdentifier T typeReference', 'handleNoTypeArguments >>>', - 'handleType T', + 'handleType T null', 'endTypeArguments 2 < >', - 'handleType Map', + 'handleType Map null', 'endTypeArguments 1 < >', - 'handleType List', + 'handleType List null', 'endTypeVariable > 0 extends', 'endTypeVariables < >' ]); @@ -2307,8 +2307,8 @@ class TypeInfoListener implements Listener { } @override - void handleType(Token beginToken) { - calls.add('handleType $beginToken'); + void handleType(Token beginToken, Token questionMark) { + calls.add('handleType $beginToken $questionMark'); } @override