@@ -6,12 +6,15 @@ package software.amazon.smithy.swift.codegen
66
77import software.amazon.smithy.codegen.core.SymbolDependency
88import software.amazon.smithy.swift.codegen.integration.ProtocolGenerator
9+ import kotlin.jvm.optionals.getOrNull
10+
11+ val PACKAGE_MANIFEST_NAME = " Package.swift.txt"
912
1013class PackageManifestGenerator (val ctx : ProtocolGenerator .GenerationContext ) {
1114
1215 fun writePackageManifest (dependencies : List <SymbolDependency >) {
13- ctx.delegator.useFileWriter(" Package.swift " ) { writer ->
14- writer.write(" // swift-tools-version:\$ L" , ctx.settings.swiftVersion)
16+ ctx.delegator.useFileWriter(PACKAGE_MANIFEST_NAME ) { writer ->
17+ writer.write(" // swift-tools-version: \$ L" , ctx.settings.swiftVersion)
1518 writer.write(" " )
1619 writer.write(" import PackageDescription" )
1720 writer.write(" " )
@@ -27,49 +30,64 @@ class PackageManifestGenerator(val ctx: ProtocolGenerator.GenerationContext) {
2730 writer.write(" .library(name: \$ S, targets: [\$ S])" , ctx.settings.moduleName, ctx.settings.moduleName)
2831 }
2932
30- val externalDependencies = dependencies.filter { it.getProperty(" url" , String ::class .java).get().isNotEmpty() }
31- val dependenciesByURL = externalDependencies.distinctBy { it.expectProperty(" url" , String ::class .java) }
33+ val externalDependencies = dependencies.filter {
34+ it.getProperty(" url" , String ::class .java).getOrNull() != null ||
35+ it.getProperty(" scope" , String ::class .java).getOrNull() != null
36+ }
37+ val dependenciesByURL = externalDependencies.distinctBy {
38+ it.getProperty(" url" , String ::class .java).getOrNull()
39+ ? : " ${it.getProperty(" scope" , String ::class .java).get()} .${it.packageName} "
40+ }
3241
3342 writer.openBlock(" dependencies: [" , " ]," ) {
34- dependenciesByURL.forEach { dependency ->
35- writer.openBlock(" .package(" , " )," ) {
36-
37- val localPath = dependency.expectProperty(" localPath" , String ::class .java)
38- if (localPath.isNotEmpty()) {
39- writer.write(" path: \$ S" , localPath)
40- } else {
41- val dependencyURL = dependency.expectProperty(" url" , String ::class .java)
42- writer.write(" url: \$ S," , dependencyURL)
43- writer.write(" from: \$ S" , dependency.version)
44- }
45- }
46- }
43+ dependenciesByURL.forEach { writePackageDependency(writer, it) }
4744 }
4845
4946 val dependenciesByTarget = externalDependencies.distinctBy { it.expectProperty(" target" , String ::class .java) + it.packageName }
5047
5148 writer.openBlock(" targets: [" , " ]" ) {
5249 writer.openBlock(" .target(" , " )," ) {
5350 writer.write(" name: \$ S," , ctx.settings.moduleName)
54- writer.openBlock(" dependencies: [" , " ]" ) {
55- for (dependency in dependenciesByTarget) {
56- writer.openBlock(" .product(" , " )," ) {
57- val target = dependency.expectProperty(" target" , String ::class .java)
58- writer.write(" name: \$ S," , target)
59- writer.write(" package: \$ S" , dependency.packageName)
60- }
61- }
51+ writer.openBlock(" dependencies: [" , " ]," ) {
52+ dependenciesByTarget.forEach { writeTargetDependency(writer, it) }
53+ }
54+ writer.openBlock(" resources: [" , " ]" ) {
55+ writer.write(" .process(\" Resources\" )" )
6256 }
6357 }
6458 writer.openBlock(" .testTarget(" , " )" ) {
6559 writer.write(" name: \$ S," , ctx.settings.testModuleName)
6660 writer.openBlock(" dependencies: [" , " ]" ) {
6761 writer.write(" \$ S," , ctx.settings.moduleName)
68- writer.write( " .product(name: \" SmithyTestUtil \" , package: \" smithy-swift \" ), " )
62+ SwiftDependency . SMITHY_TEST_UTIL .dependencies.forEach { writeTargetDependency(writer, it) }
6963 }
7064 }
7165 }
7266 }
7367 }
7468 }
69+
70+ private fun writePackageDependency (writer : SwiftWriter , dependency : SymbolDependency ) {
71+ writer.openBlock(" .package(" , " )," ) {
72+ val scope = dependency.getProperty(" scope" , String ::class .java).getOrNull()
73+ scope?.let {
74+ writer.write(" id: \$ S," , " $it .${dependency.packageName} " )
75+ }
76+ val url = dependency.getProperty(" url" , String ::class .java).getOrNull()
77+ url?.let {
78+ writer.write(" url: \$ S," , it)
79+ }
80+ writer.write(" from: \$ S" , dependency.version)
81+ }
82+ }
83+
84+ private fun writeTargetDependency (writer : SwiftWriter , dependency : SymbolDependency ) {
85+ writer.openBlock(" .product(" , " )," ) {
86+ val target = dependency.expectProperty(" target" , String ::class .java)
87+ writer.write(" name: \$ S," , target)
88+ val scope = dependency.getProperty(" scope" , String ::class .java).getOrNull()
89+ val packageName = scope?.let { " $it .${dependency.packageName} " } ? : dependency.packageName
90+ writer.write(" package: \$ S" , packageName)
91+ }
92+ }
7593}
0 commit comments