Skip to content

Commit dc2e33f

Browse files
authored
Explicitly set the Swift language mode on package init (#9263)
Explicitly set the Swift language mode on package init ### Motivation: When a package is created using `swift package init` no language mode is specified and defaults to using Swift 5. New packages should be written in Swift 6, so explicitly set the language mode to 6 on package init. ### Modifications: Include a language mode on package init ### Result: New packages created using `swift package init` will include the following by default: swiftLanguageModes: [.v6] ``` let package = Package( name: "tmp", products: [ // Products define the executables and libraries a package produces, making them visible to other packages. .library( name: "tmp", targets: ["tmp"] ), ], targets: [ // Targets are the basic building blocks of a package, defining a module or a test suite. // Targets can depend on other targets in this package and products from dependencies. .target( name: "tmp" ), .testTarget( name: "tmpTests", dependencies: ["tmp"] ), ], swiftLanguageModes: [.v6] ) ```
1 parent da5df4c commit dc2e33f

File tree

3 files changed

+40
-3
lines changed

3 files changed

+40
-3
lines changed

Sources/Workspace/InitPackage.swift

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,19 @@ public final class InitPackage {
3535
/// Note: This should only contain Apple platforms right now.
3636
public var platforms: [SupportedPlatform]
3737

38+
/// The swiftLanguageModes to include
39+
public var swiftLanguageModes: [SwiftLanguageVersion]
40+
3841
public init(
3942
packageType: PackageType,
4043
supportedTestingLibraries: Set<TestingLibrary>,
41-
platforms: [SupportedPlatform] = []
44+
platforms: [SupportedPlatform] = [],
45+
swiftLanguageModes: [SwiftLanguageVersion] = [SwiftLanguageVersion.v6]
4246
) {
4347
self.packageType = packageType
4448
self.supportedTestingLibraries = supportedTestingLibraries
4549
self.platforms = platforms
50+
self.swiftLanguageModes = swiftLanguageModes
4651
}
4752
}
4853

@@ -432,6 +437,12 @@ public final class InitPackage {
432437
pkgParams.append(param)
433438
}
434439

440+
if (!options.swiftLanguageModes.isEmpty) {
441+
pkgParams.append("""
442+
swiftLanguageModes: [\(options.swiftLanguageModes.map { ".v\($0)" }.joined(separator: ", "))]
443+
""")
444+
}
445+
435446
stream.send("\(pkgParams.joined(separator: ",\n"))\n)\n")
436447
}
437448

Sources/_InternalTestSupport/misc.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -666,11 +666,12 @@ extension InitPackage {
666666
packageType: PackageType,
667667
supportedTestingLibraries: Set<TestingLibrary> = [.swiftTesting],
668668
destinationPath: AbsolutePath,
669-
fileSystem: FileSystem
669+
fileSystem: FileSystem,
670+
swiftLanguageModes: [SwiftLanguageVersion] = []
670671
) throws {
671672
try self.init(
672673
name: name,
673-
options: InitPackageOptions(packageType: packageType, supportedTestingLibraries: supportedTestingLibraries),
674+
options: InitPackageOptions(packageType: packageType, supportedTestingLibraries: supportedTestingLibraries, swiftLanguageModes: swiftLanguageModes),
674675
destinationPath: destinationPath,
675676
installedSwiftPMConfiguration: .default,
676677
fileSystem: fileSystem

Tests/WorkspaceTests/InitTests.swift

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,31 @@ final class InitTests: XCTestCase {
510510
}
511511
}
512512

513+
func testInitPackageIncludesSwiftLanguageMode() throws {
514+
try testWithTemporaryDirectory { tmpPath in
515+
let fs = localFileSystem
516+
let path = tmpPath.appending("testInitPackageIncludesSwiftLanguageMode")
517+
let name = path.basename
518+
try fs.createDirectory(path)
519+
520+
// Create a library package
521+
let initPackage = try InitPackage(
522+
name: name,
523+
packageType: .library,
524+
supportedTestingLibraries: [],
525+
destinationPath: path,
526+
installedSwiftPMConfiguration: .default,
527+
fileSystem: localFileSystem
528+
)
529+
try initPackage.writePackageStructure()
530+
531+
// Verify the manifest includes Swift language mode
532+
let manifest = path.appending("Package.swift")
533+
let manifestContents: String = try localFileSystem.readFileContents(manifest)
534+
XCTAssertMatch(manifestContents, .contains("swiftLanguageModes: [.v6]"))
535+
}
536+
}
537+
513538
private func packageWithNameOnly(named name: String) -> String {
514539
return """
515540
let package = Package(

0 commit comments

Comments
 (0)