@@ -4018,25 +4018,12 @@ TypeResolver::resolveASTFunctionTypeParams(TupleTypeRepr *inputRepr,
4018
4018
return elements;
4019
4019
}
4020
4020
4021
+ // / Implement the special @_opaqueReturnTypeOf attribute syntax in
4022
+ // / module interface files.
4021
4023
NeverNullType
4022
4024
TypeResolver::resolveOpaqueReturnType (TypeRepr *repr, StringRef mangledName,
4023
4025
unsigned ordinal,
4024
4026
TypeResolutionOptions options) {
4025
- // The type representation should be an unqualified identifier. We don't
4026
- // really use the identifier for anything, but we do resolve any generic
4027
- // arguments to instantiate the possibly-generic opaque type.
4028
- SmallVector<Type, 4 > TypeArgsBuf;
4029
- if (auto *unqualIdentRepr = dyn_cast<UnqualifiedIdentTypeRepr>(repr)) {
4030
- for (auto argRepr : unqualIdentRepr->getGenericArgs ()) {
4031
- auto argTy = resolveType (argRepr, options);
4032
- // If we cannot resolve the generic parameter, propagate the error out.
4033
- if (argTy->hasError ()) {
4034
- return ErrorType::get (getASTContext ());
4035
- }
4036
- TypeArgsBuf.push_back (argTy);
4037
- }
4038
- }
4039
-
4040
4027
// Use type reconstruction to summon the opaque type decl.
4041
4028
Demangler demangle;
4042
4029
auto definingDeclNode = demangle.demangleSymbol (mangledName);
@@ -4050,14 +4037,98 @@ TypeResolver::resolveOpaqueReturnType(TypeRepr *repr, StringRef mangledName,
4050
4037
auto opaqueNode =
4051
4038
builder.getNodeFactory ().createNode (Node::Kind::OpaqueReturnTypeOf);
4052
4039
opaqueNode->addChild (definingDeclNode, builder.getNodeFactory ());
4053
-
4054
- auto TypeArgs = ArrayRef<Type>(TypeArgsBuf);
4055
- auto ty = builder. resolveOpaqueType (opaqueNode, TypeArgs, ordinal );
4056
- if (!ty || ty-> hasError () ) {
4040
+ auto *opaqueDecl = builder. resolveOpaqueTypeDecl (opaqueNode);
4041
+
4042
+ auto *ownerDecl = opaqueDecl-> getNamingDecl ( );
4043
+ if (!ownerDecl ) {
4057
4044
diagnose (repr->getLoc (), diag::no_opaque_return_type_of);
4058
4045
return ErrorType::get (getASTContext ());
4059
4046
}
4060
- return ty;
4047
+
4048
+ auto genericSig = ownerDecl->getInnermostDeclContext ()
4049
+ ->getGenericSignatureOfContext ();
4050
+
4051
+ SubstitutionMap subs;
4052
+ if (genericSig) {
4053
+ SmallVector<Type, 2 > args;
4054
+
4055
+ // The type representation should either be a single identifier, or a
4056
+ // series of member references. We don't use the identifiers for
4057
+ // anything, but we do resolve the generic arguments at each level
4058
+ // to instantiate the possibly-generic opaque type.
4059
+ if (isa<UnqualifiedIdentTypeRepr>(repr) &&
4060
+ !genericSig->hasParameterPack ()) {
4061
+ // When there are no parameter packs and we just have a single
4062
+ // unqualified identifier, we fall back to the legacy behavior,
4063
+ // which collects the generic arguments for all levels of nesting
4064
+ // in a flat list.
4065
+ //
4066
+ // This matches the old behavior of the ASTPrinter.
4067
+ auto *unqualIdentRepr = cast<UnqualifiedIdentTypeRepr>(repr);
4068
+
4069
+ for (auto argRepr : unqualIdentRepr->getGenericArgs ()) {
4070
+ auto argTy = resolveType (argRepr, options);
4071
+ // If we cannot resolve the generic parameter, propagate the error out.
4072
+ if (argTy->hasError ()) {
4073
+ return ErrorType::get (getASTContext ());
4074
+ }
4075
+ args.push_back (argTy);
4076
+ }
4077
+
4078
+ if (args.size () != genericSig.getGenericParams ().size ()) {
4079
+ diagnose (repr->getLoc (), diag::no_opaque_return_type_of);
4080
+ return ErrorType::get (getASTContext ());
4081
+ }
4082
+ } else {
4083
+ // Correct handling of nested types. We interpret a qualified
4084
+ // TypeRepr with a generic argument list at each level, like
4085
+ // __<OuterArgs, ...>.__<InnerArgs, ...>.
4086
+ SmallVector<SmallVector<Type, 2 >, 2 > nestedArgs;
4087
+
4088
+ auto *dc = ownerDecl->getInnermostDeclContext ();
4089
+ while (!dc->isModuleScopeContext ()) {
4090
+ if (dc->isInnermostContextGeneric ()) {
4091
+ if (repr == nullptr || !isa<DeclRefTypeRepr>(repr)) {
4092
+ diagnose (repr->getLoc (), diag::no_opaque_return_type_of);
4093
+ return ErrorType::get (getASTContext ());
4094
+ }
4095
+
4096
+ auto *identRepr = cast<DeclRefTypeRepr>(repr);
4097
+ nestedArgs.emplace_back ();
4098
+
4099
+ auto *decl = dyn_cast<ValueDecl>(dc->getAsDecl ());
4100
+ if (decl == nullptr )
4101
+ decl = dc->getSelfNominalTypeDecl ();
4102
+ ASSERT (decl);
4103
+
4104
+ resolveGenericArguments (decl,
4105
+ decl->getAsGenericContext (),
4106
+ resolution,
4107
+ silContext,
4108
+ identRepr,
4109
+ nestedArgs.back ());
4110
+ repr = identRepr->getBase ();
4111
+ }
4112
+
4113
+ dc = dc->getParent ();
4114
+ }
4115
+
4116
+ for (auto &subArgs : llvm::reverse (nestedArgs)) {
4117
+ args.append (subArgs.begin (), subArgs.end ());
4118
+ }
4119
+ }
4120
+
4121
+ subs = SubstitutionMap::get (genericSig, args,
4122
+ LookUpConformanceInModule ());
4123
+ }
4124
+
4125
+ if (ordinal >= opaqueDecl->getOpaqueGenericParams ().size ()) {
4126
+ diagnose (repr->getLoc (), diag::no_opaque_return_type_of);
4127
+ return ErrorType::get (getASTContext ());
4128
+ }
4129
+
4130
+ Type interfaceType = opaqueDecl->getOpaqueGenericParams ()[ordinal];
4131
+ return OpaqueTypeArchetypeType::get (opaqueDecl, interfaceType, subs);
4061
4132
}
4062
4133
4063
4134
NeverNullType TypeResolver::resolveASTFunctionType (
0 commit comments