Skip to content

Commit 202c4db

Browse files
committed
Remove implicit availability of Foundation from future manifest versions
This changes all imports of `Foundation` in the `PackageDescription` module to be implementation-only, making it so that it needs to be explicitly imported if being used. To avoid breaking existing packages, we inject an explicit import into manifests with tools-version 5.7 or earlier. In the next tools-version, `Foundation` will no longer be implicitly available. rdar://92879696
1 parent 1c53ef5 commit 202c4db

19 files changed

Lines changed: 64 additions & 16 deletions

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@ Note: This is in reverse chronological order, so newer entries are added to the
33
Swift 5.8
44
-----------
55

6+
* [#5874]
7+
8+
In packages using tools version 5.8 or later, Foundation is no longer implicitly imported into package manifests. If Foundation APIs are used, the module needs to be imported explicitly.
9+
610
* [#5728]
711

812
In packages that specify resources using tools version 5.8 or later, the generated resource bundle accessor will import `Foundation.Bundle` for its own implementation only. _Clients_ of such packages therefore no longer silently import `Foundation`, preventing inadvertent use of Foundation extensions to standard library APIs, which helps to avoid unexpected code size increases.

Sources/PackageDescription/PackageDependency.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13-
import Foundation
13+
@_implementationOnly import Foundation
1414

1515
// MARK: - file system
1616

Sources/PackageDescription/PackageDescription.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
@_implementationOnly import ucrt
1919
@_implementationOnly import struct WinSDK.HANDLE
2020
#endif
21-
import Foundation
21+
@_implementationOnly import Foundation
2222

2323
/// The configuration of a Swift package.
2424
///

Sources/PackageDescription/PackageDescriptionSerialization.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13-
import Foundation
13+
@_implementationOnly import Foundation
1414
#if canImport(Glibc)
1515
@_implementationOnly import Glibc
1616
#elseif canImport(Darwin)

Sources/PackageDescription/Target.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13-
import Foundation
13+
@_implementationOnly import Foundation
1414

1515
/// The basic building block of a Swift package.
1616
///

Sources/PackageLoading/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
add_library(PackageLoading
1010
ContextModel.swift
1111
Diagnostics.swift
12-
IdentityResolver.swift
1312
ManifestLoader.swift
1413
ManifestLoader+Validation.swift
1514
ModuleMapGenerator.swift

Sources/PackageLoading/ContextModel.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13-
import Foundation
13+
@_implementationOnly import Foundation
1414

1515
struct ContextModel {
1616
let packageDirectory : String

Sources/PackageLoading/ManifestJSONParser.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
//===----------------------------------------------------------------------===//
1212

1313
import Basics
14-
import Foundation
14+
@_implementationOnly import Foundation
1515
import PackageModel
1616
import TSCBasic
1717

Sources/PackageLoading/ManifestLoader+Validation.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
//===----------------------------------------------------------------------===//
1212

1313
import Basics
14-
import Foundation
14+
@_implementationOnly import Foundation
1515
import PackageModel
1616
import TSCBasic
1717

Sources/PackageLoading/ManifestLoader.swift

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
//===----------------------------------------------------------------------===//
1212

1313
import Basics
14-
import Foundation
14+
import Dispatch
15+
@_implementationOnly import Foundation
1516
import PackageModel
1617
import TSCBasic
1718
import enum TSCUtility.Diagnostics
@@ -431,10 +432,18 @@ public final class ManifestLoader: ManifestLoaderProtocol {
431432
callbackQueue: DispatchQueue,
432433
completion: @escaping (Result<EvaluationResult, Error>) -> Void
433434
) throws {
435+
let manifestPreamble: ByteString
436+
switch toolsVersion {
437+
case .vNext:
438+
manifestPreamble = ByteString()
439+
default:
440+
manifestPreamble = ByteString("import Foundation\n")
441+
}
442+
434443
do {
435444
try withTemporaryDirectory { tempDir, cleanupTempDir in
436445
let manifestTempFilePath = tempDir.appending(component: "manifest.swift")
437-
try localFileSystem.writeFileContents(manifestTempFilePath, bytes: ByteString(manifestContents))
446+
try localFileSystem.writeFileContents(manifestTempFilePath, bytes: ByteString(manifestPreamble.contents + manifestContents))
438447

439448
let vfsOverlayTempFilePath = tempDir.appending(component: "vfs.yaml")
440449
try VFSOverlay(roots: [

0 commit comments

Comments
 (0)