diff --git a/Sources/Commands/PackageCommands/AddDependency.swift b/Sources/Commands/PackageCommands/AddDependency.swift index f14fa2f8f71..aae20096657 100644 --- a/Sources/Commands/PackageCommands/AddDependency.swift +++ b/Sources/Commands/PackageCommands/AddDependency.swift @@ -93,8 +93,6 @@ extension SwiftPackageCommand { workspace: Workspace, url: String ) throws { - let identity = PackageIdentity(url: .init(url)) - // Collect all of the possible version requirements. var requirements: [PackageDependency.SourceControl.Requirement] = [] if let exact { @@ -144,17 +142,18 @@ extension SwiftPackageCommand { } } - let packageDependency: PackageDependency = .sourceControl( - identity: identity, - nameForTargetDependencyResolutionOnly: nil, - location: .remote(.init(url)), - requirement: requirement, + let packageDependency: MappablePackageDependency = .init( + parentPackagePath: packagePath, + kind: .sourceControl( + name: nil, + location: url, + requirement: requirement + ), productFilter: .everything, traits: [] ) try applyEdits( - packagePath: packagePath, workspace: workspace, packageDependency: packageDependency ) @@ -165,8 +164,6 @@ extension SwiftPackageCommand { workspace: Workspace, id: String ) throws { - let identity: PackageIdentity = .plain(id) - // Collect all of the possible version requirements. var requirements: [PackageDependency.Registry.Requirement] = [] if let exact { @@ -208,16 +205,17 @@ extension SwiftPackageCommand { } } - let packageDependency: PackageDependency = .registry( - identity: identity, - requirement: requirement, + let packageDependency: MappablePackageDependency = .init( + parentPackagePath: packagePath, + kind: .registry( + id: id, + requirement: requirement + ), productFilter: .everything, traits: [] ) - try applyEdits( - packagePath: packagePath, workspace: workspace, packageDependency: packageDependency ) @@ -228,33 +226,29 @@ extension SwiftPackageCommand { workspace: Workspace, directory: String ) throws { - guard let path = try? Basics.AbsolutePath(validating: directory) else { - throw StringError("Package path not found") - } - let identity = PackageIdentity(path: path) - let packageDependency: PackageDependency = .fileSystem( - identity: identity, - nameForTargetDependencyResolutionOnly: nil, - path: path, + let packageDependency: MappablePackageDependency = .init( + parentPackagePath: packagePath, + kind: .fileSystem( + name: nil, + path: directory + ), productFilter: .everything, traits: [] ) try applyEdits( - packagePath: packagePath, workspace: workspace, packageDependency: packageDependency ) } private func applyEdits( - packagePath: Basics.AbsolutePath, workspace: Workspace, - packageDependency: PackageDependency + packageDependency: MappablePackageDependency ) throws { // Load the manifest file let fileSystem = workspace.fileSystem - let manifestPath = packagePath.appending(component: Manifest.filename) + let manifestPath = packageDependency.parentPackagePath.appending(component: Manifest.filename) let manifestContents: ByteString do { manifestContents = try fileSystem.readFileContents(manifestPath) diff --git a/Sources/Commands/PackageCommands/AddTarget.swift b/Sources/Commands/PackageCommands/AddTarget.swift index b1fb52aaaee..09e8274ddf7 100644 --- a/Sources/Commands/PackageCommands/AddTarget.swift +++ b/Sources/Commands/PackageCommands/AddTarget.swift @@ -114,6 +114,7 @@ extension SwiftPackageCommand { let editResult = try PackageModelSyntax.AddTarget.addTarget( target, + packagePath: packagePath, to: manifestSyntax, configuration: .init(testHarness: testingLibrary), installedSwiftPMConfiguration: swiftCommandState diff --git a/Sources/PackageModelSyntax/AddPackageDependency.swift b/Sources/PackageModelSyntax/AddPackageDependency.swift index 09231a49293..6102e376853 100644 --- a/Sources/PackageModelSyntax/AddPackageDependency.swift +++ b/Sources/PackageModelSyntax/AddPackageDependency.swift @@ -34,7 +34,7 @@ public struct AddPackageDependency { /// Produce the set of source edits needed to add the given package /// dependency to the given manifest file. public static func addPackageDependency( - _ dependency: PackageDependency, + _ dependency: MappablePackageDependency, to manifest: SourceFileSyntax ) throws -> PackageEditResult { // Make sure we have a suitable tools version in the manifest. @@ -57,7 +57,7 @@ public struct AddPackageDependency { /// Implementation of adding a package dependency to an existing call. static func addPackageDependencyLocal( - _ dependency: PackageDependency, + _ dependency: MappablePackageDependency, to packageCall: FunctionCallExprSyntax ) throws -> FunctionCallExprSyntax { try packageCall.appendingToArrayArgument( diff --git a/Sources/PackageModelSyntax/AddTarget.swift b/Sources/PackageModelSyntax/AddTarget.swift index 5f51112e946..5dd4203e579 100644 --- a/Sources/PackageModelSyntax/AddTarget.swift +++ b/Sources/PackageModelSyntax/AddTarget.swift @@ -62,6 +62,7 @@ public struct AddTarget { /// new target. public static func addTarget( _ target: TargetDescription, + packagePath: AbsolutePath, to manifest: SourceFileSyntax, configuration: Configuration = .init(), installedSwiftPMConfiguration: InstalledSwiftPMConfiguration = .default @@ -140,7 +141,8 @@ public struct AddTarget { newPackageCall = try AddPackageDependency .addPackageDependencyLocal( .swiftSyntax( - configuration: installedSwiftPMConfiguration + packagePath: packagePath, + configuration: installedSwiftPMConfiguration ), to: newPackageCall ) @@ -168,6 +170,7 @@ public struct AddTarget { newPackageCall = try AddPackageDependency .addPackageDependencyLocal( .swiftTesting( + packagePath: packagePath, configuration: installedSwiftPMConfiguration ), to: newPackageCall @@ -357,7 +360,7 @@ fileprivate let macroTargetDependencies: [TargetDescription.Dependency] = [ ] /// The package dependency for swift-syntax, for use in macros. -fileprivate extension PackageDependency { +fileprivate extension MappablePackageDependency { /// Source control URL for the swift-syntax package. static var swiftSyntaxURL: SourceControlURL { "https://github.com/swiftlang/swift-syntax.git" @@ -365,17 +368,20 @@ fileprivate extension PackageDependency { /// Package dependency on the swift-syntax package. static func swiftSyntax( - configuration: InstalledSwiftPMConfiguration - ) -> PackageDependency { + packagePath: AbsolutePath, + configuration: InstalledSwiftPMConfiguration + ) -> MappablePackageDependency { let swiftSyntaxVersionDefault = configuration .swiftSyntaxVersionForMacroTemplate let swiftSyntaxVersion = Version(swiftSyntaxVersionDefault.description)! - return .sourceControl( - identity: PackageIdentity(url: swiftSyntaxURL), - nameForTargetDependencyResolutionOnly: nil, - location: .remote(swiftSyntaxURL), - requirement: .range(.upToNextMajor(from: swiftSyntaxVersion)), + return .init( + parentPackagePath: packagePath, + kind: .sourceControl( + name: nil, + location: swiftSyntaxURL.absoluteString, + requirement: .range(.upToNextMajor(from: swiftSyntaxVersion)) + ), productFilter: .everything, traits: [] ) @@ -390,7 +396,7 @@ fileprivate let swiftTestingTestTargetDependencies: [TargetDescription.Dependenc /// The package dependency for swift-testing, for use in test files. -fileprivate extension PackageDependency { +fileprivate extension MappablePackageDependency { /// Source control URL for the swift-syntax package. static var swiftTestingURL: SourceControlURL { "https://github.com/apple/swift-testing.git" @@ -398,17 +404,20 @@ fileprivate extension PackageDependency { /// Package dependency on the swift-testing package. static func swiftTesting( + packagePath: AbsolutePath, configuration: InstalledSwiftPMConfiguration - ) -> PackageDependency { + ) -> MappablePackageDependency { let swiftTestingVersionDefault = configuration.swiftTestingVersionForTestTemplate let swiftTestingVersion = Version(swiftTestingVersionDefault.description)! - return .sourceControl( - identity: PackageIdentity(url: swiftTestingURL), - nameForTargetDependencyResolutionOnly: nil, - location: .remote(swiftTestingURL), - requirement: .range(.upToNextMajor(from: swiftTestingVersion)), + return .init( + parentPackagePath: packagePath, + kind: .sourceControl( + name: nil, + location: swiftTestingURL.absoluteString, + requirement: .range(.upToNextMajor(from: swiftTestingVersion)) + ), productFilter: .everything, traits: [] ) diff --git a/Sources/PackageModelSyntax/PackageDependency+Syntax.swift b/Sources/PackageModelSyntax/MappablePackageDependency+Syntax.swift similarity index 76% rename from Sources/PackageModelSyntax/PackageDependency+Syntax.swift rename to Sources/PackageModelSyntax/MappablePackageDependency+Syntax.swift index 20a62a9f1dd..92439db6f49 100644 --- a/Sources/PackageModelSyntax/PackageDependency+Syntax.swift +++ b/Sources/PackageModelSyntax/MappablePackageDependency+Syntax.swift @@ -16,31 +16,15 @@ import SwiftParser import SwiftSyntax import struct TSCUtility.Version -extension PackageDependency: ManifestSyntaxRepresentable { +extension MappablePackageDependency: ManifestSyntaxRepresentable { func asSyntax() -> ExprSyntax { - switch self { - case .fileSystem(let filesystem): filesystem.asSyntax() - case .sourceControl(let sourceControl): sourceControl.asSyntax() - case .registry(let registry): registry.asSyntax() - } - } -} - -extension PackageDependency.FileSystem: ManifestSyntaxRepresentable { - func asSyntax() -> ExprSyntax { - ".package(path: \(literal: path.description))" - } -} - -extension PackageDependency.SourceControl: ManifestSyntaxRepresentable { - func asSyntax() -> ExprSyntax { - // TODO: Not handling identity, nameForTargetDependencyResolutionOnly, - // or productFilter yet. - switch location { - case .local: - fatalError() - case .remote(let url): - ".package(url: \(literal: url.description), \(requirement.asSyntax()))" + switch self.kind { + case .fileSystem(_, let path): + ".package(path: \(literal: path.description))" + case .sourceControl(_, let location, let requirement): + ".package(url: \(literal: location.description), \(requirement.asSyntax()))" + case .registry(let id, let requirement): + ".package(id: \(literal: id), \(requirement.asSyntax()))" } } } diff --git a/Tests/CommandsTests/PackageCommandTests.swift b/Tests/CommandsTests/PackageCommandTests.swift index 5206142ad28..600386ff9dc 100644 --- a/Tests/CommandsTests/PackageCommandTests.swift +++ b/Tests/CommandsTests/PackageCommandTests.swift @@ -894,7 +894,18 @@ final class PackageCommandTests: CommandsTestCase { _ = try await execute( [ "add-dependency", - "/directory", + "/absolute", + "--type", + "path" + + ], + packagePath: path + ) + + _ = try await execute( + [ + "add-dependency", + "../relative", "--type", "path" @@ -906,7 +917,8 @@ final class PackageCommandTests: CommandsTestCase { XCTAssertFileExists(manifest) let contents: String = try fs.readFileContents(manifest) - XCTAssertMatch(contents, .contains(#".package(path: "/directory"),"#)) + XCTAssertMatch(contents, .contains(#".package(path: "/absolute"),"#)) + XCTAssertMatch(contents, .contains(#".package(path: "../relative"),"#)) } } diff --git a/Tests/PackageModelSyntaxTests/ManifestEditTests.swift b/Tests/PackageModelSyntaxTests/ManifestEditTests.swift index b82be6b3c1b..03356fc793f 100644 --- a/Tests/PackageModelSyntaxTests/ManifestEditTests.swift +++ b/Tests/PackageModelSyntaxTests/ManifestEditTests.swift @@ -68,13 +68,16 @@ func assertManifestRefactor( class ManifestEditTests: XCTestCase { static let swiftSystemURL: SourceControlURL = "https://github.com/apple/swift-system.git" - static let swiftSystemPackageDependency = PackageDependency.remoteSourceControl( - identity: PackageIdentity(url: swiftSystemURL), - nameForTargetDependencyResolutionOnly: nil, - url: swiftSystemURL, - requirement: .branch("main"), productFilter: .nothing, - traits: [] - ) + static let swiftSystemPackageDependency = MappablePackageDependency.init( + parentPackagePath: .root, + kind: .sourceControl( + name: nil, + location: swiftSystemURL.absoluteString, + requirement: .branch("main") + ), + productFilter: .nothing, + traits: [] + ) func testAddPackageDependencyExistingComma() throws { try assertManifestRefactor(""" @@ -96,12 +99,15 @@ class ManifestEditTests: XCTestCase { ) """) { manifest in try AddPackageDependency.addPackageDependency( - PackageDependency.remoteSourceControl( - identity: PackageIdentity(url: Self.swiftSystemURL), - nameForTargetDependencyResolutionOnly: nil, - url: Self.swiftSystemURL, - requirement: .branch("main"), productFilter: .nothing, - traits:[] + MappablePackageDependency.init( + parentPackagePath: .root, + kind: .sourceControl( + name: nil, + location: Self.swiftSystemURL.absoluteString, + requirement: .branch("main") + ), + productFilter: .nothing, + traits: [] ), to: manifest ) @@ -128,11 +134,13 @@ class ManifestEditTests: XCTestCase { ) """) { manifest in try AddPackageDependency.addPackageDependency( - PackageDependency.remoteSourceControl( - identity: PackageIdentity(url: Self.swiftSystemURL), - nameForTargetDependencyResolutionOnly: nil, - url: Self.swiftSystemURL, - requirement: .exact("510.0.0"), + MappablePackageDependency.init( + parentPackagePath: .root, + kind: .sourceControl( + name: nil, + location: Self.swiftSystemURL.absoluteString, + requirement: .exact("510.0.0") + ), productFilter: .nothing, traits: [] ), @@ -163,11 +171,13 @@ class ManifestEditTests: XCTestCase { let versionRange = Range.upToNextMajor(from: Version(510, 0, 0)) return try AddPackageDependency.addPackageDependency( - PackageDependency.remoteSourceControl( - identity: PackageIdentity(url: Self.swiftSystemURL), - nameForTargetDependencyResolutionOnly: nil, - url: Self.swiftSystemURL, - requirement: .range(versionRange), + MappablePackageDependency.init( + parentPackagePath: .root, + kind: .sourceControl( + name: nil, + location: Self.swiftSystemURL.absoluteString, + requirement: .range(versionRange) + ), productFilter: .nothing, traits: [] ), @@ -193,11 +203,13 @@ class ManifestEditTests: XCTestCase { let versionRange = Range.upToNextMajor(from: Version(510, 0, 0)) return try AddPackageDependency.addPackageDependency( - PackageDependency.remoteSourceControl( - identity: PackageIdentity(url: Self.swiftSystemURL), - nameForTargetDependencyResolutionOnly: nil, - url: Self.swiftSystemURL, - requirement: .range(versionRange), + MappablePackageDependency.init( + parentPackagePath: .root, + kind: .sourceControl( + name: nil, + location: Self.swiftSystemURL.absoluteString, + requirement: .range(versionRange) + ), productFilter: .nothing, traits: [] ), @@ -223,11 +235,13 @@ class ManifestEditTests: XCTestCase { ) """) { manifest in try AddPackageDependency.addPackageDependency( - PackageDependency.remoteSourceControl( - identity: PackageIdentity(url: Self.swiftSystemURL), - nameForTargetDependencyResolutionOnly: nil, - url: Self.swiftSystemURL, - requirement: .range(Version(508,0,0)..