@@ -1071,12 +1071,19 @@ directReferencesForTypeRepr(Evaluator &evaluator, ASTContext &ctx,
1071
1071
// / the given type.
1072
1072
static DirectlyReferencedTypeDecls directReferencesForType (Type type);
1073
1073
1074
+ enum class ResolveToNominalFlags : uint8_t {
1075
+ AllowTupleType = 0x1
1076
+ };
1077
+
1078
+ using ResolveToNominalOptions = OptionSet<ResolveToNominalFlags>;
1079
+
1074
1080
// / Given a set of type declarations, find all of the nominal type declarations
1075
1081
// / that they reference, looking through typealiases as appropriate.
1076
1082
static TinyPtrVector<NominalTypeDecl *>
1077
1083
resolveTypeDeclsToNominal (Evaluator &evaluator,
1078
1084
ASTContext &ctx,
1079
1085
ArrayRef<TypeDecl *> typeDecls,
1086
+ ResolveToNominalOptions options,
1080
1087
SmallVectorImpl<ModuleDecl *> &modulesFound,
1081
1088
bool &anyObject);
1082
1089
@@ -1130,6 +1137,7 @@ SelfBounds SelfBoundsFromWhereClauseRequest::evaluate(
1130
1137
1131
1138
SmallVector<ModuleDecl *, 2 > modulesFound;
1132
1139
auto rhsNominals = resolveTypeDeclsToNominal (evaluator, ctx, rhsDecls,
1140
+ ResolveToNominalOptions (),
1133
1141
modulesFound,
1134
1142
result.anyObject );
1135
1143
result.decls .insert (result.decls .end (),
@@ -1168,7 +1176,8 @@ SelfBounds SelfBoundsFromGenericSignatureRequest::evaluate(
1168
1176
auto rhsDecls = directReferencesForType (req.getSecondType ());
1169
1177
SmallVector<ModuleDecl *, 2 > modulesFound;
1170
1178
auto rhsNominals = resolveTypeDeclsToNominal (
1171
- evaluator, ctx, rhsDecls, modulesFound, result.anyObject );
1179
+ evaluator, ctx, rhsDecls, ResolveToNominalOptions (),
1180
+ modulesFound, result.anyObject );
1172
1181
result.decls .insert (result.decls .end (), rhsNominals.begin (),
1173
1182
rhsNominals.end ());
1174
1183
}
@@ -2651,6 +2660,7 @@ static TinyPtrVector<NominalTypeDecl *>
2651
2660
resolveTypeDeclsToNominal (Evaluator &evaluator,
2652
2661
ASTContext &ctx,
2653
2662
ArrayRef<TypeDecl *> typeDecls,
2663
+ ResolveToNominalOptions options,
2654
2664
SmallVectorImpl<ModuleDecl *> &modulesFound,
2655
2665
bool &anyObject,
2656
2666
llvm::SmallPtrSetImpl<TypeAliasDecl *> &typealiases) {
@@ -2664,6 +2674,14 @@ resolveTypeDeclsToNominal(Evaluator &evaluator,
2664
2674
for (auto typeDecl : typeDecls) {
2665
2675
// Nominal type declarations get copied directly.
2666
2676
if (auto nominalDecl = dyn_cast<NominalTypeDecl>(typeDecl)) {
2677
+ // ... unless it's the special Builtin.TheTupleType that we return
2678
+ // when resolving a TupleTypeRepr, and the caller isn't asking for
2679
+ // that.
2680
+ if (!options.contains (ResolveToNominalFlags::AllowTupleType) &&
2681
+ isa<BuiltinTupleDecl>(nominalDecl)) {
2682
+ continue ;
2683
+ }
2684
+
2667
2685
addNominalDecl (nominalDecl);
2668
2686
continue ;
2669
2687
}
@@ -2680,7 +2698,7 @@ resolveTypeDeclsToNominal(Evaluator &evaluator,
2680
2698
2681
2699
auto underlyingNominalReferences
2682
2700
= resolveTypeDeclsToNominal (evaluator, ctx, underlyingTypeReferences,
2683
- modulesFound, anyObject, typealiases);
2701
+ options, modulesFound, anyObject, typealiases);
2684
2702
std::for_each (underlyingNominalReferences.begin (),
2685
2703
underlyingNominalReferences.end (),
2686
2704
addNominalDecl);
@@ -2731,11 +2749,12 @@ static TinyPtrVector<NominalTypeDecl *>
2731
2749
resolveTypeDeclsToNominal (Evaluator &evaluator,
2732
2750
ASTContext &ctx,
2733
2751
ArrayRef<TypeDecl *> typeDecls,
2752
+ ResolveToNominalOptions options,
2734
2753
SmallVectorImpl<ModuleDecl *> &modulesFound,
2735
2754
bool &anyObject) {
2736
2755
llvm::SmallPtrSet<TypeAliasDecl *, 4 > typealiases;
2737
- return resolveTypeDeclsToNominal (evaluator, ctx, typeDecls, modulesFound ,
2738
- anyObject, typealiases);
2756
+ return resolveTypeDeclsToNominal (evaluator, ctx, typeDecls, options ,
2757
+ modulesFound, anyObject, typealiases);
2739
2758
}
2740
2759
2741
2760
// / Perform unqualified name lookup for types at the given location.
@@ -2839,8 +2858,9 @@ directReferencesForQualifiedTypeLookup(Evaluator &evaluator,
2839
2858
SmallVector<ModuleDecl *, 2 > moduleDecls;
2840
2859
bool anyObject = false ;
2841
2860
auto nominalTypeDecls =
2842
- resolveTypeDeclsToNominal (ctx.evaluator , ctx, baseTypes, moduleDecls,
2843
- anyObject);
2861
+ resolveTypeDeclsToNominal (ctx.evaluator , ctx, baseTypes,
2862
+ ResolveToNominalOptions (),
2863
+ moduleDecls, anyObject);
2844
2864
2845
2865
dc->lookupQualified (nominalTypeDecls, name, loc, options, members);
2846
2866
@@ -2956,6 +2976,8 @@ directReferencesForTypeRepr(Evaluator &evaluator,
2956
2976
return directReferencesForTypeRepr (evaluator, ctx,
2957
2977
tupleRepr->getElementType (0 ), dc,
2958
2978
allowUsableFromInline);
2979
+ } else {
2980
+ return { 1 , ctx.getBuiltinTupleDecl () };
2959
2981
}
2960
2982
return { };
2961
2983
}
@@ -3019,6 +3041,9 @@ static DirectlyReferencedTypeDecls directReferencesForType(Type type) {
3019
3041
if (auto genericDecl = type->getAnyGeneric ())
3020
3042
return { 1 , genericDecl };
3021
3043
3044
+ if (dyn_cast<TupleType>(type.getPointer ()))
3045
+ return { 1 , type->getASTContext ().getBuiltinTupleDecl () };
3046
+
3022
3047
if (type->isExistentialType ()) {
3023
3048
DirectlyReferencedTypeDecls result;
3024
3049
const auto &layout = type->getExistentialLayout ();
@@ -3122,7 +3147,8 @@ SuperclassDeclRequest::evaluate(Evaluator &evaluator,
3122
3147
bool anyObject = false ;
3123
3148
auto inheritedNominalTypes
3124
3149
= resolveTypeDeclsToNominal (evaluator, Ctx,
3125
- inheritedTypes, modulesFound, anyObject);
3150
+ inheritedTypes, ResolveToNominalOptions (),
3151
+ modulesFound, anyObject);
3126
3152
3127
3153
// Look for a class declaration.
3128
3154
ClassDecl *superclass = nullptr ;
@@ -3191,9 +3217,10 @@ NominalTypeDecl *
3191
3217
ExtendedNominalRequest::evaluate (Evaluator &evaluator,
3192
3218
ExtensionDecl *ext) const {
3193
3219
auto typeRepr = ext->getExtendedTypeRepr ();
3194
- if (!typeRepr)
3220
+ if (!typeRepr) {
3195
3221
// We must've seen 'extension { ... }' during parsing.
3196
3222
return nullptr ;
3223
+ }
3197
3224
3198
3225
ASTContext &ctx = ext->getASTContext ();
3199
3226
DirectlyReferencedTypeDecls referenced =
@@ -3204,8 +3231,9 @@ ExtendedNominalRequest::evaluate(Evaluator &evaluator,
3204
3231
SmallVector<ModuleDecl *, 2 > modulesFound;
3205
3232
bool anyObject = false ;
3206
3233
auto nominalTypes
3207
- = resolveTypeDeclsToNominal (evaluator, ctx, referenced, modulesFound,
3208
- anyObject);
3234
+ = resolveTypeDeclsToNominal (evaluator, ctx, referenced,
3235
+ ResolveToNominalFlags::AllowTupleType,
3236
+ modulesFound, anyObject);
3209
3237
3210
3238
// If there is more than 1 element, we will emit a warning or an error
3211
3239
// elsewhere, so don't handle that case here.
@@ -3518,6 +3546,7 @@ CustomAttrNominalRequest::evaluate(Evaluator &evaluator,
3518
3546
SmallVector<ModuleDecl *, 2 > modulesFound;
3519
3547
bool anyObject = false ;
3520
3548
auto nominals = resolveTypeDeclsToNominal (evaluator, ctx, decls,
3549
+ ResolveToNominalOptions (),
3521
3550
modulesFound, anyObject);
3522
3551
if (nominals.size () == 1 && !isa<ProtocolDecl>(nominals.front ()))
3523
3552
return nominals.front ();
@@ -3535,6 +3564,7 @@ CustomAttrNominalRequest::evaluate(Evaluator &evaluator,
3535
3564
identTypeRepr->getNameRef (), identTypeRepr->getLoc (), dc,
3536
3565
LookupOuterResults::Included);
3537
3566
nominals = resolveTypeDeclsToNominal (evaluator, ctx, decls,
3567
+ ResolveToNominalOptions (),
3538
3568
modulesFound, anyObject);
3539
3569
if (nominals.size () == 1 && !isa<ProtocolDecl>(nominals.front ())) {
3540
3570
auto nominal = nominals.front ();
@@ -3584,8 +3614,9 @@ void swift::getDirectlyInheritedNominalTypeDecls(
3584
3614
// Resolve those type declarations to nominal type declarations.
3585
3615
SmallVector<ModuleDecl *, 2 > modulesFound;
3586
3616
auto nominalTypes
3587
- = resolveTypeDeclsToNominal (ctx.evaluator , ctx, referenced, modulesFound,
3588
- anyObject);
3617
+ = resolveTypeDeclsToNominal (ctx.evaluator , ctx, referenced,
3618
+ ResolveToNominalOptions (),
3619
+ modulesFound, anyObject);
3589
3620
3590
3621
// Dig out the source location
3591
3622
// FIXME: This is a hack. We need cooperation from
@@ -3772,8 +3803,9 @@ ProtocolDecl *ImplementsAttrProtocolRequest::evaluate(
3772
3803
SmallVector<ModuleDecl *, 2 > modulesFound;
3773
3804
bool anyObject = false ;
3774
3805
auto nominalTypes
3775
- = resolveTypeDeclsToNominal (evaluator, ctx, referenced, modulesFound,
3776
- anyObject);
3806
+ = resolveTypeDeclsToNominal (evaluator, ctx, referenced,
3807
+ ResolveToNominalOptions (),
3808
+ modulesFound, anyObject);
3777
3809
3778
3810
if (nominalTypes.empty ())
3779
3811
return nullptr ;
0 commit comments