@@ -332,24 +332,15 @@ Type ASTBuilder::createTypeAliasType(GenericTypeDecl *decl, Type parent) {
332
332
333
333
static SubstitutionMap
334
334
createSubstitutionMapFromGenericArgs (GenericSignature genericSig,
335
- ArrayRef<Type> args,
336
- LookupConformanceFn lookupConformance) {
335
+ ArrayRef<Type> args) {
337
336
if (!genericSig)
338
337
return SubstitutionMap ();
339
338
340
339
if (genericSig.getGenericParams ().size () != args.size ())
341
340
return SubstitutionMap ();
342
341
343
342
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 ());
353
344
}
354
345
355
346
Type ASTBuilder::createBoundGenericType (GenericTypeDecl *decl,
@@ -364,8 +355,7 @@ Type ASTBuilder::createBoundGenericType(GenericTypeDecl *decl,
364
355
365
356
// Build a SubstitutionMap.
366
357
auto genericSig = nominalDecl->getGenericSignature ();
367
- auto subs = createSubstitutionMapFromGenericArgs (
368
- genericSig, args, LookUpConformanceInModule ());
358
+ auto subs = createSubstitutionMapFromGenericArgs (genericSig, args);
369
359
if (!subs)
370
360
return Type ();
371
361
auto origType = nominalDecl->getDeclaredInterfaceType ();
@@ -375,48 +365,53 @@ Type ASTBuilder::createBoundGenericType(GenericTypeDecl *decl,
375
365
return origType.subst (subs);
376
366
}
377
367
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 ;
389
371
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 ();
393
379
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 ;
398
383
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 ;
403
388
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 ();
410
402
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 ());
416
406
}
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);
420
415
}
421
416
422
417
Type ASTBuilder::createBoundGenericType (GenericTypeDecl *decl,
@@ -1143,8 +1138,7 @@ Type ASTBuilder::createSILBoxTypeWithLayout(
1143
1138
SubstitutionMap substs;
1144
1139
if (signature)
1145
1140
substs = createSubstitutionMapFromGenericArgs (
1146
- signature, replacements,
1147
- LookUpConformanceInModule ());
1141
+ signature, replacements);
1148
1142
return SILBoxType::get (Ctx, layout, substs);
1149
1143
}
1150
1144
0 commit comments