Skip to content

Commit

Permalink
[parser] Allow '..' as something following a nullable type
Browse files Browse the repository at this point in the history
Fixes #42621

Change-Id: I56fd9475ffb3821592a6917949e858c6e48bdf20
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/153773
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Jens Johansen <jensj@google.com>
  • Loading branch information
jensjoha authored and commit-bot@chromium.org committed Jul 9, 2020
1 parent c8b5a9b commit 01ac35b
Show file tree
Hide file tree
Showing 6 changed files with 1,155 additions and 1 deletion.
2 changes: 1 addition & 1 deletion pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5655,7 +5655,7 @@ class Parser {
if (typeInfo.isNullable) {
Token next = typeInfo.skipType(token).next;
if (!isOneOfOrEof(
next, const [')', '?', '??', ',', ';', ':', 'is', 'as'])) {
next, const [')', '?', '??', ',', ';', ':', 'is', 'as', '..'])) {
// TODO(danrubel): investigate other situations
// where `?` should be considered part of the type info
// rather than the start of a conditional expression.
Expand Down
27 changes: 27 additions & 0 deletions pkg/front_end/parser_testcases/nnbd/issue_42621.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
Order method1(Map<String, dynamic> json) {
return Order()
..x = json['x'] as List
..y = json['y'] as int;
}

Order method2(Map<String, dynamic> json) {
return Order()
..x = json['x'] as List?
..y = json['y'] as int;
}

Order method3(Map<String, dynamic> json) {
return Order()
..x = (json['x'] as List?)
..y = json['y'] as int;
}

Order method4(Map<String, dynamic> json) {
return Order()
..x = json['x'] as List?;
}

class Order {
List? x;
int? y;
}
341 changes: 341 additions & 0 deletions pkg/front_end/parser_testcases/nnbd/issue_42621.dart.expect
Original file line number Diff line number Diff line change
@@ -0,0 +1,341 @@
beginCompilationUnit(Order)
beginMetadataStar(Order)
endMetadataStar(0)
beginTopLevelMember(Order)
beginTopLevelMethod(, null)
handleIdentifier(Order, typeReference)
handleNoTypeArguments(method1)
handleType(Order, null)
handleIdentifier(method1, topLevelFunctionDeclaration)
handleNoTypeVariables(()
beginFormalParameters((, MemberKind.TopLevelMethod)
beginMetadataStar(Map)
endMetadataStar(0)
beginFormalParameter(Map, MemberKind.TopLevelMethod, null, null, null)
handleIdentifier(Map, typeReference)
beginTypeArguments(<)
handleIdentifier(String, typeReference)
handleNoTypeArguments(,)
handleType(String, null)
handleIdentifier(dynamic, typeReference)
handleNoTypeArguments(>)
handleType(dynamic, null)
endTypeArguments(2, <, >)
handleType(Map, null)
handleIdentifier(json, formalParameterDeclaration)
handleFormalParameterWithoutValue())
endFormalParameter(null, null, json, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
handleAsyncModifier(null, null)
beginBlockFunctionBody({)
beginReturnStatement(return)
handleIdentifier(Order, expression)
handleNoTypeArguments(()
beginArguments(()
endArguments(0, (, ))
handleSend(Order, ..)
beginCascade(..)
handleIdentifier(x, expressionContinuation)
handleNoTypeArguments(=)
handleNoArguments(=)
handleSend(x, =)
endBinaryExpression(..)
handleIdentifier(json, expression)
handleNoTypeArguments([)
handleNoArguments([)
handleSend(json, [)
beginLiteralString('x')
endLiteralString(0, ])
handleIndexedExpression(null, [, ])
beginAsOperatorType(as)
handleIdentifier(List, typeReference)
handleNoTypeArguments(..)
handleType(List, null)
endAsOperatorType(as)
handleAsOperator(as)
handleAssignmentExpression(=)
endCascade()
beginCascade(..)
handleIdentifier(y, expressionContinuation)
handleNoTypeArguments(=)
handleNoArguments(=)
handleSend(y, =)
endBinaryExpression(..)
handleIdentifier(json, expression)
handleNoTypeArguments([)
handleNoArguments([)
handleSend(json, [)
beginLiteralString('y')
endLiteralString(0, ])
handleIndexedExpression(null, [, ])
beginAsOperatorType(as)
handleIdentifier(int, typeReference)
handleNoTypeArguments(;)
handleType(int, null)
endAsOperatorType(as)
handleAsOperator(as)
handleAssignmentExpression(=)
endCascade()
endReturnStatement(true, return, ;)
endBlockFunctionBody(1, {, })
endTopLevelMethod(Order, null, })
endTopLevelDeclaration(Order)
beginMetadataStar(Order)
endMetadataStar(0)
beginTopLevelMember(Order)
beginTopLevelMethod(}, null)
handleIdentifier(Order, typeReference)
handleNoTypeArguments(method2)
handleType(Order, null)
handleIdentifier(method2, topLevelFunctionDeclaration)
handleNoTypeVariables(()
beginFormalParameters((, MemberKind.TopLevelMethod)
beginMetadataStar(Map)
endMetadataStar(0)
beginFormalParameter(Map, MemberKind.TopLevelMethod, null, null, null)
handleIdentifier(Map, typeReference)
beginTypeArguments(<)
handleIdentifier(String, typeReference)
handleNoTypeArguments(,)
handleType(String, null)
handleIdentifier(dynamic, typeReference)
handleNoTypeArguments(>)
handleType(dynamic, null)
endTypeArguments(2, <, >)
handleType(Map, null)
handleIdentifier(json, formalParameterDeclaration)
handleFormalParameterWithoutValue())
endFormalParameter(null, null, json, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
handleAsyncModifier(null, null)
beginBlockFunctionBody({)
beginReturnStatement(return)
handleIdentifier(Order, expression)
handleNoTypeArguments(()
beginArguments(()
endArguments(0, (, ))
handleSend(Order, ..)
beginCascade(..)
handleIdentifier(x, expressionContinuation)
handleNoTypeArguments(=)
handleNoArguments(=)
handleSend(x, =)
endBinaryExpression(..)
handleIdentifier(json, expression)
handleNoTypeArguments([)
handleNoArguments([)
handleSend(json, [)
beginLiteralString('x')
endLiteralString(0, ])
handleIndexedExpression(null, [, ])
beginAsOperatorType(as)
handleIdentifier(List, typeReference)
handleNoTypeArguments(?)
handleType(List, ?)
endAsOperatorType(as)
handleAsOperator(as)
handleAssignmentExpression(=)
endCascade()
beginCascade(..)
handleIdentifier(y, expressionContinuation)
handleNoTypeArguments(=)
handleNoArguments(=)
handleSend(y, =)
endBinaryExpression(..)
handleIdentifier(json, expression)
handleNoTypeArguments([)
handleNoArguments([)
handleSend(json, [)
beginLiteralString('y')
endLiteralString(0, ])
handleIndexedExpression(null, [, ])
beginAsOperatorType(as)
handleIdentifier(int, typeReference)
handleNoTypeArguments(;)
handleType(int, null)
endAsOperatorType(as)
handleAsOperator(as)
handleAssignmentExpression(=)
endCascade()
endReturnStatement(true, return, ;)
endBlockFunctionBody(1, {, })
endTopLevelMethod(Order, null, })
endTopLevelDeclaration(Order)
beginMetadataStar(Order)
endMetadataStar(0)
beginTopLevelMember(Order)
beginTopLevelMethod(}, null)
handleIdentifier(Order, typeReference)
handleNoTypeArguments(method3)
handleType(Order, null)
handleIdentifier(method3, topLevelFunctionDeclaration)
handleNoTypeVariables(()
beginFormalParameters((, MemberKind.TopLevelMethod)
beginMetadataStar(Map)
endMetadataStar(0)
beginFormalParameter(Map, MemberKind.TopLevelMethod, null, null, null)
handleIdentifier(Map, typeReference)
beginTypeArguments(<)
handleIdentifier(String, typeReference)
handleNoTypeArguments(,)
handleType(String, null)
handleIdentifier(dynamic, typeReference)
handleNoTypeArguments(>)
handleType(dynamic, null)
endTypeArguments(2, <, >)
handleType(Map, null)
handleIdentifier(json, formalParameterDeclaration)
handleFormalParameterWithoutValue())
endFormalParameter(null, null, json, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
handleAsyncModifier(null, null)
beginBlockFunctionBody({)
beginReturnStatement(return)
handleIdentifier(Order, expression)
handleNoTypeArguments(()
beginArguments(()
endArguments(0, (, ))
handleSend(Order, ..)
beginCascade(..)
handleIdentifier(x, expressionContinuation)
handleNoTypeArguments(=)
handleNoArguments(=)
handleSend(x, =)
endBinaryExpression(..)
handleIdentifier(json, expression)
handleNoTypeArguments([)
handleNoArguments([)
handleSend(json, [)
beginLiteralString('x')
endLiteralString(0, ])
handleIndexedExpression(null, [, ])
beginAsOperatorType(as)
handleIdentifier(List, typeReference)
handleNoTypeArguments(?)
handleType(List, ?)
endAsOperatorType(as)
handleAsOperator(as)
handleParenthesizedExpression(()
handleAssignmentExpression(=)
endCascade()
beginCascade(..)
handleIdentifier(y, expressionContinuation)
handleNoTypeArguments(=)
handleNoArguments(=)
handleSend(y, =)
endBinaryExpression(..)
handleIdentifier(json, expression)
handleNoTypeArguments([)
handleNoArguments([)
handleSend(json, [)
beginLiteralString('y')
endLiteralString(0, ])
handleIndexedExpression(null, [, ])
beginAsOperatorType(as)
handleIdentifier(int, typeReference)
handleNoTypeArguments(;)
handleType(int, null)
endAsOperatorType(as)
handleAsOperator(as)
handleAssignmentExpression(=)
endCascade()
endReturnStatement(true, return, ;)
endBlockFunctionBody(1, {, })
endTopLevelMethod(Order, null, })
endTopLevelDeclaration(Order)
beginMetadataStar(Order)
endMetadataStar(0)
beginTopLevelMember(Order)
beginTopLevelMethod(}, null)
handleIdentifier(Order, typeReference)
handleNoTypeArguments(method4)
handleType(Order, null)
handleIdentifier(method4, topLevelFunctionDeclaration)
handleNoTypeVariables(()
beginFormalParameters((, MemberKind.TopLevelMethod)
beginMetadataStar(Map)
endMetadataStar(0)
beginFormalParameter(Map, MemberKind.TopLevelMethod, null, null, null)
handleIdentifier(Map, typeReference)
beginTypeArguments(<)
handleIdentifier(String, typeReference)
handleNoTypeArguments(,)
handleType(String, null)
handleIdentifier(dynamic, typeReference)
handleNoTypeArguments(>)
handleType(dynamic, null)
endTypeArguments(2, <, >)
handleType(Map, null)
handleIdentifier(json, formalParameterDeclaration)
handleFormalParameterWithoutValue())
endFormalParameter(null, null, json, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
handleAsyncModifier(null, null)
beginBlockFunctionBody({)
beginReturnStatement(return)
handleIdentifier(Order, expression)
handleNoTypeArguments(()
beginArguments(()
endArguments(0, (, ))
handleSend(Order, ..)
beginCascade(..)
handleIdentifier(x, expressionContinuation)
handleNoTypeArguments(=)
handleNoArguments(=)
handleSend(x, =)
endBinaryExpression(..)
handleIdentifier(json, expression)
handleNoTypeArguments([)
handleNoArguments([)
handleSend(json, [)
beginLiteralString('x')
endLiteralString(0, ])
handleIndexedExpression(null, [, ])
beginAsOperatorType(as)
handleIdentifier(List, typeReference)
handleNoTypeArguments(?)
handleType(List, ?)
endAsOperatorType(as)
handleAsOperator(as)
handleAssignmentExpression(=)
endCascade()
endReturnStatement(true, return, ;)
endBlockFunctionBody(1, {, })
endTopLevelMethod(Order, null, })
endTopLevelDeclaration(class)
beginMetadataStar(class)
endMetadataStar(0)
beginClassOrNamedMixinApplicationPrelude(class)
handleIdentifier(Order, classOrMixinDeclaration)
handleNoTypeVariables({)
beginClassDeclaration(class, null, Order)
handleNoType(Order)
handleClassExtends(null)
handleClassNoWithClause()
handleClassOrMixinImplements(null, 0)
handleClassHeader(class, class, null)
beginClassOrMixinBody(DeclarationKind.Class, {)
beginMetadataStar(List)
endMetadataStar(0)
beginMember()
handleIdentifier(List, typeReference)
handleNoTypeArguments(?)
handleType(List, ?)
handleIdentifier(x, fieldDeclaration)
handleNoFieldInitializer(;)
endClassFields(null, null, null, null, 1, List, ;)
endMember()
beginMetadataStar(int)
endMetadataStar(0)
beginMember()
handleIdentifier(int, typeReference)
handleNoTypeArguments(?)
handleType(int, ?)
handleIdentifier(y, fieldDeclaration)
handleNoFieldInitializer(;)
endClassFields(null, null, null, null, 1, int, ;)
endMember()
endClassOrMixinBody(DeclarationKind.Class, 2, {, })
endClassDeclaration(class, })
endTopLevelDeclaration()
endCompilationUnit(5, )
Loading

0 comments on commit 01ac35b

Please sign in to comment.