Skip to content

Commit 4e7192d

Browse files
committed
[PackageLoading] Lift no modules error up a level.
- There is nothing malformed about a package with no modules, it just happens we have a policy that makes it an error for non-root packages. That is better enforced at a level above the package loading.
1 parent f35cff8 commit 4e7192d

File tree

2 files changed

+26
-14
lines changed

2 files changed

+26
-14
lines changed

Sources/PackageGraph/PackageGraphLoader.swift

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,29 @@ import PackageLoading
1717
import func POSIX.exit
1818

1919
enum PackageGraphError: Swift.Error {
20+
/// Indicates two modules with the same name.
2021
case duplicateModule(String)
22+
23+
/// Indicates a non-root package with no modules.
24+
case noModules(Package)
2125
}
2226

2327
extension PackageGraphError: FixableError {
2428
var error: String {
2529
switch self {
2630
case .duplicateModule(let name):
2731
return "multiple modules with the name \(name) found"
32+
case .noModules(let package):
33+
return "the package \(package) contains no modules"
2834
}
2935
}
3036

3137
var fix: String? {
3238
switch self {
3339
case .duplicateModule(_):
3440
return "modules should have a unique name across dependencies"
41+
case .noModules(_):
42+
return "create at least one module"
3543
}
3644
}
3745
}
@@ -70,14 +78,21 @@ public struct PackageGraphLoader {
7078
let isRootPackage = (i + 1) == allManifests.count
7179
packages.append(package)
7280

73-
var modules: [Module]
74-
do {
75-
modules = try package.modules()
76-
} catch ModuleError.noModules(let pkg) where isRootPackage {
77-
// Ignore and print warning if root package doesn't contain any sources.
78-
print("warning: root package '\(pkg)' does not contain any sources")
79-
if allManifests.count == 1 { exit(0) } //Exit now if there is no more packages
80-
modules = []
81+
let modules: [Module] = try package.modules()
82+
83+
// Diagnose empty non-root packages, which are something we allow as a special case.
84+
if modules.isEmpty {
85+
if isRootPackage {
86+
// Ignore and print warning if root package doesn't contain any sources.
87+
print("warning: root package '\(package)' does not contain any sources")
88+
89+
// Exit now if there are no more packages.
90+
//
91+
// FIXME: This does not belong here.
92+
if allManifests.count == 1 { exit(0) }
93+
} else {
94+
throw PackageGraphError.noModules(package)
95+
}
8196
}
8297

8398
// TODO: Allow testing of external package tests.

Sources/PackageLoading/PackageExtensions.swift

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import Utility
1515
import class PackageDescription.Target
1616

1717
public enum ModuleError: Swift.Error {
18-
case noModules(Package)
1918
case modulesNotFound([String])
2019
case invalidLayout(InvalidLayoutType)
2120
case executableAsDependency(module: String, dependency: String)
@@ -29,8 +28,6 @@ public enum InvalidLayoutType {
2928
extension ModuleError: FixableError {
3029
public var error: String {
3130
switch self {
32-
case .noModules(let package):
33-
return "the package \(package) contains no modules"
3431
case .modulesNotFound(let modules):
3532
return "these referenced modules could not be found: " + modules.joined(separator: ", ")
3633
case .invalidLayout(let type):
@@ -42,8 +39,6 @@ extension ModuleError: FixableError {
4239

4340
public var fix: String? {
4441
switch self {
45-
case .noModules(_):
46-
return "create at least one module"
4742
case .modulesNotFound(_):
4843
return "reference only valid modules"
4944
case .invalidLayout(let type):
@@ -186,10 +181,12 @@ extension Package {
186181

187182
let modules: [Module]
188183
if maybeModules.isEmpty {
184+
// If there are no sources subdirectories, we have at most a one target package.
189185
do {
190186
modules = [try modulify(srcroot, name: self.name, isTest: false)]
191187
} catch Module.Error.noSources {
192-
throw ModuleError.noModules(self)
188+
// Completely empty packages are allowed as a special case.
189+
modules = []
193190
}
194191
} else {
195192
modules = try maybeModules.map { path in

0 commit comments

Comments
 (0)