@@ -1223,10 +1223,19 @@ class swift::MemberLookupTable : public ASTAllocated<swift::MemberLookupTable> {
1223
1223
// / parent nominal type.
1224
1224
llvm::DenseSet<DeclBaseName> LazilyCompleteNames;
1225
1225
1226
- // / The set of names for which we have expanded relevant macros for in the
1227
- // / parent nominal type.
1228
- llvm::DenseSet<DeclName> LazilyCompleteNamesForMacroExpansion;
1229
-
1226
+ struct {
1227
+ // / Whether we have computed the `containersWithMacroExpansions`.
1228
+ bool ComputedContainersWithMacroExpansions = false ;
1229
+
1230
+ // / The nominal type and any extensions that have macro expansions, which
1231
+ // / is used to restrict the set of places one will lookup for a member
1232
+ // / produced by a macro expansion.
1233
+ llvm::SmallVector<TypeOrExtensionDecl, 2 > ContainersWithMacroExpansions;
1234
+
1235
+ // / The set of names for which we have expanded relevant macros for in the
1236
+ // / parent nominal type.
1237
+ llvm::DenseSet<DeclName> LazilyCompleteNames;
1238
+ } LazyMacroExpansionState;
1230
1239
public:
1231
1240
// / Create a new member lookup table.
1232
1241
explicit MemberLookupTable (ASTContext &ctx);
@@ -1255,6 +1264,32 @@ class swift::MemberLookupTable : public ASTAllocated<swift::MemberLookupTable> {
1255
1264
LazilyCompleteNames.clear ();
1256
1265
}
1257
1266
1267
+ // / Retrieve an array containing the set of containers for this type (
1268
+ // / i.e., the nominal type and any extensions) that can produce members via
1269
+ // / macro expansion.
1270
+ ArrayRef<TypeOrExtensionDecl> getContainersWithMacroExpansions (
1271
+ NominalTypeDecl *nominal) {
1272
+ if (LazyMacroExpansionState.ComputedContainersWithMacroExpansions )
1273
+ return LazyMacroExpansionState.ContainersWithMacroExpansions ;
1274
+
1275
+ Evaluator &evaluator = nominal->getASTContext ().evaluator ;
1276
+
1277
+ // Does the type have macro expansions?
1278
+ if (evaluateOrDefault (
1279
+ evaluator, PotentialMacroExpansionsInContextRequest{nominal}, {}))
1280
+ LazyMacroExpansionState.ContainersWithMacroExpansions .push_back (nominal);
1281
+
1282
+ // Check each extension for macro expansions.
1283
+ for (auto ext : nominal->getExtensions ()) {
1284
+ if (evaluateOrDefault (
1285
+ evaluator, PotentialMacroExpansionsInContextRequest{ext}, {}))
1286
+ LazyMacroExpansionState.ContainersWithMacroExpansions .push_back (ext);
1287
+ }
1288
+
1289
+ LazyMacroExpansionState.ComputedContainersWithMacroExpansions = true ;
1290
+ return LazyMacroExpansionState.ContainersWithMacroExpansions ;
1291
+ }
1292
+
1258
1293
// / Determine whether the given container has any macro-introduced names that
1259
1294
// / match the given declaration.
1260
1295
bool hasAnyMacroNamesMatching (TypeOrExtensionDecl container, DeclName name);
@@ -1266,16 +1301,16 @@ class swift::MemberLookupTable : public ASTAllocated<swift::MemberLookupTable> {
1266
1301
bool isBaseNameComplete = name.isCompoundName () &&
1267
1302
isLazilyCompleteForMacroExpansion (DeclName (name.getBaseName ()));
1268
1303
return isBaseNameComplete ||
1269
- LazilyCompleteNamesForMacroExpansion .contains (name);
1304
+ LazyMacroExpansionState. LazilyCompleteNames .contains (name);
1270
1305
}
1271
1306
1272
1307
void markLazilyCompleteForMacroExpansion (DeclName name) {
1273
1308
assert (!MacroDecl::isUniqueMacroName (name.getBaseName ()));
1274
- LazilyCompleteNamesForMacroExpansion .insert (name);
1309
+ LazyMacroExpansionState. LazilyCompleteNames .insert (name);
1275
1310
}
1276
1311
1277
1312
void clearLazilyCompleteForMacroExpansionCache () {
1278
- LazilyCompleteNamesForMacroExpansion .clear ();
1313
+ LazyMacroExpansionState. LazilyCompleteNames .clear ();
1279
1314
}
1280
1315
1281
1316
// / Iterator into the lookup table.
@@ -1895,11 +1930,9 @@ DirectLookupRequest::evaluate(Evaluator &evaluator,
1895
1930
DeclName macroExpansionKey = adjustLazyMacroExpansionNameKey (ctx, name);
1896
1931
if (!excludeMacroExpansions &&
1897
1932
!Table.isLazilyCompleteForMacroExpansion (macroExpansionKey)) {
1898
- populateLookupTableEntryFromMacroExpansions (
1899
- ctx, Table, macroExpansionKey, decl);
1900
- for (auto ext : decl->getExtensions ()) {
1933
+ for (auto container : Table.getContainersWithMacroExpansions (decl)) {
1901
1934
populateLookupTableEntryFromMacroExpansions (
1902
- ctx, Table, macroExpansionKey, ext );
1935
+ ctx, Table, macroExpansionKey, container );
1903
1936
}
1904
1937
Table.markLazilyCompleteForMacroExpansion (macroExpansionKey);
1905
1938
}
0 commit comments