Skip to content

Commit 6bf5213

Browse files
authored
Merge pull request #84251 from slavapestov/fix-rdar151171381
Fix @_opaqueReturnTypeOf module interface syntax for parameter packs
2 parents 8e460d1 + 10fa09c commit 6bf5213

File tree

7 files changed

+418
-181
lines changed

7 files changed

+418
-181
lines changed

include/swift/AST/ASTDemangler.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,8 @@ class ASTBuilder {
158158

159159
Type createBoundGenericType(GenericTypeDecl *decl, ArrayRef<Type> args);
160160

161+
OpaqueTypeDecl *resolveOpaqueTypeDecl(NodePointer opaqueDescriptor);
162+
161163
Type resolveOpaqueType(NodePointer opaqueDescriptor,
162164
ArrayRef<ArrayRef<Type>> args,
163165
unsigned ordinal);

lib/AST/ASTDemangler.cpp

Lines changed: 45 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -332,24 +332,15 @@ Type ASTBuilder::createTypeAliasType(GenericTypeDecl *decl, Type parent) {
332332

333333
static SubstitutionMap
334334
createSubstitutionMapFromGenericArgs(GenericSignature genericSig,
335-
ArrayRef<Type> args,
336-
LookupConformanceFn lookupConformance) {
335+
ArrayRef<Type> args) {
337336
if (!genericSig)
338337
return SubstitutionMap();
339338

340339
if (genericSig.getGenericParams().size() != args.size())
341340
return SubstitutionMap();
342341

343342
return SubstitutionMap::get(
344-
genericSig,
345-
[&](SubstitutableType *t) -> Type {
346-
auto *gp = cast<GenericTypeParamType>(t);
347-
unsigned ordinal = genericSig->getGenericParamOrdinal(gp);
348-
if (ordinal < args.size())
349-
return args[ordinal];
350-
return Type();
351-
},
352-
lookupConformance);
343+
genericSig, args, LookUpConformanceInModule());
353344
}
354345

355346
Type ASTBuilder::createBoundGenericType(GenericTypeDecl *decl,
@@ -364,8 +355,7 @@ Type ASTBuilder::createBoundGenericType(GenericTypeDecl *decl,
364355

365356
// Build a SubstitutionMap.
366357
auto genericSig = nominalDecl->getGenericSignature();
367-
auto subs = createSubstitutionMapFromGenericArgs(
368-
genericSig, args, LookUpConformanceInModule());
358+
auto subs = createSubstitutionMapFromGenericArgs(genericSig, args);
369359
if (!subs)
370360
return Type();
371361
auto origType = nominalDecl->getDeclaredInterfaceType();
@@ -375,48 +365,53 @@ Type ASTBuilder::createBoundGenericType(GenericTypeDecl *decl,
375365
return origType.subst(subs);
376366
}
377367

378-
Type ASTBuilder::resolveOpaqueType(NodePointer opaqueDescriptor,
379-
ArrayRef<ArrayRef<Type>> args,
380-
unsigned ordinal) {
381-
if (opaqueDescriptor->getKind() == Node::Kind::OpaqueReturnTypeOf) {
382-
auto definingDecl = opaqueDescriptor->getChild(0);
383-
auto definingGlobal = Factory.createNode(Node::Kind::Global);
384-
definingGlobal->addChild(definingDecl, Factory);
385-
auto mangling = mangleNode(definingGlobal, ManglingFlavor);
386-
if (!mangling.isSuccess())
387-
return Type();
388-
auto mangledName = mangling.result();
368+
OpaqueTypeDecl *ASTBuilder::resolveOpaqueTypeDecl(NodePointer opaqueDescriptor) {
369+
if (opaqueDescriptor->getKind() != Node::Kind::OpaqueReturnTypeOf)
370+
return nullptr;
389371

390-
auto moduleNode = findModuleNode(definingDecl);
391-
if (!moduleNode)
392-
return Type();
372+
auto definingDecl = opaqueDescriptor->getChild(0);
373+
auto definingGlobal = Factory.createNode(Node::Kind::Global);
374+
definingGlobal->addChild(definingDecl, Factory);
375+
auto mangling = mangleNode(definingGlobal, ManglingFlavor);
376+
if (!mangling.isSuccess())
377+
return nullptr;
378+
auto mangledName = mangling.result();
393379

394-
ModuleDecl *scratch;
395-
auto potentialParentModules = findPotentialModules(moduleNode, scratch);
396-
if (potentialParentModules.empty())
397-
return Type();
380+
auto moduleNode = findModuleNode(definingDecl);
381+
if (!moduleNode)
382+
return nullptr;
398383

399-
OpaqueTypeDecl *opaqueDecl = nullptr;
400-
for (auto module : potentialParentModules)
401-
if (auto decl = module->lookupOpaqueResultType(mangledName))
402-
opaqueDecl = decl;
384+
ModuleDecl *scratch;
385+
auto potentialParentModules = findPotentialModules(moduleNode, scratch);
386+
if (potentialParentModules.empty())
387+
return nullptr;
403388

404-
if (!opaqueDecl)
405-
return Type();
406-
SmallVector<Type, 8> allArgs;
407-
for (auto argSet : args) {
408-
allArgs.append(argSet.begin(), argSet.end());
409-
}
389+
for (auto module : potentialParentModules)
390+
if (auto decl = module->lookupOpaqueResultType(mangledName))
391+
return decl;
392+
393+
return nullptr;
394+
}
395+
396+
Type ASTBuilder::resolveOpaqueType(NodePointer opaqueDescriptor,
397+
ArrayRef<ArrayRef<Type>> args,
398+
unsigned ordinal) {
399+
OpaqueTypeDecl *opaqueDecl = resolveOpaqueTypeDecl(opaqueDescriptor);
400+
if (!opaqueDecl)
401+
return Type();
410402

411-
SubstitutionMap subs = createSubstitutionMapFromGenericArgs(
412-
opaqueDecl->getGenericSignature(), allArgs,
413-
LookUpConformanceInModule());
414-
Type interfaceType = opaqueDecl->getOpaqueGenericParams()[ordinal];
415-
return OpaqueTypeArchetypeType::get(opaqueDecl, interfaceType, subs);
403+
SmallVector<Type, 8> allArgs;
404+
for (auto argSet : args) {
405+
allArgs.append(argSet.begin(), argSet.end());
416406
}
417-
418-
// TODO: named opaque types
419-
return Type();
407+
408+
if (ordinal >= opaqueDecl->getOpaqueGenericParams().size())
409+
return Type();
410+
411+
SubstitutionMap subs = createSubstitutionMapFromGenericArgs(
412+
opaqueDecl->getGenericSignature(), allArgs);
413+
Type interfaceType = opaqueDecl->getOpaqueGenericParams()[ordinal];
414+
return OpaqueTypeArchetypeType::get(opaqueDecl, interfaceType, subs);
420415
}
421416

422417
Type ASTBuilder::createBoundGenericType(GenericTypeDecl *decl,
@@ -1143,8 +1138,7 @@ Type ASTBuilder::createSILBoxTypeWithLayout(
11431138
SubstitutionMap substs;
11441139
if (signature)
11451140
substs = createSubstitutionMapFromGenericArgs(
1146-
signature, replacements,
1147-
LookUpConformanceInModule());
1141+
signature, replacements);
11481142
return SILBoxType::get(Ctx, layout, substs);
11491143
}
11501144

lib/AST/ASTPrinter.cpp

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7528,10 +7528,37 @@ class TypePrinter : public TypeVisitor<TypePrinter, void, NonRecursivePrintOptio
75287528
Printer << ") __";
75297529

75307530
if (genericSig) {
7531-
printGenericArgs(decl->getASTContext(),
7532-
genericSig.getGenericParams(),
7533-
T->getSubstitutions().getReplacementTypes());
7531+
auto &ctx = decl->getASTContext();
7532+
auto params = genericSig.getGenericParams();
7533+
auto args = T->getSubstitutions().getReplacementTypes();
7534+
7535+
// Use the new "nested" syntax if there is at least one parameter pack,
7536+
// because that case didn't round trip at all before anyway. Otherwise,
7537+
// use the old "flat" syntax, even when the owner declaration is in a
7538+
// nested generic context, because we want the generated swiftinterface
7539+
// to continue to work on old compilers.
7540+
if (genericSig->hasParameterPack()) {
7541+
bool first = true;
7542+
7543+
while (!params.empty()) {
7544+
if (!first) { Printer << ".__"; }
7545+
first = false;
7546+
7547+
unsigned end = 1;
7548+
unsigned depth = params.front()->getDepth();
7549+
while (end < params.size() && params[end]->getDepth() == depth) {
7550+
++end;
7551+
}
7552+
7553+
printGenericArgs(ctx, params.take_front(end), args.take_front(end));
7554+
params = params.slice(end);
7555+
args = args.slice(end);
7556+
}
7557+
} else {
7558+
printGenericArgs(ctx, params, args);
7559+
}
75347560
}
7561+
75357562
return;
75367563
}
75377564
case PrintOptions::OpaqueReturnTypePrintingMode::Description: {

lib/IRGen/GenMeta.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -581,8 +581,7 @@ namespace {
581581
void addGenericParameters() {
582582
GenericSignature sig = asImpl().getGenericSignature();
583583
auto metadata =
584-
irgen::addGenericParameters(IGM, B,
585-
asImpl().getGenericSignature(),
584+
irgen::addGenericParameters(IGM, B, sig,
586585
/*implicit=*/false);
587586
assert(metadata.NumParams == metadata.NumParamsEmitted &&
588587
"We can't use implicit GenericParamDescriptors here");

0 commit comments

Comments
 (0)