Skip to content

Commit 8f195b0

Browse files
committed
[Sema] Note which import restricts conformances and typealiases in API
1 parent 2322164 commit 8f195b0

File tree

4 files changed

+29
-3
lines changed

4 files changed

+29
-3
lines changed

include/swift/AST/DiagnosticsSema.def

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2337,7 +2337,7 @@ NOTE(decl_import_via_here,none,
23372337
"%kind0 imported as "
23382338
"'%select{private|fileprivate|internal|package|%ERROR|%ERROR}1' "
23392339
"from %2 here",
2340-
(const ValueDecl *, AccessLevel, const ModuleDecl*))
2340+
(const Decl *, AccessLevel, const ModuleDecl*))
23412341

23422342
// Opaque return types
23432343
ERROR(opaque_type_invalid_constraint,none,

lib/Sema/ResilienceDiagnostics.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,19 @@ static bool diagnoseTypeAliasDeclRefExportability(SourceLoc loc,
177177
!ctx.LangOpts.isSwiftVersionAtLeast(6))
178178
addMissingImport(loc, D, where);
179179

180+
// If limited by an import, note which one.
181+
if (originKind == DisallowedOriginKind::NonPublicImport) {
182+
const DeclContext *DC = where.getDeclContext();
183+
ImportAccessLevel limitImport = D->getImportAccessFrom(DC);
184+
assert(limitImport.has_value() &&
185+
limitImport->accessLevel < AccessLevel::Public &&
186+
"The import should still be non-public");
187+
ctx.Diags.diagnose(limitImport->accessLevelLoc,
188+
diag::decl_import_via_here, D,
189+
limitImport->accessLevel,
190+
limitImport->module.importedModule);
191+
}
192+
180193
return true;
181194
}
182195

@@ -303,5 +316,18 @@ TypeChecker::diagnoseConformanceExportability(SourceLoc loc,
303316
!ctx.LangOpts.isSwiftVersionAtLeast(6))
304317
addMissingImport(loc, ext, where);
305318

319+
// If limited by an import, note which one.
320+
if (originKind == DisallowedOriginKind::NonPublicImport) {
321+
const DeclContext *DC = where.getDeclContext();
322+
ImportAccessLevel limitImport = ext->getImportAccessFrom(DC);
323+
assert(limitImport.has_value() &&
324+
limitImport->accessLevel < AccessLevel::Public &&
325+
"The import should still be non-public");
326+
ctx.Diags.diagnose(limitImport->accessLevelLoc,
327+
diag::decl_import_via_here, ext,
328+
limitImport->accessLevel,
329+
limitImport->module.importedModule);
330+
}
331+
306332
return true;
307333
}

test/Sema/access-level-import-conformances.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ extension ConformingType : Proto {}
2121

2222
//--- Client.swift
2323
public import ConformanceBaseTypes
24-
internal import ConformanceDefinition
24+
internal import ConformanceDefinition // expected-note 2 {{extension of struct 'ConformingType' imported as 'internal' from 'ConformanceDefinition' here}}
2525

2626
public func useInAPI(a: any Proto = ConformingType()) { // expected-error {{cannot use conformance of 'ConformingType' to 'Proto' here; 'ConformanceDefinition' was not imported publicly}}
2727
}

test/Sema/access-level-import-typealias.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public typealias ClazzAlias = Clazz
2020

2121
//--- UsesAliasesNoImport.swift
2222
public import Aliases
23-
internal import Original
23+
internal import Original // expected-note 2 {{class 'Clazz' imported as 'internal' from 'Original' here}}
2424

2525
// expected-error@+1 {{'ClazzAlias' aliases 'Original.Clazz' and cannot be used here because 'Original' was not imported publicly}}
2626
public class InheritsFromClazzAlias: ClazzAlias {}

0 commit comments

Comments
 (0)