1010//
1111// ===----------------------------------------------------------------------===//
1212
13- #include " CXXMethodBridging.h"
1413#include " SwiftDeclSynthesizer.h"
14+ #include " CXXMethodBridging.h"
1515#include " swift/AST/ASTMangler.h"
1616#include " swift/AST/Attr.h"
1717#include " swift/AST/AttrKind.h"
@@ -47,7 +47,7 @@ static Argument createSelfArg(AccessorDecl *accessorDecl) {
4747
4848static CallExpr *createAccessorImplCallExpr (FuncDecl *accessorImpl,
4949 Argument selfArg,
50- DeclRefExpr *keyRefExpr = nullptr ) {
50+ ArrayRef<Expr *> keyRefExprs ) {
5151 ASTContext &ctx = accessorImpl->getASTContext ();
5252
5353 auto accessorImplExpr =
@@ -60,12 +60,8 @@ static CallExpr *createAccessorImplCallExpr(FuncDecl *accessorImpl,
6060 accessorImplDotCallExpr->setType (accessorImpl->getMethodInterfaceType ());
6161 accessorImplDotCallExpr->setThrows (nullptr );
6262
63- ArgumentList *argList;
64- if (keyRefExpr) {
65- argList = ArgumentList::forImplicitUnlabeled (ctx, {keyRefExpr});
66- } else {
67- argList = ArgumentList::forImplicitUnlabeled (ctx, {});
68- }
63+ ArgumentList *argList = ArgumentList::forImplicitUnlabeled (ctx, keyRefExprs);
64+
6965 auto *accessorImplCallExpr =
7066 CallExpr::createImplicit (ctx, accessorImplDotCallExpr, argList);
7167 accessorImplCallExpr->setType (accessorImpl->getResultInterfaceType ());
@@ -1556,33 +1552,36 @@ synthesizeUnwrappingGetterOrAddressGetterBody(AbstractFunctionDecl *afd,
15561552 ASTContext &ctx = getterDecl->getASTContext ();
15571553
15581554 auto selfArg = createSelfArg (getterDecl);
1559- DeclRefExpr *keyRefExpr = getterDecl->getParameters ()->size () == 0
1560- ? nullptr
1561- : createParamRefExpr (getterDecl, 0 );
1555+ SmallVector<Expr *> arguments;
1556+ for (size_t idx = 0 , end = getterDecl->getParameters ()->size (); idx < end;
1557+ ++idx)
1558+ arguments.push_back (createParamRefExpr (getterDecl, idx));
15621559
15631560 Type elementTy = getterDecl->getResultInterfaceType ();
15641561
15651562 auto *getterImplCallExpr =
1566- createAccessorImplCallExpr (getterImpl, selfArg, keyRefExpr );
1563+ createAccessorImplCallExpr (getterImpl, selfArg, arguments );
15671564
15681565 // This default handles C++'s operator[] that returns a value type.
15691566 Expr *propertyExpr = getterImplCallExpr;
15701567 PointerTypeKind ptrKind;
15711568
1572- // The following check returns true if the subscript operator returns a C++
1573- // reference type. This check actually checks to see if the type is a pointer
1574- // type, but this does not apply to C pointers because they are Optional types
1575- // when imported. TODO: Use a more obvious check here.
1569+ // The following check returns true if the subscript operator returns a
1570+ // C++ reference type. This check actually checks to see if the type is
1571+ // a pointer type, but this does not apply to C pointers because they
1572+ // are Optional types when imported. TODO: Use a more obvious check
1573+ // here.
15761574 if (!isAddress &&
15771575 getterImpl->getResultInterfaceType ()->getAnyPointerElementType (ptrKind)) {
1578- // `getterImpl` can return either UnsafePointer or UnsafeMutablePointer.
1579- // Retrieve the corresponding `.pointee` declaration.
1576+ // `getterImpl` can return either UnsafePointer or
1577+ // UnsafeMutablePointer. Retrieve the corresponding `.pointee`
1578+ // declaration.
15801579 VarDecl *pointeePropertyDecl = ctx.getPointerPointeePropertyDecl (ptrKind);
15811580
15821581 // Handle operator[] that returns a reference type.
1583- SubstitutionMap subMap = SubstitutionMap::get (
1584- ctx.getUnsafePointerDecl ()->getGenericSignature (), {elementTy} ,
1585- LookUpConformanceInModule ());
1582+ SubstitutionMap subMap =
1583+ SubstitutionMap::get ( ctx.getUnsafePointerDecl ()->getGenericSignature (),
1584+ {elementTy}, LookUpConformanceInModule ());
15861585 auto pointeePropertyRefExpr = new (ctx) MemberRefExpr (
15871586 getterImplCallExpr, SourceLoc (),
15881587 ConcreteDeclRef (pointeePropertyDecl, subMap), DeclNameLoc (),
@@ -1627,16 +1626,15 @@ synthesizeUnwrappingSetterBody(AbstractFunctionDecl *afd, void *context) {
16271626
16281627 auto selfArg = createSelfArg (setterDecl);
16291628 DeclRefExpr *valueParamRefExpr = createParamRefExpr (setterDecl, 0 );
1630- // For a subscript this decl will have two parameters, for a pointee property
1631- // it will only have one.
1632- DeclRefExpr *keyParamRefExpr = setterDecl->getParameters ()->size () == 1
1633- ? nullptr
1634- : createParamRefExpr (setterDecl, 1 );
1629+ SmallVector<Expr *> arguments;
1630+ for (size_t idx = 1 , end = setterDecl->getParameters ()->size (); idx < end;
1631+ ++idx)
1632+ arguments.push_back (createParamRefExpr (setterDecl, idx));
16351633
16361634 Type elementTy = valueParamRefExpr->getDecl ()->getInterfaceType ();
16371635
16381636 auto *setterImplCallExpr =
1639- createAccessorImplCallExpr (setterImpl, selfArg, keyParamRefExpr );
1637+ createAccessorImplCallExpr (setterImpl, selfArg, arguments );
16401638
16411639 VarDecl *pointeePropertyDecl =
16421640 ctx.getPointerPointeePropertyDecl (PTK_UnsafeMutablePointer);
@@ -1673,7 +1671,7 @@ synthesizeUnwrappingAddressSetterBody(AbstractFunctionDecl *afd,
16731671
16741672 auto selfArg = createSelfArg (setterDecl);
16751673 auto *setterImplCallExpr =
1676- createAccessorImplCallExpr (setterImpl, selfArg, nullptr );
1674+ createAccessorImplCallExpr (setterImpl, selfArg, {} );
16771675
16781676 auto *returnStmt = ReturnStmt::createImplicit (ctx, setterImplCallExpr);
16791677
@@ -1701,15 +1699,16 @@ SubscriptDecl *SwiftDeclSynthesizer::makeSubscript(FuncDecl *getter,
17011699
17021700 auto &ctx = ImporterImpl.SwiftContext ;
17031701
1704- assert (getterImpl->getParameters ()->size () == 1 &&
1705- " subscript can only have 1 parameter" );
1706- auto bodyParam = ParamDecl::clone (ctx, getterImpl->getParameters ()->get (0 ));
1707- // If the subscript parameter is unnamed, give it a name to make sure SILGen
1708- // creates a variable for it.
1709- if (bodyParam->getName ().empty ())
1710- bodyParam->setName (ctx.getIdentifier (" __index" ));
1711-
1712- auto bodyParams = ParameterList::create (ctx, bodyParam);
1702+ SmallVector<ParamDecl *> paramVec;
1703+ for (auto [i, param] : llvm::enumerate (*getterImpl->getParameters ())) {
1704+ auto clonedParam = ParamDecl::clone (ctx, param);
1705+ // If the subscript parameter is unnamed, give it a name to make sure SILGen
1706+ // creates a variable for it.
1707+ if (clonedParam->getName ().empty ())
1708+ clonedParam->setName (ctx.getIdentifier (" __index" + std::to_string (i)));
1709+ paramVec.push_back (clonedParam);
1710+ }
1711+ auto bodyParams = ParameterList::create (ctx, paramVec);
17131712 DeclName name (ctx, DeclBaseName::createSubscript (), bodyParams);
17141713 auto dc = getterImpl->getDeclContext ();
17151714
@@ -1744,8 +1743,11 @@ SubscriptDecl *SwiftDeclSynthesizer::makeSubscript(FuncDecl *getter,
17441743 paramVarDecl->setSpecifier (ParamSpecifier::Default);
17451744 paramVarDecl->setInterfaceType (elementTy);
17461745
1747- auto setterParamList =
1748- ParameterList::create (ctx, {paramVarDecl, bodyParams->get (0 )});
1746+ SmallVector<ParamDecl *> setterParams;
1747+ setterParams.push_back (paramVarDecl);
1748+ setterParams.append (bodyParams->begin (), bodyParams->end ());
1749+
1750+ auto setterParamList = ParameterList::create (ctx, setterParams);
17491751
17501752 setterDecl = AccessorDecl::create (
17511753 ctx, setterImpl->getLoc (), setterImpl->getLoc (), AccessorKind::Set,
@@ -1918,7 +1920,7 @@ synthesizeSuccessorFuncBody(AbstractFunctionDecl *afd, void *context) {
19181920
19191921 // Call `operator++`.
19201922 auto incrementExpr = createAccessorImplCallExpr (
1921- incrementImpl, Argument::implicitInOut (ctx, copyRefLValueExpr));
1923+ incrementImpl, Argument::implicitInOut (ctx, copyRefLValueExpr), {} );
19221924
19231925 auto copyRefRValueExpr = new (ctx) DeclRefExpr (copyDecl, DeclNameLoc (),
19241926 /* implicit*/ true );
@@ -2331,7 +2333,7 @@ synthesizeComputedGetterFromCXXMethod(AbstractFunctionDecl *afd,
23312333
23322334 auto selfArg = createSelfArg (accessor);
23332335
2334- auto *getterImplCallExpr = createAccessorImplCallExpr (method, selfArg);
2336+ auto *getterImplCallExpr = createAccessorImplCallExpr (method, selfArg, {} );
23352337 auto &ctx = method->getASTContext ();
23362338 auto *returnStmt = ReturnStmt::createImplicit (ctx, getterImplCallExpr);
23372339 auto *body = BraceStmt::create (ctx, SourceLoc (), {returnStmt}, SourceLoc ());
@@ -2349,7 +2351,7 @@ synthesizeComputedSetterFromCXXMethod(AbstractFunctionDecl *afd,
23492351 DeclRefExpr *valueParamRefExpr = createParamRefExpr (setterDecl, 0 );
23502352
23512353 auto *getterImplCallExpr =
2352- createAccessorImplCallExpr (setterImpl, selfArg, valueParamRefExpr);
2354+ createAccessorImplCallExpr (setterImpl, selfArg, { valueParamRefExpr} );
23532355
23542356 auto body = BraceStmt::create (setterImpl->getASTContext (), SourceLoc (),
23552357 {getterImplCallExpr}, SourceLoc ());
0 commit comments