@@ -332,24 +332,15 @@ Type ASTBuilder::createTypeAliasType(GenericTypeDecl *decl, Type parent) {
332332
333333static SubstitutionMap
334334createSubstitutionMapFromGenericArgs (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
355346Type 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
422417Type 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
0 commit comments