@@ -3547,9 +3547,10 @@ static AccessorDecl *createAccessorFunc(SourceLoc DeclLoc,
3547
3547
return D;
3548
3548
}
3549
3549
3550
- static ParamDecl *
3551
- createSetterAccessorArgument (SourceLoc nameLoc, Identifier name,
3552
- AccessorKind accessorKind, Parser &P) {
3550
+ static ParamDecl *createSetterAccessorArgument (SourceLoc nameLoc,
3551
+ Identifier name,
3552
+ AccessorKind accessorKind,
3553
+ Parser &P, TypeLoc elementType) {
3553
3554
// Add the parameter. If no name was specified, the name defaults to
3554
3555
// 'value'.
3555
3556
bool isNameImplicit = name.empty ();
@@ -3568,15 +3569,25 @@ createSetterAccessorArgument(SourceLoc nameLoc, Identifier name,
3568
3569
3569
3570
// AST Walker shouldn't go into the type recursively.
3570
3571
result->setIsTypeLocImplicit (true );
3572
+
3573
+ if (auto *repr = elementType.getTypeRepr ()) {
3574
+ if (repr->getKind () ==
3575
+ TypeReprKind::ImplicitlyUnwrappedOptional) {
3576
+ result->getAttrs ().add (
3577
+ new (P.Context ) ImplicitlyUnwrappedOptionalAttr (/* implicit= */ true ));
3578
+ }
3579
+ }
3580
+
3571
3581
return result;
3572
3582
}
3573
3583
3574
3584
// / Parse a "(value)" specifier for "set" or "willSet" if present. Create a
3575
3585
// / parameter list to represent the spelled argument or return null if none is
3576
3586
// / present.
3577
- static ParameterList *
3578
- parseOptionalAccessorArgument (SourceLoc SpecifierLoc,
3579
- Parser &P, AccessorKind Kind) {
3587
+ static ParameterList *parseOptionalAccessorArgument (SourceLoc SpecifierLoc,
3588
+ Parser &P,
3589
+ AccessorKind Kind,
3590
+ TypeLoc ElementTy) {
3580
3591
// 'set' and 'willSet' have a (value) parameter, 'didSet' takes an (oldValue)
3581
3592
// parameter and 'get' and always takes a () parameter.
3582
3593
if (Kind != AccessorKind::IsSetter && Kind != AccessorKind::IsWillSet &&
@@ -3614,7 +3625,7 @@ parseOptionalAccessorArgument(SourceLoc SpecifierLoc,
3614
3625
}
3615
3626
3616
3627
if (Name.empty ()) NameLoc = SpecifierLoc;
3617
- auto param = createSetterAccessorArgument (NameLoc, Name, Kind, P);
3628
+ auto param = createSetterAccessorArgument (NameLoc, Name, Kind, P, ElementTy );
3618
3629
return ParameterList::create (P.Context , StartLoc, param, EndLoc);
3619
3630
}
3620
3631
@@ -3846,8 +3857,8 @@ bool Parser::parseGetSetImpl(ParseDeclOptions Flags,
3846
3857
if (Tok.is (tok::l_paren))
3847
3858
diagnose (Loc, diag::protocol_setter_name);
3848
3859
3849
- auto *ValueNameParams
3850
- = parseOptionalAccessorArgument (Loc, *this , Kind);
3860
+ auto *ValueNameParams =
3861
+ parseOptionalAccessorArgument (Loc, *this , Kind, ElementTy );
3851
3862
3852
3863
// Set up a function declaration.
3853
3864
TheDecl = createAccessorFunc (Loc, ValueNameParams,
@@ -3970,7 +3981,7 @@ bool Parser::parseGetSetImpl(ParseDeclOptions Flags,
3970
3981
//
3971
3982
// set-name ::= '(' identifier ')'
3972
3983
auto *ValueNamePattern =
3973
- parseOptionalAccessorArgument (Loc, *this , Kind);
3984
+ parseOptionalAccessorArgument (Loc, *this , Kind, ElementTy );
3974
3985
3975
3986
SyntaxParsingContext BlockCtx (SyntaxContext, SyntaxKind::CodeBlock);
3976
3987
if (AccessorKeywordLoc.isInvalid ()) {
@@ -4426,8 +4437,8 @@ void Parser::ParsedAccessors::record(Parser &P, AbstractStorageDecl *storage,
4426
4437
auto argFunc = (WillSet ? WillSet : DidSet);
4427
4438
auto argLoc = argFunc->getParameterLists ().back ()->getStartLoc ();
4428
4439
4429
- auto argument = createSetterAccessorArgument (argLoc, Identifier (),
4430
- AccessorKind::IsSetter, P);
4440
+ auto argument = createSetterAccessorArgument (
4441
+ argLoc, Identifier (), AccessorKind::IsSetter, P, elementTy );
4431
4442
auto argList = ParameterList::create (P.Context , argument);
4432
4443
Set = createImplicitAccessor (AccessorKind::IsSetter,
4433
4444
AddressorKind::NotAddressor, argList);
@@ -4448,8 +4459,8 @@ void Parser::ParsedAccessors::record(Parser &P, AbstractStorageDecl *storage,
4448
4459
if (MutableAddressor) {
4449
4460
assert (Get && !Set);
4450
4461
auto argument =
4451
- createSetterAccessorArgument (MutableAddressor->getLoc (), Identifier (),
4452
- AccessorKind::IsSetter, P);
4462
+ createSetterAccessorArgument (MutableAddressor->getLoc (), Identifier (),
4463
+ AccessorKind::IsSetter, P, elementTy );
4453
4464
auto argList = ParameterList::create (P.Context , argument);
4454
4465
Set = createImplicitAccessor (AccessorKind::IsSetter,
4455
4466
AddressorKind::NotAddressor, argList);
0 commit comments