@@ -382,7 +382,8 @@ static void highlightOffendingType(InFlightDiagnostic &diag,
382
382
383
383
// / Emit a note on \p limitImport when it restricted the access level
384
384
// / of a type.
385
- static void noteLimitingImport (ASTContext &ctx,
385
+ static void noteLimitingImport (const Decl *userDecl,
386
+ ASTContext &ctx,
386
387
const ImportAccessLevel limitImport,
387
388
const TypeRepr *complainRepr) {
388
389
if (!limitImport.has_value ())
@@ -393,6 +394,16 @@ static void noteLimitingImport(ASTContext &ctx,
393
394
394
395
if (auto *declRefTR = dyn_cast_or_null<DeclRefTypeRepr>(complainRepr)) {
395
396
ValueDecl *VD = declRefTR->getBoundDecl ();
397
+
398
+ // When using an IDE in a large file the decl_import_via_here note
399
+ // may be easy to miss on the import. Duplicate the information on the
400
+ // error line as well so it can't be missed.
401
+ if (userDecl)
402
+ userDecl->diagnose (diag::decl_import_via_local,
403
+ VD,
404
+ limitImport->accessLevel ,
405
+ limitImport->module .importedModule );
406
+
396
407
ctx.Diags .diagnose (limitImport->importLoc ,
397
408
diag::decl_import_via_here,
398
409
VD,
@@ -405,6 +416,16 @@ static void noteLimitingImport(ASTContext &ctx,
405
416
}
406
417
}
407
418
419
+ static void noteLimitingImport (const Decl *userDecl,
420
+ const ImportAccessLevel limitImport,
421
+ const TypeRepr *complainRepr) {
422
+ if (!limitImport.has_value ())
423
+ return ;
424
+
425
+ ASTContext &ctx = userDecl->getASTContext ();
426
+ noteLimitingImport (userDecl, ctx, limitImport, complainRepr);
427
+ }
428
+
408
429
void AccessControlCheckerBase::checkGenericParamAccess (
409
430
const GenericContext *ownerCtx,
410
431
const Decl *ownerDecl,
@@ -483,7 +504,7 @@ void AccessControlCheckerBase::checkGenericParamAccess(
483
504
Context.Diags .diagnose (ownerDecl, diagID, ownerDecl->getDescriptiveKind (),
484
505
accessControlErrorKind == ACEK::Requirement);
485
506
highlightOffendingType (diag, complainRepr);
486
- noteLimitingImport (Context, minImportLimit, complainRepr);
507
+ noteLimitingImport (/* userDecl */ nullptr , Context, minImportLimit, complainRepr);
487
508
return ;
488
509
}
489
510
@@ -500,7 +521,7 @@ void AccessControlCheckerBase::checkGenericParamAccess(
500
521
contextAccess, minAccess, isa<FileUnit>(DC),
501
522
accessControlErrorKind == ACEK::Requirement);
502
523
highlightOffendingType (diag, complainRepr);
503
- noteLimitingImport (Context, minImportLimit, complainRepr);
524
+ noteLimitingImport (/* userDecl */ nullptr , Context, minImportLimit, complainRepr);
504
525
}
505
526
506
527
void AccessControlCheckerBase::checkGenericParamAccess (
@@ -532,7 +553,7 @@ void AccessControlCheckerBase::checkGlobalActorAccess(const Decl *D) {
532
553
auto diag = D->diagnose (diag::global_actor_not_usable_from_inline,
533
554
VD);
534
555
highlightOffendingType (diag, complainRepr);
535
- noteLimitingImport (D-> getASTContext () , importLimit, complainRepr);
556
+ noteLimitingImport (D, importLimit, complainRepr);
536
557
return ;
537
558
}
538
559
@@ -544,7 +565,7 @@ void AccessControlCheckerBase::checkGlobalActorAccess(const Decl *D) {
544
565
auto diag = D->diagnose (diag::global_actor_access, declAccess, VD,
545
566
typeAccess, globalActorDecl->getName ());
546
567
highlightOffendingType (diag, complainRepr);
547
- noteLimitingImport (D-> getASTContext () , importLimit, complainRepr);
568
+ noteLimitingImport (D, importLimit, complainRepr);
548
569
});
549
570
}
550
571
@@ -630,7 +651,7 @@ class AccessControlChecker : public AccessControlCheckerBase,
630
651
isTypeContext, isExplicit, theVarAccess,
631
652
isa<FileUnit>(theVar->getDeclContext ()),
632
653
typeAccess, theVar->getInterfaceType ());
633
- noteLimitingImport (theVar-> getASTContext () , importLimit, complainRepr);
654
+ noteLimitingImport (theVar, importLimit, complainRepr);
634
655
});
635
656
}
636
657
@@ -664,7 +685,7 @@ class AccessControlChecker : public AccessControlCheckerBase,
664
685
TP->getLoc (), diagID, anyVar->isLet (), isTypeContext, isExplicit,
665
686
anyVarAccess, isa<FileUnit>(anyVar->getDeclContext ()), typeAccess);
666
687
highlightOffendingType (diag, complainRepr);
667
- noteLimitingImport (anyVar-> getASTContext () , importLimit, complainRepr);
688
+ noteLimitingImport (anyVar, importLimit, complainRepr);
668
689
});
669
690
670
691
// Check the property wrapper types.
@@ -691,7 +712,7 @@ class AccessControlChecker : public AccessControlCheckerBase,
691
712
isa<FileUnit>(anyVar->getDeclContext ()),
692
713
typeAccess);
693
714
highlightOffendingType (diag, complainRepr);
694
- noteLimitingImport (anyVar-> getASTContext () , importLimit, complainRepr);
715
+ noteLimitingImport (anyVar, importLimit, complainRepr);
695
716
});
696
717
}
697
718
}
@@ -740,7 +761,7 @@ class AccessControlChecker : public AccessControlCheckerBase,
740
761
auto diag = TAD->diagnose (diagID, isExplicit, aliasAccess, typeAccess,
741
762
isa<FileUnit>(TAD->getDeclContext ()));
742
763
highlightOffendingType (diag, complainRepr);
743
- noteLimitingImport (TAD-> getASTContext () , importLimit, complainRepr);
764
+ noteLimitingImport (TAD, importLimit, complainRepr);
744
765
});
745
766
}
746
767
@@ -826,8 +847,7 @@ class AccessControlChecker : public AccessControlCheckerBase,
826
847
auto diag = assocType->diagnose (diagID, assocType->getFormalAccess (),
827
848
minAccess, accessControlErrorKind);
828
849
highlightOffendingType (diag, complainRepr);
829
- noteLimitingImport (assocType->getASTContext (), minImportLimit,
830
- complainRepr);
850
+ noteLimitingImport (assocType, minImportLimit, complainRepr);
831
851
}
832
852
}
833
853
@@ -863,7 +883,7 @@ class AccessControlChecker : public AccessControlCheckerBase,
863
883
auto diag = ED->diagnose (diagID, isExplicit, enumDeclAccess, typeAccess,
864
884
isa<FileUnit>(ED->getDeclContext ()));
865
885
highlightOffendingType (diag, complainRepr);
866
- noteLimitingImport (ED-> getASTContext () , importLimit, complainRepr);
886
+ noteLimitingImport (ED, importLimit, complainRepr);
867
887
});
868
888
}
869
889
}
@@ -925,7 +945,7 @@ class AccessControlChecker : public AccessControlCheckerBase,
925
945
isa<FileUnit>(CD->getDeclContext ()),
926
946
superclassLocIter->getTypeRepr () != complainRepr);
927
947
highlightOffendingType (diag, complainRepr);
928
- noteLimitingImport (CD-> getASTContext () , importLimit, complainRepr);
948
+ noteLimitingImport (CD, importLimit, complainRepr);
929
949
});
930
950
}
931
951
}
@@ -1018,7 +1038,7 @@ class AccessControlChecker : public AccessControlCheckerBase,
1018
1038
diagID, isExplicit, protoAccess, protocolControlErrorKind, minAccess,
1019
1039
isa<FileUnit>(proto->getDeclContext ()), declKind);
1020
1040
highlightOffendingType (diag, complainRepr);
1021
- noteLimitingImport (proto-> getASTContext () , minImportLimit, complainRepr);
1041
+ noteLimitingImport (proto, minImportLimit, complainRepr);
1022
1042
}
1023
1043
}
1024
1044
@@ -1078,7 +1098,7 @@ class AccessControlChecker : public AccessControlCheckerBase,
1078
1098
auto diag = SD->diagnose (diagID, isExplicit, subscriptDeclAccess,
1079
1099
minAccess, problemIsElement);
1080
1100
highlightOffendingType (diag, complainRepr);
1081
- noteLimitingImport (SD-> getASTContext () , minImportLimit, complainRepr);
1101
+ noteLimitingImport (SD, minImportLimit, complainRepr);
1082
1102
}
1083
1103
}
1084
1104
@@ -1205,7 +1225,7 @@ class AccessControlChecker : public AccessControlCheckerBase,
1205
1225
functionKind, entityKind,
1206
1226
hasInaccessibleParameterWrapper);
1207
1227
highlightOffendingType (diag, complainRepr);
1208
- noteLimitingImport (fn-> getASTContext () , minImportLimit, complainRepr);
1228
+ noteLimitingImport (fn, minImportLimit, complainRepr);
1209
1229
}
1210
1230
}
1211
1231
@@ -1225,8 +1245,7 @@ class AccessControlChecker : public AccessControlCheckerBase,
1225
1245
auto diag =
1226
1246
EED->diagnose (diagID, EED->getFormalAccess (), typeAccess);
1227
1247
highlightOffendingType (diag, complainRepr);
1228
- noteLimitingImport (EED->getASTContext (), importLimit,
1229
- complainRepr);
1248
+ noteLimitingImport (EED, importLimit, complainRepr);
1230
1249
});
1231
1250
}
1232
1251
}
@@ -1289,7 +1308,7 @@ class AccessControlChecker : public AccessControlCheckerBase,
1289
1308
auto diag = MD->diagnose (diagID, isExplicit, macroDeclAccess,
1290
1309
minAccess, problemIsResult);
1291
1310
highlightOffendingType (diag, complainRepr);
1292
- noteLimitingImport (MD-> getASTContext () , minImportLimit, complainRepr);
1311
+ noteLimitingImport (MD, minImportLimit, complainRepr);
1293
1312
}
1294
1313
}
1295
1314
@@ -1412,8 +1431,7 @@ class UsableFromInlineChecker : public AccessControlCheckerBase,
1412
1431
}
1413
1432
Ctx.Diags .diagnose (NP->getLoc (), diagID, theVar->isLet (),
1414
1433
isTypeContext, theVar->getInterfaceType ());
1415
- noteLimitingImport (theVar->getASTContext (), importLimit,
1416
- complainRepr);
1434
+ noteLimitingImport (theVar, importLimit, complainRepr);
1417
1435
});
1418
1436
}
1419
1437
@@ -1452,8 +1470,7 @@ class UsableFromInlineChecker : public AccessControlCheckerBase,
1452
1470
auto diag = Ctx.Diags .diagnose (TP->getLoc (), diagID, anyVar->isLet (),
1453
1471
isTypeContext);
1454
1472
highlightOffendingType (diag, complainRepr);
1455
- noteLimitingImport (anyVar->getASTContext (), importLimit,
1456
- complainRepr);
1473
+ noteLimitingImport (anyVar, importLimit, complainRepr);
1457
1474
});
1458
1475
1459
1476
for (auto attr : anyVar->getAttachedPropertyWrappers ()) {
@@ -1469,7 +1486,7 @@ class UsableFromInlineChecker : public AccessControlCheckerBase,
1469
1486
diag::property_wrapper_type_not_usable_from_inline,
1470
1487
anyVar->isLet (), isTypeContext);
1471
1488
highlightOffendingType (diag, complainRepr);
1472
- noteLimitingImport (anyVar-> getASTContext () , importLimit, complainRepr);
1489
+ noteLimitingImport (anyVar, importLimit, complainRepr);
1473
1490
});
1474
1491
}
1475
1492
}
@@ -1508,7 +1525,7 @@ class UsableFromInlineChecker : public AccessControlCheckerBase,
1508
1525
diagID = diag::type_alias_underlying_type_not_usable_from_inline_warn;
1509
1526
auto diag = TAD->diagnose (diagID);
1510
1527
highlightOffendingType (diag, complainRepr);
1511
- noteLimitingImport (TAD-> getASTContext () , importLimit, complainRepr);
1528
+ noteLimitingImport (TAD, importLimit, complainRepr);
1512
1529
});
1513
1530
}
1514
1531
@@ -1530,8 +1547,7 @@ class UsableFromInlineChecker : public AccessControlCheckerBase,
1530
1547
diagID = diag::associated_type_not_usable_from_inline_warn;
1531
1548
auto diag = assocType->diagnose (diagID, ACEK_Requirement);
1532
1549
highlightOffendingType (diag, complainRepr);
1533
- noteLimitingImport (assocType->getASTContext (), importLimit,
1534
- complainRepr);
1550
+ noteLimitingImport (assocType, importLimit, complainRepr);
1535
1551
});
1536
1552
}
1537
1553
checkTypeAccess (assocType->getDefaultDefinitionType (),
@@ -1546,8 +1562,7 @@ class UsableFromInlineChecker : public AccessControlCheckerBase,
1546
1562
diagID = diag::associated_type_not_usable_from_inline_warn;
1547
1563
auto diag = assocType->diagnose (diagID, ACEK_DefaultDefinition);
1548
1564
highlightOffendingType (diag, complainRepr);
1549
- noteLimitingImport (assocType->getASTContext (), importLimit,
1550
- complainRepr);
1565
+ noteLimitingImport (assocType, importLimit, complainRepr);
1551
1566
});
1552
1567
1553
1568
if (assocType->getTrailingWhereClause ()) {
@@ -1565,8 +1580,7 @@ class UsableFromInlineChecker : public AccessControlCheckerBase,
1565
1580
diagID = diag::associated_type_not_usable_from_inline_warn;
1566
1581
auto diag = assocType->diagnose (diagID, ACEK_Requirement);
1567
1582
highlightOffendingType (diag, complainRepr);
1568
- noteLimitingImport (assocType->getASTContext (), importLimit,
1569
- complainRepr);
1583
+ noteLimitingImport (assocType, importLimit, complainRepr);
1570
1584
});
1571
1585
}
1572
1586
}
@@ -1597,7 +1611,7 @@ class UsableFromInlineChecker : public AccessControlCheckerBase,
1597
1611
diagID = diag::enum_raw_type_not_usable_from_inline_warn;
1598
1612
auto diag = ED->diagnose (diagID);
1599
1613
highlightOffendingType (diag, complainRepr);
1600
- noteLimitingImport (ED-> getASTContext () , importLimit, complainRepr);
1614
+ noteLimitingImport (ED, importLimit, complainRepr);
1601
1615
});
1602
1616
}
1603
1617
}
@@ -1643,7 +1657,7 @@ class UsableFromInlineChecker : public AccessControlCheckerBase,
1643
1657
auto diag = CD->diagnose (diagID, superclassLocIter->getTypeRepr () !=
1644
1658
complainRepr);
1645
1659
highlightOffendingType (diag, complainRepr);
1646
- noteLimitingImport (CD-> getASTContext () , importLimit, complainRepr);
1660
+ noteLimitingImport (CD, importLimit, complainRepr);
1647
1661
});
1648
1662
}
1649
1663
}
@@ -1666,7 +1680,7 @@ class UsableFromInlineChecker : public AccessControlCheckerBase,
1666
1680
diagID = diag::protocol_usable_from_inline_warn;
1667
1681
auto diag = proto->diagnose (diagID, PCEK_Refine);
1668
1682
highlightOffendingType (diag, complainRepr);
1669
- noteLimitingImport (proto-> getASTContext () , importLimit, complainRepr);
1683
+ noteLimitingImport (proto, importLimit, complainRepr);
1670
1684
});
1671
1685
}
1672
1686
@@ -1685,7 +1699,7 @@ class UsableFromInlineChecker : public AccessControlCheckerBase,
1685
1699
diagID = diag::protocol_usable_from_inline_warn;
1686
1700
auto diag = proto->diagnose (diagID, PCEK_Requirement);
1687
1701
highlightOffendingType (diag, complainRepr);
1688
- noteLimitingImport (proto-> getASTContext () , importLimit, complainRepr);
1702
+ noteLimitingImport (proto, importLimit, complainRepr);
1689
1703
});
1690
1704
}
1691
1705
}
@@ -1704,7 +1718,7 @@ class UsableFromInlineChecker : public AccessControlCheckerBase,
1704
1718
diagID = diag::subscript_type_usable_from_inline_warn;
1705
1719
auto diag = SD->diagnose (diagID, /* problemIsElement=*/ false );
1706
1720
highlightOffendingType (diag, complainRepr);
1707
- noteLimitingImport (SD-> getASTContext () , importLimit, complainRepr);
1721
+ noteLimitingImport (SD, importLimit, complainRepr);
1708
1722
});
1709
1723
}
1710
1724
@@ -1719,7 +1733,7 @@ class UsableFromInlineChecker : public AccessControlCheckerBase,
1719
1733
diagID = diag::subscript_type_usable_from_inline_warn;
1720
1734
auto diag = SD->diagnose (diagID, /* problemIsElement=*/ true );
1721
1735
highlightOffendingType (diag, complainRepr);
1722
- noteLimitingImport (SD-> getASTContext () , importLimit, complainRepr);
1736
+ noteLimitingImport (SD, importLimit, complainRepr);
1723
1737
});
1724
1738
}
1725
1739
@@ -1757,8 +1771,7 @@ class UsableFromInlineChecker : public AccessControlCheckerBase,
1757
1771
/* problemIsResult=*/ false ,
1758
1772
/* inaccessibleWrapper=*/ true );
1759
1773
highlightOffendingType (diag, complainRepr);
1760
- noteLimitingImport (fn->getASTContext (), importLimit,
1761
- complainRepr);
1774
+ noteLimitingImport (fn, importLimit, complainRepr);
1762
1775
});
1763
1776
}
1764
1777
}
@@ -1775,7 +1788,7 @@ class UsableFromInlineChecker : public AccessControlCheckerBase,
1775
1788
/* problemIsResult=*/ false ,
1776
1789
/* inaccessibleWrapper=*/ false );
1777
1790
highlightOffendingType (diag, complainRepr);
1778
- noteLimitingImport (fn-> getASTContext () , importLimit, complainRepr);
1791
+ noteLimitingImport (fn, importLimit, complainRepr);
1779
1792
});
1780
1793
}
1781
1794
@@ -1793,7 +1806,7 @@ class UsableFromInlineChecker : public AccessControlCheckerBase,
1793
1806
/* problemIsResult=*/ true ,
1794
1807
/* inaccessibleWrapper=*/ false );
1795
1808
highlightOffendingType (diag, complainRepr);
1796
- noteLimitingImport (fn-> getASTContext () , importLimit, complainRepr);
1809
+ noteLimitingImport (fn, importLimit, complainRepr);
1797
1810
});
1798
1811
}
1799
1812
}
@@ -1816,8 +1829,7 @@ class UsableFromInlineChecker : public AccessControlCheckerBase,
1816
1829
diagID = diag::enum_case_usable_from_inline_warn;
1817
1830
auto diag = EED->diagnose (diagID);
1818
1831
highlightOffendingType (diag, complainRepr);
1819
- noteLimitingImport (EED->getASTContext (), importLimit,
1820
- complainRepr);
1832
+ noteLimitingImport (EED, importLimit, complainRepr);
1821
1833
});
1822
1834
}
1823
1835
}
0 commit comments