diff --git a/Sources/PackageModelSyntax/AddTarget.swift b/Sources/PackageModelSyntax/AddTarget.swift index e2f885b5da3..5a3fe79f625 100644 --- a/Sources/PackageModelSyntax/AddTarget.swift +++ b/Sources/PackageModelSyntax/AddTarget.swift @@ -217,10 +217,10 @@ public struct AddTarget { case .macro: """ \(imports) - struct \(raw: target.name): Macro { + struct \(raw: target.sanitizedName): Macro { /// TODO: Implement one or more of the protocols that inherit /// from Macro. The appropriate macro protocol is determined - /// by the "macro" declaration that \(raw: target.name) implements. + /// by the "macro" declaration that \(raw: target.sanitizedName) implements. /// Examples include: /// @freestanding(expression) macro --> ExpressionMacro /// @attached(member) macro --> MemberMacro @@ -238,8 +238,8 @@ public struct AddTarget { case .xctest: """ \(imports) - class \(raw: target.name): XCTestCase { - func test\(raw: target.name)() { + class \(raw: target.sanitizedName)Tests: XCTestCase { + func test\(raw: target.sanitizedName)() { XCTAssertEqual(42, 17 + 25) } } @@ -249,8 +249,8 @@ public struct AddTarget { """ \(imports) @Suite - struct \(raw: target.name)Tests { - @Test("\(raw: target.name) tests") + struct \(raw: target.sanitizedName)Tests { + @Test("\(raw: target.sanitizedName) tests") func example() { #expect(42 == 17 + 25) } @@ -267,7 +267,7 @@ public struct AddTarget { """ \(imports) @main - struct \(raw: target.name)Main { + struct \(raw: target.sanitizedName)Main { static func main() { print("Hello, world") } @@ -296,9 +296,9 @@ public struct AddTarget { import SwiftCompilerPlugin @main - struct \(raw: target.name)Macros: CompilerPlugin { + struct \(raw: target.sanitizedName)Macros: CompilerPlugin { let providingMacros: [Macro.Type] = [ - \(raw: target.name).self, + \(raw: target.sanitizedName).self, ] } """ @@ -364,3 +364,15 @@ fileprivate extension PackageDependency { ) } } + +fileprivate extension TargetDescription { + var sanitizedName: String { + name + .spm_mangledToC99ExtendedIdentifier() + .localizedFirstWordCapitalized() + } +} + +fileprivate extension String { + func localizedFirstWordCapitalized() -> String { prefix(1).localizedCapitalized + dropFirst() } +} diff --git a/Tests/PackageModelSyntaxTests/ManifestEditTests.swift b/Tests/PackageModelSyntaxTests/ManifestEditTests.swift index 7fb7a91988a..e868b7a06e3 100644 --- a/Tests/PackageModelSyntaxTests/ManifestEditTests.swift +++ b/Tests/PackageModelSyntaxTests/ManifestEditTests.swift @@ -468,7 +468,7 @@ class ManifestEditTests: XCTestCase { // These are the targets .target(name: "MyLib"), .executableTarget( - name: "MyProgram", + name: "MyProgram target-name", dependencies: [ .product(name: "SwiftSyntax", package: "swift-syntax"), .target(name: "TargetLib"), @@ -479,13 +479,13 @@ class ManifestEditTests: XCTestCase { ) """, expectedAuxiliarySources: [ - RelativePath("Sources/MyProgram/MyProgram.swift") : """ + RelativePath("Sources/MyProgram target-name/MyProgram target-name.swift") : """ import MyLib import SwiftSyntax import TargetLib @main - struct MyProgramMain { + struct MyProgram_target_nameMain { static func main() { print("Hello, world") } @@ -494,7 +494,7 @@ class ManifestEditTests: XCTestCase { ]) { manifest in try AddTarget.addTarget( TargetDescription( - name: "MyProgram", + name: "MyProgram target-name", dependencies: [ .product(name: "SwiftSyntax", package: "swift-syntax"), .target(name: "TargetLib", condition: nil), @@ -528,7 +528,7 @@ class ManifestEditTests: XCTestCase { ], targets: [ .macro( - name: "MyMacro", + name: "MyMacro target-name", dependencies: [ .product(name: "SwiftCompilerPlugin", package: "swift-syntax"), .product(name: "SwiftSyntaxMacros", package: "swift-syntax") @@ -538,33 +538,33 @@ class ManifestEditTests: XCTestCase { ) """, expectedAuxiliarySources: [ - RelativePath("Sources/MyMacro/MyMacro.swift") : """ + RelativePath("Sources/MyMacro target-name/MyMacro target-name.swift") : """ import SwiftCompilerPlugin import SwiftSyntaxMacros - struct MyMacro: Macro { + struct MyMacro_target_name: Macro { /// TODO: Implement one or more of the protocols that inherit /// from Macro. The appropriate macro protocol is determined - /// by the "macro" declaration that MyMacro implements. + /// by the "macro" declaration that MyMacro_target_name implements. /// Examples include: /// @freestanding(expression) macro --> ExpressionMacro /// @attached(member) macro --> MemberMacro } """, - RelativePath("Sources/MyMacro/ProvidedMacros.swift") : """ + RelativePath("Sources/MyMacro target-name/ProvidedMacros.swift") : """ import SwiftCompilerPlugin @main - struct MyMacroMacros: CompilerPlugin { + struct MyMacro_target_nameMacros: CompilerPlugin { let providingMacros: [Macro.Type] = [ - MyMacro.self, + MyMacro_target_name.self, ] } """ ] ) { manifest in try AddTarget.addTarget( - TargetDescription(name: "MyMacro", type: .macro), + TargetDescription(name: "MyMacro target-name", type: .macro), to: manifest ) } @@ -582,17 +582,17 @@ class ManifestEditTests: XCTestCase { let package = Package( name: "packages", targets: [ - .testTarget(name: "MyTest"), + .testTarget(name: "MyTest target-name"), ] ) """, expectedAuxiliarySources: [ - RelativePath("Tests/MyTest/MyTest.swift") : """ + RelativePath("Tests/MyTest target-name/MyTest target-name.swift") : """ import Testing @Suite - struct MyTestTests { - @Test("MyTest tests") + struct MyTest_target_nameTests { + @Test("MyTest_target_name tests") func example() { #expect(42 == 17 + 25) } @@ -601,7 +601,7 @@ class ManifestEditTests: XCTestCase { ]) { manifest in try AddTarget.addTarget( TargetDescription( - name: "MyTest", + name: "MyTest target-name", type: .test ), to: manifest,