17
17
18
18
#include " swift/AST/ASTContext.h"
19
19
#include " swift/AST/Decl.h"
20
+ #include " swift/AST/GenericParamList.h"
20
21
#include " swift/AST/ParameterList.h"
21
22
#include " swift/AST/Type.h"
22
23
#include " swift/AST/Types.h"
@@ -348,3 +349,53 @@ unsigned ParameterList::getOrigParamIndex(SubstitutionMap subMap,
348
349
dump (llvm::errs ());
349
350
abort ();
350
351
}
352
+
353
+ // / <T...> Foo<T, Pack{Int, String}> => Pack{T..., Int, String}
354
+ PackType *BoundGenericType::getExpandedGenericArgsPack () {
355
+ // It would be nicer to use genericSig.getInnermostGenericParams() here,
356
+ // but that triggers a request cycle if we're in the middle of computing
357
+ // the generic signature already.
358
+ SmallVector<Type, 2 > params;
359
+ for (auto *paramDecl : getDecl ()->getGenericParams ()->getParams ()) {
360
+ params.push_back (paramDecl->getDeclaredInterfaceType ());
361
+ }
362
+
363
+ return PackType::get (getASTContext (),
364
+ TypeArrayView<GenericTypeParamType>(params),
365
+ getGenericArgs ());
366
+ }
367
+
368
+ // / <T...> Foo<T, Pack{Int, String}> => Pack{T..., Int, String}
369
+ PackType *TypeAliasType::getExpandedGenericArgsPack () {
370
+ auto genericSig = getGenericSignature ();
371
+ return PackType::get (getASTContext (),
372
+ genericSig.getInnermostGenericParams (),
373
+ getDirectGenericArgs ());
374
+ }
375
+
376
+ // / <T...> Pack{T, Pack{Int, String}} => Pack{T..., Int, String}
377
+ PackType *PackType::get (const ASTContext &C,
378
+ TypeArrayView<GenericTypeParamType> params,
379
+ ArrayRef<Type> args) {
380
+ SmallVector<Type, 2 > wrappedArgs;
381
+
382
+ assert (params.size () == args.size ());
383
+ for (unsigned i = 0 , e = params.size (); i < e; ++i) {
384
+ auto arg = args[i];
385
+
386
+ if (params[i]->isParameterPack ()) {
387
+ assert (arg->is <PackType>() ||
388
+ arg->is <PackArchetypeType>() ||
389
+ arg->is <TypeVariableType>() ||
390
+ arg->isParameterPack ());
391
+
392
+ wrappedArgs.push_back (PackExpansionType::get (
393
+ arg, arg->getReducedShape ()));
394
+ continue ;
395
+ }
396
+
397
+ wrappedArgs.push_back (arg);
398
+ }
399
+
400
+ return get (C, wrappedArgs)->flattenPackTypes ();
401
+ }
0 commit comments