@@ -1030,6 +1030,8 @@ class CursorRangeInfoConsumer : public SwiftASTConsumer {
1030
1030
const bool TryExistingAST;
1031
1031
SmallVector<ImmutableTextSnapshotRef, 4 > PreviousASTSnaps;
1032
1032
1033
+ protected:
1034
+ bool CancelOnSubsequentRequest;
1033
1035
protected:
1034
1036
ArrayRef<ImmutableTextSnapshotRef> getPreviousASTSnaps () {
1035
1037
return llvm::makeArrayRef (PreviousASTSnaps);
@@ -1038,9 +1040,10 @@ class CursorRangeInfoConsumer : public SwiftASTConsumer {
1038
1040
public:
1039
1041
CursorRangeInfoConsumer (StringRef InputFile, unsigned Offset, unsigned Length,
1040
1042
SwiftLangSupport &Lang, SwiftInvocationRef ASTInvok,
1041
- bool TryExistingAST)
1043
+ bool TryExistingAST, bool CancelOnSubsequentRequest )
1042
1044
: Lang(Lang), ASTInvok(ASTInvok),InputFile(InputFile), Offset(Offset),
1043
- Length (Length), TryExistingAST(TryExistingAST) { }
1045
+ Length (Length), TryExistingAST(TryExistingAST),
1046
+ CancelOnSubsequentRequest(CancelOnSubsequentRequest) {}
1044
1047
1045
1048
bool canUseASTWithSnapshots (ArrayRef<ImmutableTextSnapshotRef> Snapshots) override {
1046
1049
if (!TryExistingAST) {
@@ -1101,6 +1104,7 @@ static void resolveCursor(SwiftLangSupport &Lang,
1101
1104
unsigned Length, bool Actionables,
1102
1105
SwiftInvocationRef Invok,
1103
1106
bool TryExistingAST,
1107
+ bool CancelOnSubsequentRequest,
1104
1108
std::function<void (const CursorInfo &)> Receiver) {
1105
1109
assert (Invok);
1106
1110
@@ -1114,9 +1118,11 @@ static void resolveCursor(SwiftLangSupport &Lang,
1114
1118
SwiftLangSupport &Lang,
1115
1119
SwiftInvocationRef ASTInvok,
1116
1120
bool TryExistingAST,
1121
+ bool CancelOnSubsequentRequest,
1117
1122
std::function<void (const CursorInfo &)> Receiver)
1118
1123
: CursorRangeInfoConsumer(InputFile, Offset, Length, Lang, ASTInvok,
1119
- TryExistingAST), Actionables(Actionables),
1124
+ TryExistingAST, CancelOnSubsequentRequest),
1125
+ Actionables (Actionables),
1120
1126
Receiver(std::move(Receiver)){ }
1121
1127
1122
1128
void handlePrimaryAST (ASTUnitRef AstUnit) override {
@@ -1167,7 +1173,8 @@ static void resolveCursor(SwiftLangSupport &Lang,
1167
1173
if (!getPreviousASTSnaps ().empty ()) {
1168
1174
// Attempt again using the up-to-date AST.
1169
1175
resolveCursor (Lang, InputFile, Offset, Length, Actionables, ASTInvok,
1170
- /* TryExistingAST=*/ false , Receiver);
1176
+ /* TryExistingAST=*/ false , CancelOnSubsequentRequest,
1177
+ Receiver);
1171
1178
} else {
1172
1179
Receiver ({});
1173
1180
}
@@ -1198,11 +1205,16 @@ static void resolveCursor(SwiftLangSupport &Lang,
1198
1205
1199
1206
auto Consumer = std::make_shared<CursorInfoConsumer>(
1200
1207
InputFile, Offset, Length, Actionables, Lang, Invok, TryExistingAST,
1201
- Receiver);
1208
+ CancelOnSubsequentRequest, Receiver);
1209
+
1202
1210
// / FIXME: When request cancellation is implemented and Xcode adopts it,
1203
1211
// / don't use 'OncePerASTToken'.
1204
1212
static const char OncePerASTToken = 0 ;
1205
- Lang.getASTManager().processASTAsync(Invok, std::move(Consumer), &OncePerASTToken);
1213
+ static const char OncePerASTTokenWithActionables = 0 ;
1214
+ const void *Once = nullptr ;
1215
+ if (CancelOnSubsequentRequest)
1216
+ Once = Actionables ? &OncePerASTTokenWithActionables : &OncePerASTToken;
1217
+ Lang.getASTManager().processASTAsync(Invok, std::move(Consumer), Once);
1206
1218
}
1207
1219
1208
1220
static void resolveName (SwiftLangSupport &Lang, StringRef InputFile,
@@ -1222,8 +1234,9 @@ static void resolveName(SwiftLangSupport &Lang, StringRef InputFile,
1222
1234
bool TryExistingAST, NameTranslatingInfo Input,
1223
1235
std::function<void (const NameTranslatingInfo &)> Receiver)
1224
1236
: CursorRangeInfoConsumer(InputFile, Offset, 0 , Lang, ASTInvok,
1225
- TryExistingAST), Input(std::move(Input)),
1226
- Receiver (std::move(Receiver)){ }
1237
+ TryExistingAST,
1238
+ /* CancelOnSubsequentRequest=*/ false ),
1239
+ Input (std::move(Input)), Receiver(std::move(Receiver)){ }
1227
1240
1228
1241
void handlePrimaryAST (ASTUnitRef AstUnit) override {
1229
1242
auto &CompIns = AstUnit->getCompilerInstance ();
@@ -1296,17 +1309,13 @@ static void resolveName(SwiftLangSupport &Lang, StringRef InputFile,
1296
1309
auto Consumer = std::make_shared<NameInfoConsumer>(
1297
1310
InputFile, Offset, Lang, Invok, TryExistingAST, Input, Receiver);
1298
1311
1299
- // / FIXME: When request cancellation is implemented and Xcode adopts it,
1300
- // / don't use 'OncePerASTToken'.
1301
- static const char OncePerASTToken = 0 ;
1302
- Lang.getASTManager().processASTAsync(Invok, std::move(Consumer),
1303
- &OncePerASTToken);
1312
+ Lang.getASTManager().processASTAsync(Invok, std::move(Consumer), nullptr );
1304
1313
}
1305
1314
1306
1315
static void resolveRange (SwiftLangSupport &Lang,
1307
1316
StringRef InputFile, unsigned Offset, unsigned Length,
1308
1317
SwiftInvocationRef Invok,
1309
- bool TryExistingAST,
1318
+ bool TryExistingAST, bool CancelOnSubsequentRequest,
1310
1319
std::function<void (const RangeInfo&)> Receiver) {
1311
1320
assert (Invok);
1312
1321
@@ -1316,10 +1325,11 @@ static void resolveRange(SwiftLangSupport &Lang,
1316
1325
public:
1317
1326
RangeInfoConsumer (StringRef InputFile, unsigned Offset, unsigned Length,
1318
1327
SwiftLangSupport &Lang, SwiftInvocationRef ASTInvok,
1319
- bool TryExistingAST,
1328
+ bool TryExistingAST, bool CancelOnSubsequentRequest,
1320
1329
std::function<void (const RangeInfo&)> Receiver)
1321
1330
: CursorRangeInfoConsumer(InputFile, Offset, Length, Lang, ASTInvok,
1322
- TryExistingAST), Receiver(std::move(Receiver)){ }
1331
+ TryExistingAST, CancelOnSubsequentRequest),
1332
+ Receiver (std::move(Receiver)){ }
1323
1333
1324
1334
void handlePrimaryAST (ASTUnitRef AstUnit) override {
1325
1335
if (trace::enabled ()) {
@@ -1352,7 +1362,8 @@ static void resolveRange(SwiftLangSupport &Lang,
1352
1362
if (!getPreviousASTSnaps ().empty ()) {
1353
1363
// Attempt again using the up-to-date AST.
1354
1364
resolveRange (Lang, InputFile, Offset, Length, ASTInvok,
1355
- /* TryExistingAST=*/ false , Receiver);
1365
+ /* TryExistingAST=*/ false , CancelOnSubsequentRequest,
1366
+ Receiver);
1356
1367
} else {
1357
1368
Receiver (Result);
1358
1369
}
@@ -1373,17 +1384,18 @@ static void resolveRange(SwiftLangSupport &Lang,
1373
1384
};
1374
1385
1375
1386
auto Consumer = std::make_shared<RangeInfoConsumer>(
1376
- InputFile, Offset, Length, Lang, Invok, TryExistingAST, Receiver);
1387
+ InputFile, Offset, Length, Lang, Invok, TryExistingAST,
1388
+ CancelOnSubsequentRequest, Receiver);
1377
1389
// / FIXME: When request cancellation is implemented and Xcode adopts it,
1378
1390
// / don't use 'OncePerASTToken'.
1379
1391
static const char OncePerASTToken = 0 ;
1380
- Lang. getASTManager (). processASTAsync (Invok, std::move (Consumer),
1381
- &OncePerASTToken );
1392
+ const void *Once = CancelOnSubsequentRequest ? &OncePerASTToken : nullptr ;
1393
+ Lang.getASTManager().processASTAsync(Invok, std::move(Consumer), Once );
1382
1394
}
1383
1395
1384
1396
void SwiftLangSupport::getCursorInfo (
1385
1397
StringRef InputFile, unsigned Offset, unsigned Length, bool Actionables,
1386
- ArrayRef<const char *> Args,
1398
+ bool CancelOnSubsequentRequest, ArrayRef<const char *> Args,
1387
1399
std::function<void (const CursorInfo &)> Receiver) {
1388
1400
1389
1401
if (auto IFaceGenRef = IFaceGenContexts.get (InputFile)) {
@@ -1433,12 +1445,12 @@ void SwiftLangSupport::getCursorInfo(
1433
1445
}
1434
1446
1435
1447
resolveCursor (*this , InputFile, Offset, Length, Actionables, Invok,
1436
- /* TryExistingAST=*/ true , Receiver);
1448
+ /* TryExistingAST=*/ true , CancelOnSubsequentRequest, Receiver);
1437
1449
}
1438
1450
1439
1451
void SwiftLangSupport::
1440
1452
getRangeInfo (StringRef InputFile, unsigned Offset, unsigned Length,
1441
- ArrayRef<const char *> Args,
1453
+ bool CancelOnSubsequentRequest, ArrayRef<const char *> Args,
1442
1454
std::function<void (const RangeInfo&)> Receiver) {
1443
1455
if (IFaceGenContexts.get (InputFile)) {
1444
1456
// FIXME: return range info for generated interfaces.
@@ -1458,7 +1470,7 @@ getRangeInfo(StringRef InputFile, unsigned Offset, unsigned Length,
1458
1470
return ;
1459
1471
}
1460
1472
resolveRange (*this , InputFile, Offset, Length, Invok, /* TryExistingAST=*/ true ,
1461
- Receiver);
1473
+ CancelOnSubsequentRequest, Receiver);
1462
1474
}
1463
1475
1464
1476
void SwiftLangSupport::
@@ -1517,6 +1529,7 @@ getNameInfo(StringRef InputFile, unsigned Offset, NameTranslatingInfo &Input,
1517
1529
static void
1518
1530
resolveCursorFromUSR (SwiftLangSupport &Lang, StringRef InputFile, StringRef USR,
1519
1531
SwiftInvocationRef Invok, bool TryExistingAST,
1532
+ bool CancelOnSubsequentRequest,
1520
1533
std::function<void (const CursorInfo &)> Receiver) {
1521
1534
assert (Invok);
1522
1535
@@ -1526,16 +1539,18 @@ resolveCursorFromUSR(SwiftLangSupport &Lang, StringRef InputFile, StringRef USR,
1526
1539
SwiftLangSupport ⟪
1527
1540
SwiftInvocationRef ASTInvok;
1528
1541
const bool TryExistingAST;
1542
+ bool CancelOnSubsequentRequest;
1529
1543
std::function<void (const CursorInfo &)> Receiver;
1530
1544
SmallVector<ImmutableTextSnapshotRef, 4 > PreviousASTSnaps;
1531
1545
1532
1546
public:
1533
1547
CursorInfoConsumer (StringRef InputFile, StringRef USR,
1534
1548
SwiftLangSupport &Lang, SwiftInvocationRef ASTInvok,
1535
- bool TryExistingAST,
1549
+ bool TryExistingAST, bool CancelOnSubsequentRequest,
1536
1550
std::function<void (const CursorInfo &)> Receiver)
1537
1551
: InputFile(InputFile), USR(USR), Lang(Lang),
1538
1552
ASTInvok (std::move(ASTInvok)), TryExistingAST(TryExistingAST),
1553
+ CancelOnSubsequentRequest(CancelOnSubsequentRequest),
1539
1554
Receiver(std::move(Receiver)) {}
1540
1555
1541
1556
bool canUseASTWithSnapshots (
@@ -1607,7 +1622,8 @@ resolveCursorFromUSR(SwiftLangSupport &Lang, StringRef InputFile, StringRef USR,
1607
1622
if (!PreviousASTSnaps.empty ()) {
1608
1623
// Attempt again using the up-to-date AST.
1609
1624
resolveCursorFromUSR (Lang, InputFile, USR, ASTInvok,
1610
- /* TryExistingAST=*/ false , Receiver);
1625
+ /* TryExistingAST=*/ false ,
1626
+ CancelOnSubsequentRequest, Receiver);
1611
1627
} else {
1612
1628
Receiver ({});
1613
1629
}
@@ -1628,16 +1644,18 @@ resolveCursorFromUSR(SwiftLangSupport &Lang, StringRef InputFile, StringRef USR,
1628
1644
};
1629
1645
1630
1646
auto Consumer = std::make_shared<CursorInfoConsumer>(
1631
- InputFile, USR, Lang, Invok, TryExistingAST, Receiver);
1647
+ InputFile, USR, Lang, Invok, TryExistingAST, CancelOnSubsequentRequest,
1648
+ Receiver);
1632
1649
// / FIXME: When request cancellation is implemented and Xcode adopts it,
1633
1650
// / don't use 'OncePerASTToken'.
1634
1651
static const char OncePerASTToken = 0 ;
1635
- Lang.getASTManager().processASTAsync(Invok, std::move(Consumer),
1636
- &OncePerASTToken );
1652
+ const void *Once = CancelOnSubsequentRequest ? &OncePerASTToken : nullptr ;
1653
+ Lang.getASTManager().processASTAsync(Invok, std::move(Consumer), Once );
1637
1654
}
1638
1655
1639
1656
void SwiftLangSupport::getCursorInfoFromUSR (
1640
- StringRef filename, StringRef USR, ArrayRef<const char *> args,
1657
+ StringRef filename, StringRef USR, bool CancelOnSubsequentRequest,
1658
+ ArrayRef<const char *> args,
1641
1659
std::function<void (const CursorInfo &)> receiver) {
1642
1660
if (auto IFaceGenRef = IFaceGenContexts.get (filename)) {
1643
1661
LOG_WARN_FUNC (" info from usr for generated interface not implemented yet" );
@@ -1655,7 +1673,7 @@ void SwiftLangSupport::getCursorInfoFromUSR(
1655
1673
}
1656
1674
1657
1675
resolveCursorFromUSR (*this , filename, USR, invok, /* TryExistingAST=*/ true ,
1658
- receiver);
1676
+ CancelOnSubsequentRequest, receiver);
1659
1677
}
1660
1678
1661
1679
// ===----------------------------------------------------------------------===//
@@ -1724,6 +1742,7 @@ class RelatedIdScanner : public SourceEntityWalker {
1724
1742
1725
1743
void SwiftLangSupport::findRelatedIdentifiersInFile (
1726
1744
StringRef InputFile, unsigned Offset,
1745
+ bool CancelOnSubsequentRequest,
1727
1746
ArrayRef<const char *> Args,
1728
1747
std::function<void (const RelatedIdentsInfo &)> Receiver) {
1729
1748
@@ -1820,5 +1839,6 @@ void SwiftLangSupport::findRelatedIdentifiersInFile(
1820
1839
// / FIXME: When request cancellation is implemented and Xcode adopts it,
1821
1840
// / don't use 'OncePerASTToken'.
1822
1841
static const char OncePerASTToken = 0 ;
1823
- ASTMgr->processASTAsync (Invok, std::move (Consumer), &OncePerASTToken);
1842
+ const void *Once = CancelOnSubsequentRequest ? &OncePerASTToken : nullptr ;
1843
+ ASTMgr->processASTAsync (Invok, std::move (Consumer), Once);
1824
1844
}
0 commit comments