Skip to content

Commit 99d9beb

Browse files
committed
[Sema] Cleaner diagnostics for conflicting import modifiers
1 parent 47d2f1a commit 99d9beb

File tree

2 files changed

+17
-8
lines changed

2 files changed

+17
-8
lines changed

include/swift/AST/DiagnosticsSema.def

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -965,8 +965,10 @@ ERROR(module_not_compiled_for_private_import,none,
965965
"module %0 was not compiled for private import", (Identifier))
966966

967967
ERROR(import_restriction_conflict,none,
968-
"module %0 cannot be both %1 and %2",
969-
(Identifier, StringRef, StringRef))
968+
"module %0 cannot be both "
969+
"%select{implementation-only|SPI only|exported}1 and "
970+
"%select{implementation-only|SPI only|exported}2 ",
971+
(Identifier, unsigned, unsigned))
970972

971973
WARNING(module_not_compiled_with_library_evolution,none,
972974
"module %0 was not compiled with library evolution support; "

lib/Sema/ImportResolution.cpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -659,14 +659,21 @@ void UnboundImport::validateRestrictedImport(ASTContext &ctx) {
659659
DeclAttrKind attrToRemove = conflicts[0] == ImportFlags::ImplementationOnly?
660660
DAK_Exported : DAK_ImplementationOnly;
661661

662-
auto flagName = [](ImportFlags flag) {
662+
// More dense enum with some cases of ImportFlags,
663+
// used by import_restriction_conflict.
664+
enum class ImportFlagForDiag : uint8_t {
665+
ImplementationOnly,
666+
SPIOnly,
667+
Exported
668+
};
669+
auto flagToDiag = [](ImportFlags flag) {
663670
switch (flag) {
664671
case ImportFlags::ImplementationOnly:
665-
return "implementation-only";
672+
return ImportFlagForDiag::ImplementationOnly;
666673
case ImportFlags::SPIOnly:
667-
return "SPI only";
674+
return ImportFlagForDiag::SPIOnly;
668675
case ImportFlags::Exported:
669-
return "exported";
676+
return ImportFlagForDiag::Exported;
670677
default:
671678
llvm_unreachable("Unexpected ImportFlag");
672679
}
@@ -676,8 +683,8 @@ void UnboundImport::validateRestrictedImport(ASTContext &ctx) {
676683
auto diag = ctx.Diags.diagnose(import.module.getModulePath().front().Loc,
677684
diag::import_restriction_conflict,
678685
import.module.getModulePath().front().Item,
679-
flagName(conflicts[0]),
680-
flagName(conflicts[1]));
686+
(uint8_t)flagToDiag(conflicts[0]),
687+
(uint8_t)flagToDiag(conflicts[1]));
681688

682689
auto *ID = getImportDecl().getPtrOrNull();
683690
if (!ID) return;

0 commit comments

Comments
 (0)