@@ -1336,30 +1336,46 @@ lookupPrecedenceGroup(const PrecedenceGroupDescriptor &descriptor) {
1336
1336
}
1337
1337
}
1338
1338
1339
+ static PrecedenceGroupDecl *lookupPrecedenceGroupForRelation (
1340
+ DeclContext *dc, PrecedenceGroupDecl::Relation rel,
1341
+ PrecedenceGroupDescriptor::PathDirection direction) {
1342
+ auto &ctx = dc->getASTContext ();
1343
+ PrecedenceGroupDescriptor desc{dc, rel.Name , rel.NameLoc , direction};
1344
+ auto result = ctx.evaluator (ValidatePrecedenceGroupRequest{desc});
1345
+ if (!result) {
1346
+ // Handle a cycle error specially. We don't want to default to an empty
1347
+ // result, as we don't want to emit an error about not finding a precedence
1348
+ // group.
1349
+ using Error = CyclicalRequestError<ValidatePrecedenceGroupRequest>;
1350
+ llvm::handleAllErrors (result.takeError (), [](const Error &E) {});
1351
+ return nullptr ;
1352
+ }
1353
+ if (!result.get ()) {
1354
+ ctx.Diags .diagnose (rel.NameLoc , diag::unknown_precedence_group, rel.Name );
1355
+ }
1356
+ return result.get ();
1357
+ }
1358
+
1339
1359
void swift::validatePrecedenceGroup (PrecedenceGroupDecl *PGD) {
1340
1360
assert (PGD && " Cannot validate a null precedence group!" );
1341
1361
if (PGD->isInvalid ())
1342
1362
return ;
1343
1363
1344
1364
auto &Diags = PGD->getASTContext ().Diags ;
1365
+ auto *dc = PGD->getDeclContext ();
1345
1366
1346
1367
// Validate the higherThan relationships.
1347
1368
bool addedHigherThan = false ;
1348
1369
for (auto &rel : PGD->getMutableHigherThan ()) {
1349
1370
if (rel.Group )
1350
1371
continue ;
1351
1372
1352
- PrecedenceGroupDescriptor desc{PGD->getDeclContext (), rel.Name , rel.NameLoc ,
1353
- PrecedenceGroupDescriptor::HigherThan};
1354
- auto group =
1355
- evaluateOrDefault (PGD->getASTContext ().evaluator ,
1356
- ValidatePrecedenceGroupRequest{desc}, nullptr );
1357
- if (group) {
1358
- rel.Group = group;
1373
+ // TODO: Requestify the lookup of a relation's group.
1374
+ rel.Group = lookupPrecedenceGroupForRelation (
1375
+ dc, rel, PrecedenceGroupDescriptor::HigherThan);
1376
+ if (rel.Group ) {
1359
1377
addedHigherThan = true ;
1360
1378
} else {
1361
- if (!lookupPrecedenceGroup (desc))
1362
- Diags.diagnose (rel.NameLoc , diag::unknown_precedence_group, rel.Name );
1363
1379
PGD->setInvalid ();
1364
1380
}
1365
1381
}
@@ -1369,24 +1385,16 @@ void swift::validatePrecedenceGroup(PrecedenceGroupDecl *PGD) {
1369
1385
if (rel.Group )
1370
1386
continue ;
1371
1387
1372
- auto dc = PGD->getDeclContext ();
1373
- PrecedenceGroupDescriptor desc{PGD->getDeclContext (), rel.Name , rel.NameLoc ,
1374
- PrecedenceGroupDescriptor::LowerThan};
1375
- auto group =
1376
- evaluateOrDefault (PGD->getASTContext ().evaluator ,
1377
- ValidatePrecedenceGroupRequest{desc}, nullptr );
1378
- bool hadError = false ;
1379
- if (group) {
1380
- rel.Group = group;
1381
- } else {
1382
- hadError = true ;
1383
- if (auto *rawGroup = lookupPrecedenceGroup (desc)) {
1384
- // We already know the lowerThan path is errant, try to use the results
1385
- // of a raw lookup to enforce the same-module restriction.
1386
- group = rawGroup;
1387
- } else {
1388
- Diags.diagnose (rel.NameLoc , diag::unknown_precedence_group, rel.Name );
1389
- }
1388
+ auto *group = lookupPrecedenceGroupForRelation (
1389
+ dc, rel, PrecedenceGroupDescriptor::LowerThan);
1390
+ rel.Group = group;
1391
+
1392
+ // If we didn't find anything, try doing a raw lookup for the group before
1393
+ // diagnosing the 'lowerThan' within the same-module restriction. This can
1394
+ // allow us to diagnose even if we have a precedence group cycle.
1395
+ if (!group) {
1396
+ group = lookupPrecedenceGroup (PrecedenceGroupDescriptor{
1397
+ dc, rel.Name , rel.NameLoc , PrecedenceGroupDescriptor::LowerThan});
1390
1398
}
1391
1399
1392
1400
if (group &&
@@ -1396,10 +1404,10 @@ void swift::validatePrecedenceGroup(PrecedenceGroupDecl *PGD) {
1396
1404
Diags.diagnose (group->getNameLoc (), diag::kind_declared_here,
1397
1405
DescriptiveDeclKind::PrecedenceGroup);
1398
1406
}
1399
- hadError = true ;
1407
+ PGD-> setInvalid () ;
1400
1408
}
1401
1409
1402
- if (hadError )
1410
+ if (!rel. Group )
1403
1411
PGD->setInvalid ();
1404
1412
}
1405
1413
0 commit comments