@@ -1252,78 +1252,74 @@ void CodeCompletionCallbacksImpl::completeExpr() {
1252
1252
deliverCompletionResults ();
1253
1253
}
1254
1254
1255
- namespace {
1256
- class ArchetypeTransformer {
1257
- DeclContext *DC;
1258
- Type BaseTy;
1259
- llvm::DenseMap<TypeBase *, Type> Cache;
1260
- TypeSubstitutionMap Map;
1261
-
1262
- public:
1263
- ArchetypeTransformer (DeclContext *DC, Type Ty) : DC(DC), BaseTy(Ty->getRValueType ()){
1264
- auto D = BaseTy->getNominalOrBoundGenericNominal ();
1265
- if (!D)
1266
- return ;
1267
- SmallVector<Type, 3 > Scrach;
1268
- auto Params = D->getGenericParamTypes ();
1269
- auto Args = BaseTy->getAllGenericArgs (Scrach);
1270
- assert (Params.size () == Args.size ());
1271
- for (unsigned I = 0 , N = Params.size (); I < N; I ++) {
1272
- Map[Params[I]->getCanonicalType ()->castTo <GenericTypeParamType>()] = Args[I];
1273
- }
1255
+ ArchetypeTransformer::ArchetypeTransformer (DeclContext *DC, Type Ty) :
1256
+ DC(DC), BaseTy(Ty->getRValueType ()){
1257
+ auto D = BaseTy->getNominalOrBoundGenericNominal ();
1258
+ if (!D)
1259
+ return ;
1260
+ SmallVector<Type, 3 > Scrach;
1261
+ auto Params = D->getGenericParamTypes ();
1262
+ auto Args = BaseTy->getAllGenericArgs (Scrach);
1263
+ assert (Params.size () == Args.size ());
1264
+ for (unsigned I = 0 , N = Params.size (); I < N; I ++) {
1265
+ Map[Params[I]->getCanonicalType ()->castTo <GenericTypeParamType>()] = Args[I];
1274
1266
}
1267
+ }
1275
1268
1276
- std::function<Type(Type)> getTransformerFunc () {
1277
- return [&](Type Ty) {
1278
- if (Ty->getKind () != TypeKind::Archetype)
1279
- return Ty;
1280
- if (Cache.count (Ty.getPointer ()) > 0 ) {
1281
- return Cache[Ty.getPointer ()];
1282
- }
1283
- Type Result = Ty;
1284
- auto *RootArc = cast<ArchetypeType>(Result.getPointer ());
1285
- llvm::SmallVector<Identifier, 1 > Names;
1286
- bool SelfDerived = false ;
1287
- for (auto *AT = RootArc; AT; AT = AT->getParent ()) {
1288
- if (!AT->getSelfProtocol ())
1289
- Names.insert (Names.begin (), AT->getName ());
1290
- else
1291
- SelfDerived = true ;
1292
- }
1293
- if (SelfDerived) {
1294
- if (auto MT = checkMemberType (*DC, BaseTy, Names)) {
1295
- if (auto NAT = dyn_cast<NameAliasType>(MT.getPointer ())) {
1296
- Result = NAT->getSinglyDesugaredType ();
1297
- } else {
1298
- Result = MT;
1299
- }
1269
+ llvm::function_ref<Type(Type)> ArchetypeTransformer::getTransformerFunc() {
1270
+ if (TheFunc)
1271
+ return TheFunc;
1272
+ TheFunc = [&](Type Ty) {
1273
+ if (Ty->getKind () != TypeKind::Archetype)
1274
+ return Ty;
1275
+ if (Cache.count (Ty.getPointer ()) > 0 ) {
1276
+ return Cache[Ty.getPointer ()];
1277
+ }
1278
+ Type Result = Ty;
1279
+ auto *RootArc = cast<ArchetypeType>(Result.getPointer ());
1280
+ llvm::SmallVector<Identifier, 1 > Names;
1281
+ bool SelfDerived = false ;
1282
+ for (auto *AT = RootArc; AT; AT = AT->getParent ()) {
1283
+ if (!AT->getSelfProtocol ())
1284
+ Names.insert (Names.begin (), AT->getName ());
1285
+ else
1286
+ SelfDerived = true ;
1287
+ }
1288
+ if (SelfDerived) {
1289
+ if (auto MT = checkMemberType (*DC, BaseTy, Names)) {
1290
+ if (auto NAT = dyn_cast<NameAliasType>(MT.getPointer ())) {
1291
+ Result = NAT->getSinglyDesugaredType ();
1292
+ } else {
1293
+ Result = MT;
1300
1294
}
1301
- } else {
1302
- Result = Ty.subst (DC->getParentModule (), Map, SubstFlags::IgnoreMissing);
1303
1295
}
1304
-
1305
- auto ATT = dyn_cast<ArchetypeType>(Result. getPointer () );
1306
- if (ATT && !ATT-> getParent ()) {
1307
- auto Conformances = ATT-> getConformsTo ();
1308
- if (Conformances. size () == 1 ) {
1309
- Result = Conformances[ 0 ]-> getDeclaredType ();
1310
- } else if (!Conformances. empty ()) {
1311
- llvm::SmallVector<Type, 3 > ConformedTypes;
1312
- for ( auto PD : Conformances) {
1313
- ConformedTypes. push_back (PD-> getDeclaredType ());
1314
- }
1315
- Result = ProtocolCompositionType::get (DC-> getASTContext (),
1316
- ConformedTypes);
1296
+ } else {
1297
+ Result = Ty. subst (DC-> getParentModule (), Map, SubstFlags::IgnoreMissing );
1298
+ }
1299
+
1300
+ auto ATT = dyn_cast<ArchetypeType>(Result. getPointer ());
1301
+ if (ATT && !ATT-> getParent ()) {
1302
+ auto Conformances = ATT-> getConformsTo ();
1303
+ if (Conformances. size () == 1 ) {
1304
+ Result = Conformances[ 0 ]-> getDeclaredType ();
1305
+ } else if (!Conformances. empty ()) {
1306
+ llvm::SmallVector<Type, 3 > ConformedTypes;
1307
+ for ( auto PD : Conformances) {
1308
+ ConformedTypes. push_back (PD-> getDeclaredType () );
1317
1309
}
1310
+ Result = ProtocolCompositionType::get (DC->getASTContext (),
1311
+ ConformedTypes);
1318
1312
}
1319
- if (Result->getKind () != TypeKind::Archetype)
1320
- Result = Result.transform (getTransformerFunc ());
1321
- Cache[Ty.getPointer ()] = Result;
1322
- return Result;
1323
- };
1324
- }
1325
- };
1313
+ }
1314
+ if (Result->getKind () != TypeKind::Archetype)
1315
+ Result = Result.transform (getTransformerFunc ());
1316
+ Cache[Ty.getPointer ()] = Result;
1317
+ return Result;
1318
+ };
1319
+ return TheFunc;
1320
+ }
1326
1321
1322
+ namespace {
1327
1323
static bool isTopLevelContext (const DeclContext *DC) {
1328
1324
for (; DC && DC->isLocalContext (); DC = DC->getParent ()) {
1329
1325
switch (DC->getContextKind ()) {
0 commit comments