From 7b2de8f4e961b39105d82f15f164f8cd415a9fbd Mon Sep 17 00:00:00 2001 From: Chris McGee Date: Fri, 15 May 2026 13:35:15 -0400 Subject: [PATCH] Use: improve error message when .swift-version toolchain is missing When a swift version file references an uninstalled toolchain, the error now suggests a compatible installed version (same major.minor) as a concrete `swiftly use` command, rather than a generic placeholder. Also clarifies the message to distinguish "not installed" from "doesn't match". --- Sources/Swiftly/Use.swift | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Sources/Swiftly/Use.swift b/Sources/Swiftly/Use.swift index 1462c974..6715a059 100644 --- a/Sources/Swiftly/Use.swift +++ b/Sources/Swiftly/Use.swift @@ -257,7 +257,16 @@ public func selectToolchain(_ ctx: SwiftlyCoreContext, config: inout Config, glo } guard let selectedToolchain = config.listInstalledToolchains(selector: selector).max() else { - return (nil, .swiftVersionFile(svFile, selector, SwiftlyError(message: "The swift version file `\(svFile)` uses toolchain version \(selector), but it doesn't match any of the installed toolchains. You can install the toolchain with `swiftly install`."))) + let useSuggestion: String + if case let .stable(major, minor?, _) = selector, + let compatible = config.listInstalledToolchains(selector: ToolchainSelector(major: major, minor: minor)).max(), + case let .stable(release) = compatible + { + useSuggestion = "`swiftly use \(release.major).\(release.minor).\(release.patch)`" + } else { + useSuggestion = "`swiftly use `" + } + return (nil, .swiftVersionFile(svFile, selector, SwiftlyError(message: "The swift version file `\(svFile)` requires toolchain version \(selector), which is not installed. You can install it with `swiftly install`, or switch to a different installed toolchain with \(useSuggestion)."))) } return (selectedToolchain, .swiftVersionFile(svFile, selector, nil))