From 917c44916d2c1b23dfa154a62074f87636dcc022 Mon Sep 17 00:00:00 2001 From: Artem Chikin Date: Fri, 22 Sep 2023 11:47:48 -0700 Subject: [PATCH] Remove more appearences of deprecated 'AbsolutePath' and 'RelativePath' intitializers in source and tests --- Sources/SwiftDriver/Driver/Driver.swift | 8 +- .../SwiftDriver/Driver/OutputFileMap.swift | 2 +- .../ExplicitDependencyBuildPlanner.swift | 8 +- .../ModuleDependencyScanning.swift | 8 +- .../SwiftDriver/Jobs/AutolinkExtractJob.swift | 4 +- Sources/SwiftDriver/Jobs/CompileJob.swift | 16 +- .../Jobs/DarwinToolchain+LinkerSupport.swift | 30 +- .../Jobs/EmitSupportedFeaturesJob.swift | 4 +- .../SwiftDriver/Jobs/FrontendJobHelpers.swift | 8 +- Sources/SwiftDriver/Jobs/GeneratePCHJob.swift | 4 +- Sources/SwiftDriver/Jobs/LinkJob.swift | 12 +- Sources/SwiftDriver/Jobs/MergeModuleJob.swift | 4 +- .../SwiftDriver/Jobs/PrebuiltModulesJob.swift | 27 +- .../SwiftDriver/Utilities/VirtualPath.swift | 38 +- Tests/IncrementalTestFramework/Source.swift | 6 +- Tests/SwiftDriverTests/APIDigesterTests.swift | 48 +- .../ExplicitModuleBuildTests.swift | 40 +- .../IncrementalCompilationTests.swift | 4 +- Tests/SwiftDriverTests/JobExecutorTests.swift | 123 +++-- .../ModuleDependencyGraphTests.swift | 2 +- .../NonincrementalCompilationTests.swift | 6 +- Tests/SwiftDriverTests/SwiftDriverTests.swift | 473 +++++++++--------- Tests/TestUtilities/Fixture.swift | 10 +- 23 files changed, 446 insertions(+), 439 deletions(-) diff --git a/Sources/SwiftDriver/Driver/Driver.swift b/Sources/SwiftDriver/Driver/Driver.swift index 87e969782..8f59e4b0e 100644 --- a/Sources/SwiftDriver/Driver/Driver.swift +++ b/Sources/SwiftDriver/Driver/Driver.swift @@ -677,8 +677,8 @@ public struct Driver { self.shouldUseInputFileList = inputFiles.count > fileListThreshold if shouldUseInputFileList { let swiftInputs = inputFiles.filter(\.type.isPartOfSwiftCompilation) - self.allSourcesFileList = VirtualPath.createUniqueFilelist(RelativePath("sources"), - .list(swiftInputs.map(\.file))) + self.allSourcesFileList = try VirtualPath.createUniqueFilelist(RelativePath(validating: "sources"), + .list(swiftInputs.map(\.file))) } else { self.allSourcesFileList = nil } @@ -2556,7 +2556,7 @@ extension Driver { moduleOutputPath = try .init(path: moduleFilename) } } else { - moduleOutputPath = VirtualPath.createUniqueTemporaryFile(RelativePath(moduleName.appendingFileTypeExtension(.swiftModule))) + moduleOutputPath = try VirtualPath.createUniqueTemporaryFile(RelativePath(validating: moduleName.appendingFileTypeExtension(.swiftModule))) } // Use working directory if specified @@ -2759,7 +2759,7 @@ extension Driver { if let outputDirectory = parsedOptions.getLastArgument(.pchOutputDir)?.asSingle { return try VirtualPath(path: outputDirectory).appending(component: pchFileName).intern() } else { - return VirtualPath.createUniqueTemporaryFile(RelativePath(pchFileName)).intern() + return try VirtualPath.createUniqueTemporaryFile(RelativePath(validating: pchFileName)).intern() } } } diff --git a/Sources/SwiftDriver/Driver/OutputFileMap.swift b/Sources/SwiftDriver/Driver/OutputFileMap.swift index fd653cba7..e07e26fd5 100644 --- a/Sources/SwiftDriver/Driver/OutputFileMap.swift +++ b/Sources/SwiftDriver/Driver/OutputFileMap.swift @@ -47,7 +47,7 @@ public struct OutputFileMap: Hashable, Codable { } // Form the virtual path. - return VirtualPath.createUniqueTemporaryFile(RelativePath(inputFile.basenameWithoutExt.appendingFileTypeExtension(outputType))).intern() + return try VirtualPath.createUniqueTemporaryFile(RelativePath(validating: inputFile.basenameWithoutExt.appendingFileTypeExtension(outputType))).intern() } public func existingOutput(inputFile: VirtualPath.Handle, outputType: FileType) throws -> VirtualPath.Handle? { diff --git a/Sources/SwiftDriver/ExplicitModuleBuilds/ExplicitDependencyBuildPlanner.swift b/Sources/SwiftDriver/ExplicitModuleBuilds/ExplicitDependencyBuildPlanner.swift index 3b4b1fcf7..1e1728289 100644 --- a/Sources/SwiftDriver/ExplicitModuleBuilds/ExplicitDependencyBuildPlanner.swift +++ b/Sources/SwiftDriver/ExplicitModuleBuilds/ExplicitDependencyBuildPlanner.swift @@ -285,8 +285,8 @@ public typealias ExternalTargetModuleDetailsMap = [ModuleDependencyId: ExternalT } else { // Write JSON to a file and add the JSON artifacts to command-line and inputs. let dependencyFile = - VirtualPath.createUniqueTemporaryFileWithKnownContents(.init("\(moduleId.moduleName)-dependencies.json"), - dependencyFileContent) + try VirtualPath.createUniqueTemporaryFileWithKnownContents(.init(validating: "\(moduleId.moduleName)-dependencies.json"), + dependencyFileContent) commandLine.appendFlag("-explicit-swift-module-map-file") commandLine.appendPath(dependencyFile) inputs.append(TypedVirtualPath(file: dependencyFile.intern(), @@ -457,8 +457,8 @@ public typealias ExternalTargetModuleDetailsMap = [ModuleDependencyId: ExternalT clangDependencyArtifacts: clangDependencyArtifacts) let dependencyFile = - VirtualPath.createUniqueTemporaryFileWithKnownContents(.init("\(mainModuleId.moduleName)-dependencies.json"), - dependencyFileContent) + try VirtualPath.createUniqueTemporaryFileWithKnownContents(.init(validating: "\(mainModuleId.moduleName)-dependencies.json"), + dependencyFileContent) commandLine.appendFlag("-explicit-swift-module-map-file") commandLine.appendPath(dependencyFile) inputs.append(TypedVirtualPath(file: dependencyFile.intern(), diff --git a/Sources/SwiftDriver/ExplicitModuleBuilds/ModuleDependencyScanning.swift b/Sources/SwiftDriver/ExplicitModuleBuilds/ModuleDependencyScanning.swift index 82008bf91..c0af39cb5 100644 --- a/Sources/SwiftDriver/ExplicitModuleBuilds/ModuleDependencyScanning.swift +++ b/Sources/SwiftDriver/ExplicitModuleBuilds/ModuleDependencyScanning.swift @@ -143,8 +143,8 @@ public extension Driver { let encoder = JSONEncoder() encoder.outputFormatting = [.prettyPrinted] let contents = try encoder.encode(placeholderArtifacts) - return VirtualPath.createUniqueTemporaryFileWithKnownContents(.init("\(moduleOutputInfo.name)-external-modules.json"), - contents) + return try VirtualPath.createUniqueTemporaryFileWithKnownContents(.init(validating: "\(moduleOutputInfo.name)-external-modules.json"), + contents) } /// Returns false if the lib is available and ready to use @@ -418,8 +418,8 @@ public extension Driver { let encoder = JSONEncoder() encoder.outputFormatting = [.prettyPrinted] let contents = try encoder.encode(moduleInfos) - return VirtualPath.createUniqueTemporaryFileWithKnownContents(.init("\(moduleOutputInfo.name)-batch-module-scan.json"), - contents) + return try VirtualPath.createUniqueTemporaryFileWithKnownContents(.init(validating: "\(moduleOutputInfo.name)-batch-module-scan.json"), + contents) } static func itemizedJobCommand(of job: Job, useResponseFiles: ResponseFileHandling, diff --git a/Sources/SwiftDriver/Jobs/AutolinkExtractJob.swift b/Sources/SwiftDriver/Jobs/AutolinkExtractJob.swift index d1cd15bc3..aa47fd95f 100644 --- a/Sources/SwiftDriver/Jobs/AutolinkExtractJob.swift +++ b/Sources/SwiftDriver/Jobs/AutolinkExtractJob.swift @@ -33,8 +33,8 @@ extension Driver { let dir = firstInput.file.parentDirectory // Go through a bit of extra rigmarole to keep the "./" out of the name for // the sake of the tests. - let output: VirtualPath = dir == .temporary(RelativePath(".")) - ? VirtualPath.createUniqueTemporaryFile(RelativePath(outputBasename)) + let output: VirtualPath = dir == .temporary(try RelativePath(validating: ".")) + ? try VirtualPath.createUniqueTemporaryFile(RelativePath(validating: outputBasename)) : dir.appending(component: outputBasename) commandLine.append(contentsOf: inputs.map { .path($0.file) }) diff --git a/Sources/SwiftDriver/Jobs/CompileJob.swift b/Sources/SwiftDriver/Jobs/CompileJob.swift index dd9a7e378..765d079c6 100644 --- a/Sources/SwiftDriver/Jobs/CompileJob.swift +++ b/Sources/SwiftDriver/Jobs/CompileJob.swift @@ -66,10 +66,10 @@ extension Driver { } if !isTopLevel { - return TypedVirtualPath(file: VirtualPath.createUniqueTemporaryFile(.init(baseName.appendingFileTypeExtension(outputType))).intern(), + return TypedVirtualPath(file: try VirtualPath.createUniqueTemporaryFile(.init(validating: baseName.appendingFileTypeExtension(outputType))).intern(), type: outputType) } - return TypedVirtualPath(file: try useWorkingDirectory(.init(baseName.appendingFileTypeExtension(outputType))).intern(), type: outputType) + return TypedVirtualPath(file: try useWorkingDirectory(try .init(validating: baseName.appendingFileTypeExtension(outputType))).intern(), type: outputType) } /// Is this compile job top-level @@ -125,8 +125,8 @@ extension Driver { if usePrimaryInputFileList { // primary file list commandLine.appendFlag(.primaryFilelist) - let fileList = VirtualPath.createUniqueFilelist(RelativePath("primaryInputs"), - .list(primaryInputs.map(\.file))) + let fileList = try VirtualPath.createUniqueFilelist(RelativePath(validating: "primaryInputs"), + .list(primaryInputs.map(\.file))) commandLine.appendPath(fileList) } @@ -311,8 +311,8 @@ extension Driver { // Add primary outputs. if primaryOutputs.count > fileListThreshold { commandLine.appendFlag(.outputFilelist) - let fileList = VirtualPath.createUniqueFilelist(RelativePath("outputs"), - .list(primaryOutputs.map { $0.file })) + let fileList = try VirtualPath.createUniqueFilelist(RelativePath(validating: "outputs"), + .list(primaryOutputs.map { $0.file })) commandLine.appendPath(fileList) } else { for primaryOutput in primaryOutputs { @@ -325,8 +325,8 @@ extension Driver { if !primaryIndexUnitOutputs.isEmpty { if primaryIndexUnitOutputs.count > fileListThreshold { commandLine.appendFlag(.indexUnitOutputPathFilelist) - let fileList = VirtualPath.createUniqueFilelist(RelativePath("index-unit-outputs"), - .list(primaryIndexUnitOutputs.map { $0.file })) + let fileList = try VirtualPath.createUniqueFilelist(RelativePath(validating: "index-unit-outputs"), + .list(primaryIndexUnitOutputs.map { $0.file })) commandLine.appendPath(fileList) } else { for primaryIndexUnitOutput in primaryIndexUnitOutputs { diff --git a/Sources/SwiftDriver/Jobs/DarwinToolchain+LinkerSupport.swift b/Sources/SwiftDriver/Jobs/DarwinToolchain+LinkerSupport.swift index 7068d6e00..4b6aff91b 100644 --- a/Sources/SwiftDriver/Jobs/DarwinToolchain+LinkerSupport.swift +++ b/Sources/SwiftDriver/Jobs/DarwinToolchain+LinkerSupport.swift @@ -68,10 +68,10 @@ extension DarwinToolchain { // Same as an executable, but with the -dylib flag linkerTool = .dynamicLinker commandLine.appendFlag("-dynamiclib") - addLinkInputs(shouldUseInputFileList: shouldUseInputFileList, - commandLine: &commandLine, - inputs: inputs, - linkerOutputType: linkerOutputType) + try addLinkInputs(shouldUseInputFileList: shouldUseInputFileList, + commandLine: &commandLine, + inputs: inputs, + linkerOutputType: linkerOutputType) try addDynamicLinkerFlags(targetInfo: targetInfo, parsedOptions: &parsedOptions, commandLine: &commandLine, @@ -81,10 +81,10 @@ extension DarwinToolchain { case .executable: linkerTool = .dynamicLinker - addLinkInputs(shouldUseInputFileList: shouldUseInputFileList, - commandLine: &commandLine, - inputs: inputs, - linkerOutputType: linkerOutputType) + try addLinkInputs(shouldUseInputFileList: shouldUseInputFileList, + commandLine: &commandLine, + inputs: inputs, + linkerOutputType: linkerOutputType) try addDynamicLinkerFlags(targetInfo: targetInfo, parsedOptions: &parsedOptions, commandLine: &commandLine, @@ -95,10 +95,10 @@ extension DarwinToolchain { case .staticLibrary: linkerTool = .staticLinker(lto) commandLine.appendFlag(.static) - addLinkInputs(shouldUseInputFileList: shouldUseInputFileList, - commandLine: &commandLine, - inputs: inputs, - linkerOutputType: linkerOutputType) + try addLinkInputs(shouldUseInputFileList: shouldUseInputFileList, + commandLine: &commandLine, + inputs: inputs, + linkerOutputType: linkerOutputType) } // Add the output @@ -111,7 +111,7 @@ extension DarwinToolchain { private func addLinkInputs(shouldUseInputFileList: Bool, commandLine: inout [Job.ArgTemplate], inputs: [TypedVirtualPath], - linkerOutputType: LinkOutputType) { + linkerOutputType: LinkOutputType) throws { // inputs LinkFileList if shouldUseInputFileList { commandLine.appendFlag(.filelist) @@ -129,8 +129,8 @@ extension DarwinToolchain { inputPaths.append(input.file) } } - let fileList = VirtualPath.createUniqueFilelist(RelativePath("inputs.LinkFileList"), - .list(inputPaths)) + let fileList = try VirtualPath.createUniqueFilelist(RelativePath(validating: "inputs.LinkFileList"), + .list(inputPaths)) commandLine.appendPath(fileList) if linkerOutputType != .staticLibrary { for module in inputModules { diff --git a/Sources/SwiftDriver/Jobs/EmitSupportedFeaturesJob.swift b/Sources/SwiftDriver/Jobs/EmitSupportedFeaturesJob.swift index 4e02b7567..092b5b1b0 100644 --- a/Sources/SwiftDriver/Jobs/EmitSupportedFeaturesJob.swift +++ b/Sources/SwiftDriver/Jobs/EmitSupportedFeaturesJob.swift @@ -37,8 +37,8 @@ extension Toolchain { // at least one so we fake it. // FIXME: Teach -emit-supported-features to not expect any inputs, like -print-target-info does. let dummyInputPath = - VirtualPath.createUniqueTemporaryFileWithKnownContents(.init("dummyInput.swift"), - "".data(using: .utf8)!) + try VirtualPath.createUniqueTemporaryFileWithKnownContents(.init(validating: "dummyInput.swift"), + "".data(using: .utf8)!) commandLine.appendPath(dummyInputPath) inputs.append(TypedVirtualPath(file: dummyInputPath.intern(), type: .swift)) diff --git a/Sources/SwiftDriver/Jobs/FrontendJobHelpers.swift b/Sources/SwiftDriver/Jobs/FrontendJobHelpers.swift index 9d8eeff53..74b7b60e9 100644 --- a/Sources/SwiftDriver/Jobs/FrontendJobHelpers.swift +++ b/Sources/SwiftDriver/Jobs/FrontendJobHelpers.swift @@ -464,7 +464,7 @@ extension Driver { // Alongside primary output outputPath = try output.file.replacingExtension(with: outputType).intern() } else { - outputPath = VirtualPath.createUniqueTemporaryFile(RelativePath(input.file.basenameWithoutExt.appendingFileTypeExtension(outputType))).intern() + outputPath = try VirtualPath.createUniqueTemporaryFile(RelativePath(validating: input.file.basenameWithoutExt.appendingFileTypeExtension(outputType))).intern() } // Update the input-output file map. @@ -591,7 +591,7 @@ extension Driver { remapOutputPath = try output.file.replacingExtension(with: .remap) } else { remapOutputPath = - VirtualPath.createUniqueTemporaryFile(RelativePath(input.file.basenameWithoutExt.appendingFileTypeExtension(.remap))) + try VirtualPath.createUniqueTemporaryFile(RelativePath(validating: input.file.basenameWithoutExt.appendingFileTypeExtension(.remap))) } flaggedInputOutputPairs.append((flag: "-emit-remap-file-path", @@ -636,8 +636,8 @@ extension Driver { entries[indexFilePath.fileHandle] = [.indexData: idxOutput.fileHandle] } let outputFileMap = OutputFileMap(entries: entries) - let fileList = VirtualPath.createUniqueFilelist(RelativePath("supplementaryOutputs"), - .outputFileMap(outputFileMap)) + let fileList = try VirtualPath.createUniqueFilelist(RelativePath(validating: "supplementaryOutputs"), + .outputFileMap(outputFileMap)) commandLine.appendFlag(.supplementaryOutputFileMap) commandLine.appendPath(fileList) } else { diff --git a/Sources/SwiftDriver/Jobs/GeneratePCHJob.swift b/Sources/SwiftDriver/Jobs/GeneratePCHJob.swift index 5a4e8fd8b..628b6d9ed 100644 --- a/Sources/SwiftDriver/Jobs/GeneratePCHJob.swift +++ b/Sources/SwiftDriver/Jobs/GeneratePCHJob.swift @@ -49,8 +49,8 @@ extension Driver { path = try VirtualPath(path: outputDirectory).appending(component: outputName.appendingFileTypeExtension(.diagnostics)) } else { path = - VirtualPath.createUniqueTemporaryFile( - RelativePath(input.file.basenameWithoutExt.appendingFileTypeExtension(.diagnostics))) + try VirtualPath.createUniqueTemporaryFile( + RelativePath(validating: input.file.basenameWithoutExt.appendingFileTypeExtension(.diagnostics))) } commandLine.appendPath(path) outputs.append(.init(file: path.intern(), type: .diagnostics)) diff --git a/Sources/SwiftDriver/Jobs/LinkJob.swift b/Sources/SwiftDriver/Jobs/LinkJob.swift index 956d4e0bd..b5efd0df2 100644 --- a/Sources/SwiftDriver/Jobs/LinkJob.swift +++ b/Sources/SwiftDriver/Jobs/LinkJob.swift @@ -15,14 +15,16 @@ import struct TSCBasic.RelativePath extension Driver { internal var relativeOutputFileForImage: RelativePath { - if inputFiles.count == 1 && moduleOutputInfo.nameIsFallback && inputFiles[0].file != .standardInput { - return RelativePath(inputFiles[0].file.basenameWithoutExt) - } + get throws { + if inputFiles.count == 1 && moduleOutputInfo.nameIsFallback && inputFiles[0].file != .standardInput { + return try RelativePath(validating: inputFiles[0].file.basenameWithoutExt) + } - let outputName = + let outputName = toolchain.makeLinkerOutputFilename(moduleName: moduleOutputInfo.name, type: linkerOutputType!) - return RelativePath(outputName) + return try RelativePath(validating: outputName) + } } /// Compute the output file for an image output. diff --git a/Sources/SwiftDriver/Jobs/MergeModuleJob.swift b/Sources/SwiftDriver/Jobs/MergeModuleJob.swift index 5fe19de30..49f8d37f6 100644 --- a/Sources/SwiftDriver/Jobs/MergeModuleJob.swift +++ b/Sources/SwiftDriver/Jobs/MergeModuleJob.swift @@ -26,8 +26,8 @@ extension Driver { // Input file list. if shouldUseInputFileList { commandLine.appendFlag(.filelist) - let fileList = VirtualPath.createUniqueFilelist(RelativePath("inputs"), - .list(inputsFromOutputs.map { $0.file })) + let fileList = try VirtualPath.createUniqueFilelist(RelativePath(validating: "inputs"), + .list(inputsFromOutputs.map { $0.file })) commandLine.appendPath(fileList) inputs.append(contentsOf: inputsFromOutputs) diff --git a/Sources/SwiftDriver/Jobs/PrebuiltModulesJob.swift b/Sources/SwiftDriver/Jobs/PrebuiltModulesJob.swift index 39d35f1a4..cc96caa0a 100644 --- a/Sources/SwiftDriver/Jobs/PrebuiltModulesJob.swift +++ b/Sources/SwiftDriver/Jobs/PrebuiltModulesJob.swift @@ -392,12 +392,21 @@ typealias PrebuiltModuleOutput = PrebuiltModuleInput public struct SDKPrebuiltModuleInputsCollector { let sdkPath: AbsolutePath - let nonFrameworkDirs = [RelativePath("usr/lib/swift"), - RelativePath("System/iOSSupport/usr/lib/swift")] - let frameworkDirs = [RelativePath("System/Library/Frameworks"), - RelativePath("System/Library/PrivateFrameworks"), - RelativePath("System/iOSSupport/System/Library/Frameworks"), - RelativePath("System/iOSSupport/System/Library/PrivateFrameworks")] + var nonFrameworkDirs: [RelativePath] { + get throws { + try [RelativePath(validating: "usr/lib/swift"), + RelativePath(validating: "System/iOSSupport/usr/lib/swift")] + } + } + var frameworkDirs: [RelativePath] { + get throws { + try [RelativePath(validating: "System/Library/Frameworks"), + RelativePath(validating: "System/Library/PrivateFrameworks"), + RelativePath(validating: "System/iOSSupport/System/Library/Frameworks"), + RelativePath(validating: "System/iOSSupport/System/Library/PrivateFrameworks")] + } + } + let sdkInfo: DarwinToolchain.DarwinSDKInfo let diagEngine: DiagnosticsEngine public init(_ sdkPath: AbsolutePath, _ diagEngine: DiagnosticsEngine) { @@ -482,7 +491,7 @@ public struct SDKPrebuiltModuleInputsCollector { allSwiftAdopters.append(try! SwiftAdopter(moduleName, dir, hasInterface, hasModule)) } // Search inside framework dirs in an SDK to find .swiftmodule directories. - for dir in frameworkDirs { + for dir in try frameworkDirs { let frameDir = AbsolutePath(sdkPath, dir) if !localFileSystem.exists(frameDir) { continue @@ -500,14 +509,14 @@ public struct SDKPrebuiltModuleInputsCollector { } } // Search inside lib dirs in an SDK to find .swiftmodule directories. - for dir in nonFrameworkDirs { + for dir in try nonFrameworkDirs { let swiftModuleDir = AbsolutePath(sdkPath, dir) if !localFileSystem.exists(swiftModuleDir) { continue } try localFileSystem.getDirectoryContents(swiftModuleDir).forEach { if $0.hasSuffix(".swiftmodule") { - try updateResults(AbsolutePath(swiftModuleDir, $0)) + try updateResults(try AbsolutePath(validating: $0, relativeTo: swiftModuleDir)) } } } diff --git a/Sources/SwiftDriver/Utilities/VirtualPath.swift b/Sources/SwiftDriver/Utilities/VirtualPath.swift index 9dbe5d036..12dda459c 100644 --- a/Sources/SwiftDriver/Utilities/VirtualPath.swift +++ b/Sources/SwiftDriver/Utilities/VirtualPath.swift @@ -146,11 +146,11 @@ public enum VirtualPath: Hashable { case .absolute(let path): return .absolute(path.parentDirectory) case .relative(let path): - return .relative(RelativePath(path.dirname)) + return .relative(try! RelativePath(validating: path.dirname)) case .temporary(let path), .temporaryWithKnownContents(let path, _): - return .temporary(RelativePath(path.dirname)) + return .temporary(try! RelativePath(validating: path.dirname)) case .fileList(let path, _): - return .temporary(RelativePath(path.dirname)) + return .temporary(try! RelativePath(validating: path.dirname)) case .standardInput, .standardOutput: assertionFailure("Can't get directory of stdin/stdout") return self @@ -204,13 +204,13 @@ public enum VirtualPath: Hashable { case let .absolute(path): return .absolute(try AbsolutePath(validating: path.pathString + suffix)) case let .relative(path): - return .relative(RelativePath(path.pathString + suffix)) + return .relative(try RelativePath(validating: path.pathString + suffix)) case let .temporary(path): - return .temporary(RelativePath(path.pathString + suffix)) + return .temporary(try RelativePath(validating: path.pathString + suffix)) case let .temporaryWithKnownContents(path, contents): - return .temporaryWithKnownContents(RelativePath(path.pathString + suffix), contents) + return .temporaryWithKnownContents(try RelativePath(validating: path.pathString + suffix), contents) case let .fileList(path, content): - return .fileList(RelativePath(path.pathString + suffix), content) + return .fileList(try RelativePath(validating: path.pathString + suffix), content) case .standardInput, .standardOutput: assertionFailure("Can't append path component to standard in/out") return self @@ -431,29 +431,29 @@ extension VirtualPath { /// Clients are still allowed to instantiate `.temporary` `VirtualPath` values directly because of our inability to specify /// enum case access control, but are discouraged from doing so. extension VirtualPath { - public static func createUniqueTemporaryFile(_ path: RelativePath) -> VirtualPath { - let uniquedRelativePath = getUniqueTemporaryPath(for: path) + public static func createUniqueTemporaryFile(_ path: RelativePath) throws -> VirtualPath { + let uniquedRelativePath = try getUniqueTemporaryPath(for: path) return .temporary(uniquedRelativePath) } public static func createUniqueTemporaryFileWithKnownContents(_ path: RelativePath, _ data: Data) - -> VirtualPath { - let uniquedRelativePath = getUniqueTemporaryPath(for: path) + throws -> VirtualPath { + let uniquedRelativePath = try getUniqueTemporaryPath(for: path) return .temporaryWithKnownContents(uniquedRelativePath, data) } public static func createUniqueFilelist(_ path: RelativePath, _ fileList: FileList) - -> VirtualPath { - let uniquedRelativePath = getUniqueTemporaryPath(for: path) + throws -> VirtualPath { + let uniquedRelativePath = try getUniqueTemporaryPath(for: path) return .fileList(uniquedRelativePath, fileList) } - private static func getUniqueTemporaryPath(for path: RelativePath) -> RelativePath { + private static func getUniqueTemporaryPath(for path: RelativePath) throws -> RelativePath { let uniquedBaseName = Self.temporaryFileStore.getUniqueFilename(for: path.basenameWithoutExt) // Avoid introducing the the leading dot let dirName = path.dirname == "." ? "" : path.dirname let fileExtension = path.extension.map { ".\($0)" } ?? "" - return RelativePath(dirName + uniquedBaseName + fileExtension) + return try RelativePath(validating: dirName + uniquedBaseName + fileExtension) } /// A cache of created temporary files @@ -649,13 +649,13 @@ extension VirtualPath { case let .absolute(path): return .absolute(try AbsolutePath(validating: path.pathString.withoutExt(path.extension).appendingFileTypeExtension(fileType))) case let .relative(path): - return .relative(RelativePath(path.pathString.withoutExt(path.extension).appendingFileTypeExtension(fileType))) + return .relative(try RelativePath(validating: path.pathString.withoutExt(path.extension).appendingFileTypeExtension(fileType))) case let .temporary(path): - return .temporary(RelativePath(path.pathString.withoutExt(path.extension).appendingFileTypeExtension(fileType))) + return .temporary(try RelativePath(validating: path.pathString.withoutExt(path.extension).appendingFileTypeExtension(fileType))) case let .temporaryWithKnownContents(path, contents): - return .temporaryWithKnownContents(RelativePath(path.pathString.withoutExt(path.extension).appendingFileTypeExtension(fileType)), contents) + return .temporaryWithKnownContents(try RelativePath(validating: path.pathString.withoutExt(path.extension).appendingFileTypeExtension(fileType)), contents) case let .fileList(path, content): - return .fileList(RelativePath(path.pathString.withoutExt(path.extension).appendingFileTypeExtension(fileType)), content) + return .fileList(try RelativePath(validating: path.pathString.withoutExt(path.extension).appendingFileTypeExtension(fileType)), content) case .standardInput, .standardOutput: return self } diff --git a/Tests/IncrementalTestFramework/Source.swift b/Tests/IncrementalTestFramework/Source.swift index 07bd0d6f7..48d25bd25 100644 --- a/Tests/IncrementalTestFramework/Source.swift +++ b/Tests/IncrementalTestFramework/Source.swift @@ -41,9 +41,9 @@ public struct Source: Hashable, Comparable { public init?(named name: String, at relativePath: RelativePath, on fileSystem: FileSystem = localFileSystem) throws { - guard let absPath = Fixture.fixturePath(at: relativePath, - for: "\(name).swift", - on: fileSystem) + guard let absPath = try Fixture.fixturePath(at: relativePath, + for: "\(name).swift", + on: fileSystem) else { return nil } diff --git a/Tests/SwiftDriverTests/APIDigesterTests.swift b/Tests/SwiftDriverTests/APIDigesterTests.swift index 1349a6166..f2bdb3821 100644 --- a/Tests/SwiftDriverTests/APIDigesterTests.swift +++ b/Tests/SwiftDriverTests/APIDigesterTests.swift @@ -48,22 +48,22 @@ class APIDigesterTests: XCTestCase { do { var driver = try Driver(args: ["swiftc", "foo.swift", "-emit-module", "-emit-digester-baseline"]) let digesterJob = try XCTUnwrap(driver.planBuild().first { $0.kind == .generateAPIBaseline }) - XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-o", .path(.relative(.init("foo.api.json")))])) + XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-o", .path(.relative(try .init(validating: "foo.api.json")))])) } do { var driver = try Driver(args: ["swiftc", "foo.swift", "-emit-module","-emit-module-interface", "-enable-library-evolution", "-emit-digester-baseline", "-digester-mode", "abi"]) let digesterJob = try XCTUnwrap(driver.planBuild().first { $0.kind == .generateABIBaseline }) - XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-o", .path(.relative(.init("foo.abi.json")))])) + XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-o", .path(.relative(try .init(validating: "foo.abi.json")))])) } do { var driver = try Driver(args: ["swiftc", "foo.swift", "-emit-module", "-emit-digester-baseline-path", "bar.api.json"]) let digesterJob = try XCTUnwrap(driver.planBuild().first { $0.kind == .generateAPIBaseline }) - XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-o", .path(.relative(.init("bar.api.json")))])) + XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-o", .path(.relative(try .init(validating: "bar.api.json")))])) } do { var driver = try Driver(args: ["swiftc", "foo.swift", "-emit-module","-emit-module-interface", "-enable-library-evolution", "-digester-mode", "abi", "-emit-digester-baseline-path", "bar.abi.json"]) let digesterJob = try XCTUnwrap(driver.planBuild().first { $0.kind == .generateABIBaseline }) - XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-o", .path(.relative(.init("bar.abi.json")))])) + XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-o", .path(.relative(try .init(validating: "bar.abi.json")))])) } do { try withTemporaryDirectory { path in @@ -112,7 +112,7 @@ class APIDigesterTests: XCTestCase { "-output-file-map", ofmPath.pathString, ]) let digesterJob = try XCTUnwrap(driver.planBuild().first { $0.kind == .generateABIBaseline }) - try XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-o", .path(.absolute(.init(validating: "/path/to/baseline.abi.json")))])) + XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-o", .path(.absolute(try .init(validating: "/path/to/baseline.abi.json")))])) } } do { @@ -136,7 +136,7 @@ class APIDigesterTests: XCTestCase { "-output-file-map", ofmPath.pathString, ]) let digesterJob = try XCTUnwrap(driver.planBuild().first { $0.kind == .generateABIBaseline }) - try XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-o", .path(.absolute(.init(validating: "/path/to/sourceinfo.abi.json")))])) + XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-o", .path(.absolute(try .init(validating: "/path/to/sourceinfo.abi.json")))])) } } } @@ -148,11 +148,11 @@ class APIDigesterTests: XCTestCase { let digesterJob = try XCTUnwrap(driver.planBuild().first { $0.kind == .generateAPIBaseline }) XCTAssertTrue(digesterJob.commandLine.contains("-dump-sdk")) XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-module", "foo"])) - XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-I", .path(.relative(.init(".")))])) - try XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-sdk", .path(.absolute(.init(validating: "/path/to/sdk")))])) - try XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-I", .path(.absolute(.init(validating: "/some/path")))])) - XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-F", .path(.relative(.init("framework/path")))])) - XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-o", .path(.relative(.init("foo.api.json")))])) + XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-I", .path(.relative(try .init(validating: ".")))])) + XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-sdk", .path(.absolute(try .init(validating: "/path/to/sdk")))])) + XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-I", .path(.absolute(try .init(validating: "/some/path")))])) + XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-F", .path(.relative(try .init(validating: "framework/path")))])) + XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-o", .path(.relative(try .init(validating: "foo.api.json")))])) XCTAssertFalse(digesterJob.commandLine.contains("-abi")) } @@ -164,11 +164,11 @@ class APIDigesterTests: XCTestCase { let digesterJob = try XCTUnwrap(driver.planBuild().first { $0.kind == .generateABIBaseline }) XCTAssertTrue(digesterJob.commandLine.contains("-dump-sdk")) XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-module", "foo"])) - XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-I", .path(.relative(.init(".")))])) - try XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-sdk", .path(.absolute(.init(validating: "/path/to/sdk")))])) - try XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-I", .path(.absolute(.init(validating: "/some/path")))])) - XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-F", .path(.relative(.init("framework/path")))])) - XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-o", .path(.relative(.init("foo.abi.json")))])) + XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-I", .path(.relative(try .init(validating: ".")))])) + XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-sdk", .path(.absolute(try .init(validating: "/path/to/sdk")))])) + XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-I", .path(.absolute(try .init(validating: "/some/path")))])) + XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-F", .path(.relative(try .init(validating: "framework/path")))])) + XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-o", .path(.relative(try .init(validating: "foo.abi.json")))])) XCTAssertTrue(digesterJob.commandLine.contains("-abi")) } @@ -238,13 +238,13 @@ class APIDigesterTests: XCTestCase { let digesterJob = try XCTUnwrap(driver.planBuild().first { $0.kind == .compareAPIBaseline }) XCTAssertTrue(digesterJob.commandLine.contains("-diagnose-sdk")) XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-module", "foo"])) - try XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-baseline-path", .path(.absolute(.init(validating: "/baseline/path")))])) - XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-I", .path(.relative(.init(".")))])) - try XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-sdk", .path(.absolute(.init(validating: "/path/to/sdk")))])) - try XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-I", .path(.absolute(.init(validating: "/some/path")))])) - XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-F", .path(.relative(.init("framework/path")))])) + XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-baseline-path", .path(.absolute(try .init(validating: "/baseline/path")))])) + XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-I", .path(.relative(try .init(validating: ".")))])) + XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-sdk", .path(.absolute(try .init(validating: "/path/to/sdk")))])) + XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-I", .path(.absolute(try .init(validating: "/some/path")))])) + XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-F", .path(.relative(try .init(validating: "framework/path")))])) XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-breakage-allowlist-path", - .path(.relative(.init("allowlist/path")))])) + .path(.relative(try .init(validating: "allowlist/path")))])) XCTAssertFalse(digesterJob.commandLine.contains("-abi")) } @@ -257,9 +257,9 @@ class APIDigesterTests: XCTestCase { "-digester-breakage-allowlist-path", "allowlist/path"]) let digesterJob = try XCTUnwrap(driver.planBuild().first { $0.kind == .compareABIBaseline }) XCTAssertTrue(digesterJob.commandLine.contains("-diagnose-sdk")) - try XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-input-paths", .path(.absolute(.init(validating: "/baseline/path")))])) + XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-input-paths", .path(.absolute(try .init(validating: "/baseline/path")))])) XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-breakage-allowlist-path", - .path(.relative(.init("allowlist/path")))])) + .path(.relative(try .init(validating: "allowlist/path")))])) XCTAssertTrue(digesterJob.commandLine.contains("-abi")) XCTAssertTrue(digesterJob.commandLine.contains("-serialize-diagnostics-path")) } diff --git a/Tests/SwiftDriverTests/ExplicitModuleBuildTests.swift b/Tests/SwiftDriverTests/ExplicitModuleBuildTests.swift index f77799d8c..8a116c11e 100644 --- a/Tests/SwiftDriverTests/ExplicitModuleBuildTests.swift +++ b/Tests/SwiftDriverTests/ExplicitModuleBuildTests.swift @@ -145,27 +145,27 @@ final class ExplicitModuleBuildTests: XCTestCase { XCTAssertFalse(driver.isExplicitMainModuleJob(job: job)) switch (job.outputs[0].file) { - case .relative(RelativePath("SwiftShims.pcm")): - try checkExplicitModuleBuildJob(job: job, - moduleId: .clang("SwiftShims"), - dependencyGraph: moduleDependencyGraph) - case .relative(RelativePath("c_simd.pcm")): + case .relative(try .init(validating: "SwiftShims.pcm")): + try checkExplicitModuleBuildJob(job: job, + moduleId: .clang("SwiftShims"), + dependencyGraph: moduleDependencyGraph) + case .relative(try .init(validating: "c_simd.pcm")): try checkExplicitModuleBuildJob(job: job, moduleId: .clang("c_simd"), dependencyGraph: moduleDependencyGraph) - case .relative(RelativePath("Swift.swiftmodule")): + case .relative(try .init(validating: "Swift.swiftmodule")): try checkExplicitModuleBuildJob(job: job, moduleId: .swift("Swift"), dependencyGraph: moduleDependencyGraph) - case .relative(RelativePath("_Concurrency.swiftmodule")): + case .relative(try .init(validating: "_Concurrency.swiftmodule")): try checkExplicitModuleBuildJob(job: job, moduleId: .swift("_Concurrency"), dependencyGraph: moduleDependencyGraph) - case .relative(RelativePath("_StringProcessing.swiftmodule")): + case .relative(try .init(validating: "_StringProcessing.swiftmodule")): try checkExplicitModuleBuildJob(job: job, moduleId: .swift("_StringProcessing"), dependencyGraph: moduleDependencyGraph) - case .relative(RelativePath("SwiftOnoneSupport.swiftmodule")): + case .relative(try .init(validating: "SwiftOnoneSupport.swiftmodule")): try checkExplicitModuleBuildJob(job: job, moduleId: .swift("SwiftOnoneSupport"), dependencyGraph: moduleDependencyGraph) @@ -179,11 +179,11 @@ final class ExplicitModuleBuildTests: XCTestCase { func testModuleDependencyBuildCommandGenerationWithExternalFramework() throws { do { let externalDetails: ExternalTargetModuleDetailsMap = - try [.swiftPrebuiltExternal("A"): ExternalTargetModuleDetails(path: AbsolutePath(validating: "/tmp/A.swiftmodule"), + [.swiftPrebuiltExternal("A"): ExternalTargetModuleDetails(path: try AbsolutePath(validating: "/tmp/A.swiftmodule"), isFramework: true), - .swiftPrebuiltExternal("K"): ExternalTargetModuleDetails(path: AbsolutePath(validating: "/tmp/K.swiftmodule"), + .swiftPrebuiltExternal("K"): ExternalTargetModuleDetails(path: try AbsolutePath(validating: "/tmp/K.swiftmodule"), isFramework: true), - .swiftPrebuiltExternal("simpleTestModule"): ExternalTargetModuleDetails(path: AbsolutePath(validating: "/tmp/simpleTestModule.swiftmodule"), + .swiftPrebuiltExternal("simpleTestModule"): ExternalTargetModuleDetails(path: try AbsolutePath(validating: "/tmp/simpleTestModule.swiftmodule"), isFramework: true)] var driver = try Driver(args: ["swiftc", "-explicit-module-build", "-module-name", "simpleTestModule", @@ -340,7 +340,7 @@ final class ExplicitModuleBuildTests: XCTestCase { } } else { switch (outputFilePath) { - case .relative(RelativePath("testExplicitModuleBuildJobs")): + case .relative(try .init(validating: "testExplicitModuleBuildJobs")): XCTAssertTrue(driver.isExplicitMainModuleJob(job: job)) XCTAssertEqual(job.kind, .link) case .temporary(_): @@ -472,7 +472,7 @@ final class ExplicitModuleBuildTests: XCTestCase { } } else { switch (outputFilePath) { - case .relative(RelativePath("testExplicitModuleVerifyInterfaceJobs")): + case .relative(try .init(validating: "testExplicitModuleVerifyInterfaceJobs")): XCTAssertTrue(driver.isExplicitMainModuleJob(job: job)) XCTAssertEqual(job.kind, .link) case .temporary(_): @@ -606,7 +606,7 @@ final class ExplicitModuleBuildTests: XCTestCase { // Check we don't use `-pch-output-dir` anymore during main module job. XCTAssertFalse(job.commandLine.contains("-pch-output-dir")) switch (outputFilePath) { - case .relative(RelativePath("testExplicitModuleBuildPCHOutputJobs")): + case .relative(try .init(validating: "testExplicitModuleBuildPCHOutputJobs")): XCTAssertTrue(driver.isExplicitMainModuleJob(job: job)) XCTAssertEqual(job.kind, .link) case .temporary(_): @@ -710,7 +710,7 @@ final class ExplicitModuleBuildTests: XCTestCase { } } else { switch (outputFilePath) { - case .relative(RelativePath("testExplicitModuleBuildJobs")): + case .relative(try .init(validating: "testExplicitModuleBuildJobs")): XCTAssertTrue(driver.isExplicitMainModuleJob(job: job)) XCTAssertEqual(job.kind, .link) case .temporary(_): @@ -1394,11 +1394,11 @@ final class ExplicitModuleBuildTests: XCTestCase { try localFileSystem.writeFileContents(main, bytes: "import S;") let cHeadersPath: AbsolutePath = - try testInputsPath.appending(component: "ExplicitModuleBuilds") - .appending(component: "CHeaders") + try testInputsPath.appending(component: "ExplicitModuleBuilds") + .appending(component: "CHeaders") let swiftModuleInterfacesPath: AbsolutePath = - try testInputsPath.appending(component: "ExplicitModuleBuilds") - .appending(component: "Swift") + try testInputsPath.appending(component: "ExplicitModuleBuilds") + .appending(component: "Swift") let sdkArgumentsForTesting = (try? Driver.sdkArgumentsForTesting()) ?? [] var driver = try Driver(args: ["swiftc", "-I", cHeadersPath.nativePathString(escaped: true), diff --git a/Tests/SwiftDriverTests/IncrementalCompilationTests.swift b/Tests/SwiftDriverTests/IncrementalCompilationTests.swift index 5e168d342..b6aff5f04 100644 --- a/Tests/SwiftDriverTests/IncrementalCompilationTests.swift +++ b/Tests/SwiftDriverTests/IncrementalCompilationTests.swift @@ -21,7 +21,7 @@ import TestUtilities final class IncrementalCompilationTests: XCTestCase { var tempDir: AbsolutePath = try! AbsolutePath(validating: "/tmp") - var explicitModuleCacheDir: AbsolutePath = try! AbsolutePath(validating: "/tmp/ModuleCache") + var explicitModuleCacheDir: AbsolutePath = try! AbsolutePath(validating: "/tmp/ModuleCache") var derivedDataDir: AbsolutePath { tempDir.appending(component: "derivedData") @@ -163,7 +163,7 @@ extension IncrementalCompilationTests { let autoOuts = autolinkExtractJob.outputs.filter {$0.type == .autolink} XCTAssertEqual(autoOuts.count, 1) let autoOut = autoOuts[0] - let expected = AbsolutePath(derivedDataPath, "\(module).autolink") + let expected = try AbsolutePath(validating: "\(module).autolink", relativeTo: derivedDataPath) XCTAssertEqual(autoOut.file.absolutePath, expected) } } diff --git a/Tests/SwiftDriverTests/JobExecutorTests.swift b/Tests/SwiftDriverTests/JobExecutorTests.swift index 0ca3e2f87..31c7e3be8 100644 --- a/Tests/SwiftDriverTests/JobExecutorTests.swift +++ b/Tests/SwiftDriverTests/JobExecutorTests.swift @@ -63,42 +63,37 @@ class JobCollectingDelegate: JobExecutionDelegate { extension DarwinToolchain { /// macOS SDK path, for testing only. var sdk: Result { - get throws { - Result { - let result = try executor.checkNonZeroExit( - args: "xcrun", "-sdk", "macosx", "--show-sdk-path", - environment: env - ).spm_chomp() - return try AbsolutePath(validating: result) - } + Result { + let result = try executor.checkNonZeroExit( + args: "xcrun", "-sdk", "macosx", "--show-sdk-path", + environment: env + ).spm_chomp() + return try AbsolutePath(validating: result) } } /// macOS resource directory, for testing only. var resourcesDirectory: Result { - get throws { - return Result { - try AbsolutePath(validating: "../../lib/swift/macosx", - relativeTo: getToolPath(.swiftCompiler)) - } + return Result { + try AbsolutePath(validating: "../../lib/swift/macosx", + relativeTo: getToolPath(.swiftCompiler)) } } var clangRT: Result { - get throws { - try resourcesDirectory.tryMap { try AbsolutePath(validating: "../clang/lib/darwin/libclang_rt.osx.a", relativeTo: $0) } - } + resourcesDirectory.map { try! AbsolutePath(validating: "../clang/lib/darwin/libclang_rt.osx.a", + relativeTo: $0) } } var compatibility50: Result { get throws { - try resourcesDirectory.map { $0.appending(component: "libswiftCompatibility50.a") } + resourcesDirectory.map { $0.appending(component: "libswiftCompatibility50.a") } } } var compatibilityDynamicReplacements: Result { get throws { - try resourcesDirectory.map { $0.appending(component: "libswiftCompatibilityDynamicReplacements.a") } + resourcesDirectory.map { $0.appending(component: "libswiftCompatibilityDynamicReplacements.a") } } } } @@ -123,14 +118,14 @@ final class JobExecutorTests: XCTestCase { let resolver = try ArgsResolver(fileSystem: localFileSystem) resolver.pathMapping = [ - .relative(RelativePath("foo.swift")): foo.pathString, - .relative(RelativePath("main.swift")): main.pathString, - .relative(RelativePath("main")): exec.pathString, + .relative(try .init(validating: "foo.swift")): foo.pathString, + .relative(try .init(validating: "main.swift")): main.pathString, + .relative(try .init(validating: "main")): exec.pathString, ] let inputs: [String: TypedVirtualPath] = [ - "foo" : .init(file: VirtualPath.relative(RelativePath( "foo.swift")).intern(), type: .swift), - "main": .init(file: VirtualPath.relative(RelativePath("main.swift")).intern(), type: .swift) + "foo" : .init(file: VirtualPath.relative(try .init(validating: "foo.swift")).intern(), type: .swift), + "main": .init(file: VirtualPath.relative(try .init(validating: "main.swift")).intern(), type: .swift) ] let compileFoo = Job( @@ -148,11 +143,11 @@ final class JobExecutorTests: XCTestCase { "-sdk", .path(.absolute(try toolchain.sdk.get())), "-module-name", "main", - "-o", .path(.temporary(RelativePath("foo.o"))), + "-o", .path(.temporary(try RelativePath(validating: "foo.o"))), ], inputs: Array(inputs.values), primaryInputs: [inputs["foo"]!], - outputs: [.init(file: VirtualPath.temporary(RelativePath("foo.o")).intern(), type: .object)] + outputs: [.init(file: VirtualPath.temporary(try RelativePath(validating: "foo.o")).intern(), type: .object)] ) let compileMain = Job( @@ -162,7 +157,7 @@ final class JobExecutorTests: XCTestCase { commandLine: [ "-frontend", "-c", - .path(.relative(RelativePath("foo.swift"))), + .path(.relative(try .init(validating: "foo.swift"))), "-primary-file", .path(inputs["main"]!.file), "-target", .flag(hostTriple.triple), @@ -170,11 +165,11 @@ final class JobExecutorTests: XCTestCase { "-sdk", .path(.absolute(try toolchain.sdk.get())), "-module-name", "main", - "-o", .path(.temporary(RelativePath("main.o"))), + "-o", .path(.temporary(try RelativePath(validating: "main.o"))), ], inputs: Array(inputs.values), primaryInputs: [inputs["main"]!], - outputs: [.init(file: VirtualPath.temporary(RelativePath("main.o")).intern(), type: .object)] + outputs: [.init(file: VirtualPath.temporary(try RelativePath(validating: "main.o")).intern(), type: .object)] ) let link = Job( @@ -182,22 +177,22 @@ final class JobExecutorTests: XCTestCase { kind: .link, tool: try toolchain.resolvedTool(.dynamicLinker), commandLine: [ - .path(.temporary(RelativePath("foo.o"))), - .path(.temporary(RelativePath("main.o"))), + .path(.temporary(try RelativePath(validating: "foo.o"))), + .path(.temporary(try RelativePath(validating: "main.o"))), .path(.absolute(try toolchain.clangRT.get())), "--sysroot", .path(.absolute(try toolchain.sdk.get())), "-lobjc", .flag("--target=\(hostTriple.triple)"), "-L", .path(.absolute(try toolchain.resourcesDirectory.get())), "-L", .path(.absolute(try toolchain.sdkStdlib(sdk: toolchain.sdk.get()))), "-rpath", "/usr/lib/swift", "-o", - .path(.relative(RelativePath("main"))), + .path(.relative(try .init(validating: "main"))), ], inputs: [ - .init(file: VirtualPath.temporary(RelativePath("foo.o")).intern(), type: .object), - .init(file: VirtualPath.temporary(RelativePath("main.o")).intern(), type: .object), + .init(file: VirtualPath.temporary(try RelativePath(validating: "foo.o")).intern(), type: .object), + .init(file: VirtualPath.temporary(try RelativePath(validating: "main.o")).intern(), type: .object), ], primaryInputs: [], - outputs: [.init(file: VirtualPath.relative(RelativePath("main")).intern(), type: .image)] + outputs: [.init(file: VirtualPath.relative(try .init(validating: "main")).intern(), type: .image)] ) let delegate = JobCollectingDelegate() let executor = MultiJobExecutor(workload: .all([compileFoo, compileMain, link]), @@ -208,10 +203,10 @@ final class JobExecutorTests: XCTestCase { XCTAssertEqual(output, "5\n") XCTAssertEqual(delegate.started.count, 3) - let fooObject = try resolver.resolve(.path(.temporary(RelativePath("foo.o")))) - try XCTAssertTrue(localFileSystem.exists(AbsolutePath(validating: fooObject)), "expected foo.o to be present in the temporary directory") + let fooObject = try resolver.resolve(.path(.temporary(try RelativePath(validating: "foo.o")))) + XCTAssertTrue(localFileSystem.exists(try AbsolutePath(validating: fooObject)), "expected foo.o to be present in the temporary directory") try resolver.removeTemporaryDirectory() - try XCTAssertFalse(localFileSystem.exists(AbsolutePath(validating: fooObject)), "expected foo.o to be removed from the temporary directory") + XCTAssertFalse(localFileSystem.exists(try AbsolutePath(validating: fooObject)), "expected foo.o to be removed from the temporary directory") } #endif } @@ -242,11 +237,11 @@ final class JobExecutorTests: XCTestCase { "-sdk", .path(.absolute(try toolchain.sdk.get())), "-module-name", "main", - "-o", .path(.temporary(RelativePath("main.o"))), + "-o", .path(.temporary(try RelativePath(validating: "main.o"))), ], inputs: [TypedVirtualPath(file: .standardInput, type: .swift )], primaryInputs: [TypedVirtualPath(file: .standardInput, type: .swift )], - outputs: [.init(file: VirtualPath.temporary(RelativePath("main.o")).intern(), + outputs: [.init(file: VirtualPath.temporary(try RelativePath(validating: "main.o")).intern(), type: .object)] ) let link = Job( @@ -254,7 +249,7 @@ final class JobExecutorTests: XCTestCase { kind: .link, tool: try toolchain.resolvedTool(.dynamicLinker), commandLine: [ - .path(.temporary(RelativePath("main.o"))), + .path(.temporary(try RelativePath(validating: "main.o"))), "--sysroot", .path(.absolute(try toolchain.sdk.get())), "-lobjc", .flag("--target=\(hostTriple.triple)"), "-L", .path(.absolute(try toolchain.resourcesDirectory.get())), @@ -262,10 +257,10 @@ final class JobExecutorTests: XCTestCase { "-o", .path(.absolute(exec)), ], inputs: [ - .init(file: VirtualPath.temporary(RelativePath("main.o")).intern(), type: .object), + .init(file: VirtualPath.temporary(try RelativePath(validating: "main.o")).intern(), type: .object), ], primaryInputs: [], - outputs: [.init(file: VirtualPath.relative(RelativePath("main")).intern(), type: .image)] + outputs: [.init(file: VirtualPath.relative(try .init(validating: "main")).intern(), type: .image)] ) // Create a file with inpuit @@ -294,14 +289,14 @@ final class JobExecutorTests: XCTestCase { #if os(Windows) throw XCTSkip("processId.getter returning `-1`") #else - let job = try Job( + let job = Job( moduleName: "main", kind: .compile, - tool: ResolvedTool(path: AbsolutePath(validating: "/usr/bin/swift"), supportsResponseFiles: false), + tool: ResolvedTool(path: try AbsolutePath(validating: "/usr/bin/swift"), supportsResponseFiles: false), commandLine: [.flag("something")], inputs: [], primaryInputs: [], - outputs: [.init(file: VirtualPath.temporary(RelativePath("main")).intern(), type: .object)] + outputs: [.init(file: VirtualPath.temporary(try RelativePath(validating: "main")).intern(), type: .object)] ) let delegate = JobCollectingDelegate() @@ -335,7 +330,7 @@ final class JobExecutorTests: XCTestCase { env[envVarName] = dummyPath let overriddenSwiftPath = try DarwinToolchain(env: env, executor: executor).getToolPath(.swiftCompiler) - try XCTAssertEqual(overriddenSwiftPath, AbsolutePath(validating: dummyPath)) + XCTAssertEqual(overriddenSwiftPath, try AbsolutePath(validating: dummyPath)) // GenericUnixToolchain env.removeValue(forKey: envVarName) @@ -345,7 +340,7 @@ final class JobExecutorTests: XCTestCase { env[envVarName] = dummyPath let unixOverriddenSwiftPath = try GenericUnixToolchain(env: env, executor: executor).getToolPath(.swiftCompiler) - try XCTAssertEqual(unixOverriddenSwiftPath, AbsolutePath(validating: dummyPath)) + XCTAssertEqual(unixOverriddenSwiftPath, try AbsolutePath(validating: dummyPath)) } func testInputModifiedDuringSingleJobBuild() throws { @@ -377,13 +372,13 @@ final class JobExecutorTests: XCTestCase { processSet: ProcessSet(), fileSystem: localFileSystem, env: [:]) - let job = try Job(moduleName: "Module", + let job = Job(moduleName: "Module", kind: .compile, tool: ResolvedTool( - path: AbsolutePath(validating: "/path/to/the tool"), + path: try AbsolutePath(validating: "/path/to/the tool"), supportsResponseFiles: false), - commandLine: [.path(.absolute(.init(validating: "/with space"))), - .path(.absolute(.init(validating: "/withoutspace")))], + commandLine: [.path(.absolute(try .init(validating: "/with space"))), + .path(.absolute(try .init(validating: "/withoutspace")))], inputs: [], primaryInputs: [], outputs: []) #if os(Windows) XCTAssertEqual(try executor.description(of: job, forceResponseFiles: false), @@ -430,7 +425,7 @@ final class JobExecutorTests: XCTestCase { func testTemporaryFileWriting() throws { try withTemporaryDirectory { path in let resolver = try ArgsResolver(fileSystem: localFileSystem, temporaryDirectory: .absolute(path)) - let tmpPath = VirtualPath.temporaryWithKnownContents(.init("one.txt"), "hello, world!".data(using: .utf8)!) + let tmpPath = VirtualPath.temporaryWithKnownContents(try .init(validating: "one.txt"), "hello, world!".data(using: .utf8)!) let resolvedOnce = try resolver.resolve(.path(tmpPath)) let readContents = try localFileSystem.readFileContents(.init(validating: resolvedOnce)) XCTAssertEqual(readContents, "hello, world!") @@ -444,8 +439,8 @@ final class JobExecutorTests: XCTestCase { func testResolveSquashedArgs() throws { try withTemporaryDirectory { path in let resolver = try ArgsResolver(fileSystem: localFileSystem, temporaryDirectory: .absolute(path)) - let tmpPath = VirtualPath.temporaryWithKnownContents(.init("one.txt"), "hello, world!".data(using: .utf8)!) - let tmpPath2 = VirtualPath.temporaryWithKnownContents(.init("two.txt"), "goodbye!".data(using: .utf8)!) + let tmpPath = VirtualPath.temporaryWithKnownContents(try .init(validating: "one.txt"), "hello, world!".data(using: .utf8)!) + let tmpPath2 = VirtualPath.temporaryWithKnownContents(try .init(validating: "two.txt"), "goodbye!".data(using: .utf8)!) let resolvedCommandLine = try resolver.resolve( .squashedArgumentList(option: "--opt=", args: [.path(tmpPath), .path(tmpPath2)])) XCTAssertEqual(resolvedCommandLine, "--opt=\(path.appending(component: "one.txt").pathString) \(path.appending(component: "two.txt").pathString)") @@ -503,12 +498,10 @@ final class JobExecutorTests: XCTestCase { try driver.run(jobs: jobs) XCTAssertTrue(localFileSystem.exists(outputPath)) // -save-temps wasn't passed, so ensure the temporary file was removed. - try XCTAssertFalse( - localFileSystem.exists(.init(validating: try executor.resolver.resolve(.path(driver.allSourcesFileList!)))) - ) - try XCTAssertFalse( - localFileSystem.exists(.init(validating: try executor.resolver.resolve(.path(compileOutput)))) + XCTAssertFalse( + localFileSystem.exists(try .init(validating: try executor.resolver.resolve(.path(driver.allSourcesFileList!)))) ) + XCTAssertFalse(localFileSystem.exists(try .init(validating: try executor.resolver.resolve(.path(compileOutput))))) } } @@ -541,12 +534,10 @@ final class JobExecutorTests: XCTestCase { try driver.run(jobs: jobs) XCTAssertTrue(localFileSystem.exists(outputPath)) // -save-temps was passed, so ensure the temporary file was not removed. - try XCTAssertTrue( - localFileSystem.exists(.init(validating: try executor.resolver.resolve(.path(driver.allSourcesFileList!)))) - ) - try XCTAssertTrue( - localFileSystem.exists(.init(validating: try executor.resolver.resolve(.path(compileOutput)))) + XCTAssertTrue( + localFileSystem.exists(try .init(validating: executor.resolver.resolve(.path(driver.allSourcesFileList!)))) ) + XCTAssertTrue(localFileSystem.exists(try .init(validating: executor.resolver.resolve(.path(compileOutput))))) } } @@ -578,8 +569,8 @@ final class JobExecutorTests: XCTestCase { } try? driver.run(jobs: jobs) // A job crashed, so ensure any temporary files written so far are preserved. - try XCTAssertTrue( - localFileSystem.exists(.init(validating: try executor.resolver.resolve(.path(driver.allSourcesFileList!)))) + XCTAssertTrue( + localFileSystem.exists(try .init(validating: executor.resolver.resolve(.path(driver.allSourcesFileList!)))) ) } } diff --git a/Tests/SwiftDriverTests/ModuleDependencyGraphTests.swift b/Tests/SwiftDriverTests/ModuleDependencyGraphTests.swift index 953a75987..785c9f92b 100644 --- a/Tests/SwiftDriverTests/ModuleDependencyGraphTests.swift +++ b/Tests/SwiftDriverTests/ModuleDependencyGraphTests.swift @@ -1451,7 +1451,7 @@ extension Job { type: .swift) try! self.init(moduleName: "nothing", kind: .compile, - tool: ResolvedTool(path: AbsolutePath(validating: "/dummy"), supportsResponseFiles: false), + tool: ResolvedTool(path: try AbsolutePath(validating: "/dummy"), supportsResponseFiles: false), commandLine: [], inputs: [input], primaryInputs: [input], diff --git a/Tests/SwiftDriverTests/NonincrementalCompilationTests.swift b/Tests/SwiftDriverTests/NonincrementalCompilationTests.swift index 5bfda10b6..e3b283173 100644 --- a/Tests/SwiftDriverTests/NonincrementalCompilationTests.swift +++ b/Tests/SwiftDriverTests/NonincrementalCompilationTests.swift @@ -44,7 +44,7 @@ final class NonincrementalCompilationTests: XCTestCase { } func testReadBinarySourceFileDependencyGraph() throws { - let absolutePath = try XCTUnwrap(Fixture.fixturePath(at: RelativePath("Incremental"), + let absolutePath = try XCTUnwrap(Fixture.fixturePath(at: try RelativePath(validating: "Incremental"), for: "main.swiftdeps")) let typedFile = TypedVirtualPath(file: VirtualPath.absolute(absolutePath).intern(), type: .swiftDeps) try MockIncrementalCompilationSynchronizer.withInternedStringTable { internedStringTable in @@ -94,7 +94,7 @@ final class NonincrementalCompilationTests: XCTestCase { } func testReadComplexSourceFileDependencyGraph() throws { - let absolutePath = try XCTUnwrap(Fixture.fixturePath(at: RelativePath("Incremental"), + let absolutePath = try XCTUnwrap(Fixture.fixturePath(at: try RelativePath(validating: "Incremental"), for: "hello.swiftdeps")) try MockIncrementalCompilationSynchronizer.withInternedStringTable{ internedStringTable in let graph = try XCTUnwrap( @@ -150,7 +150,7 @@ final class NonincrementalCompilationTests: XCTestCase { } func testExtractSourceFileDependencyGraphFromSwiftModule() throws { - let absolutePath = try XCTUnwrap(Fixture.fixturePath(at: RelativePath("Incremental"), + let absolutePath = try XCTUnwrap(Fixture.fixturePath(at: try RelativePath(validating: "Incremental"), for: "hello.swiftmodule")) let data = try localFileSystem.readFileContents(absolutePath) try MockIncrementalCompilationSynchronizer.withInternedStringTable { internedStringTable in diff --git a/Tests/SwiftDriverTests/SwiftDriverTests.swift b/Tests/SwiftDriverTests/SwiftDriverTests.swift index ac29268d3..665157fbd 100644 --- a/Tests/SwiftDriverTests/SwiftDriverTests.swift +++ b/Tests/SwiftDriverTests/SwiftDriverTests.swift @@ -35,13 +35,15 @@ private func rebase(_ arcs: String..., at base: AbsolutePath) -> String { base.appending(components: arcs).nativePathString(escaped: false) } -private var testInputsPath: AbsolutePath = { - var root: AbsolutePath = try! AbsolutePath(validating: #file) - while root.basename != "Tests" { - root = root.parentDirectory +private var testInputsPath: AbsolutePath { + get throws { + var root: AbsolutePath = try AbsolutePath(validating: #file) + while root.basename != "Tests" { + root = root.parentDirectory + } + return root.parentDirectory.appending(component: "TestInputs") } - return root.parentDirectory.appending(component: "TestInputs") -}() +} final class SwiftDriverTests: XCTestCase { private var ld: AbsolutePath! @@ -199,8 +201,8 @@ final class SwiftDriverTests: XCTestCase { func testJoinedPathOptions() throws { var driver = try Driver(args: ["swiftc", "-c", "-I=/some/dir", "-F=other/relative/dir", "foo.swift"]) let jobs = try driver.planBuild() - try XCTAssertTrue(jobs[0].commandLine.contains(.joinedOptionAndPath("-I=", .absolute(.init(validating: "/some/dir"))))) - XCTAssertTrue(jobs[0].commandLine.contains(.joinedOptionAndPath("-F=", .relative(.init("other/relative/dir"))))) + XCTAssertTrue(jobs[0].commandLine.contains(.joinedOptionAndPath("-I=", .absolute(try .init(validating: "/some/dir"))))) + XCTAssertTrue(jobs[0].commandLine.contains(.joinedOptionAndPath("-F=", .relative(try .init(validating: "other/relative/dir"))))) } func testRelativeOptionOrdering() throws { @@ -211,9 +213,9 @@ final class SwiftDriverTests: XCTestCase { let jobs = try driver.planBuild() XCTAssertEqual(jobs[0].kind, .compile) // The relative ordering of -F and -Fsystem options should be preserved. - try XCTAssertTrue(jobs[0].commandLine.contains(subsequence: [.flag("-F"), .path(.absolute(.init(validating: "/path/to/frameworks"))), - .flag("-Fsystem"), .path(.absolute(.init(validating: "/path/to/systemframeworks"))), - .flag("-F"), .path(.absolute(.init(validating: "/path/to/more/frameworks")))])) + XCTAssertTrue(jobs[0].commandLine.contains(subsequence: [.flag("-F"), .path(.absolute(try .init(validating: "/path/to/frameworks"))), + .flag("-Fsystem"), .path(.absolute(try .init(validating: "/path/to/systemframeworks"))), + .flag("-F"), .path(.absolute(try .init(validating: "/path/to/more/frameworks")))])) } func testBatchModeDiagnostics() throws { @@ -279,7 +281,7 @@ final class SwiftDriverTests: XCTestCase { func testInputFiles() throws { let driver1 = try Driver(args: ["swiftc", "a.swift", "/tmp/b.swift"]) XCTAssertEqual(driver1.inputFiles, - [ TypedVirtualPath(file: VirtualPath.relative(RelativePath("a.swift")).intern(), type: .swift), + [ TypedVirtualPath(file: VirtualPath.relative(try RelativePath(validating: "a.swift")).intern(), type: .swift), TypedVirtualPath(file: VirtualPath.absolute(try AbsolutePath(validating: "/tmp/b.swift")).intern(), type: .swift) ]) let workingDirectory = localFileSystem.currentWorkingDirectory!.appending(components: "wobble") @@ -721,7 +723,7 @@ final class SwiftDriverTests: XCTestCase { XCTAssertTrue(matchTemporary(plannedJobs[1].outputs.first!.file, "bar.o")) XCTAssertTrue(plannedJobs[2].tool.name.contains(executableName("clang"))) XCTAssertEqual(plannedJobs[2].outputs.count, 1) - XCTAssertEqual(plannedJobs[2].outputs.first!.file, VirtualPath.relative(RelativePath(executableName("Test")))) + XCTAssertEqual(plannedJobs[2].outputs.first!.file, VirtualPath.relative(try RelativePath(validating: executableName("Test")))) // Forwarding of arguments. let workingDirectory = localFileSystem.currentWorkingDirectory!.appending(components: "tmp") @@ -794,8 +796,8 @@ final class SwiftDriverTests: XCTestCase { XCTAssertTrue(plannedJobs[0].kind == .emitModule) XCTAssertTrue(plannedJobs[1].kind == .compile) XCTAssertTrue(plannedJobs[2].kind == .link) - try XCTAssertTrue(plannedJobs[0].commandLine.contains(subsequence: ["-serialize-diagnostics-path", .path(.absolute(.init(validating: "/tmp/foo/.build/x86_64-apple-macosx/debug/foo.build/master.emit-module.dia")))])) - try XCTAssertTrue(plannedJobs[1].commandLine.contains(subsequence: ["-serialize-diagnostics-path", .path(.absolute(.init(validating: "/tmp/foo/.build/x86_64-apple-macosx/debug/foo.build/foo.dia")))])) + XCTAssertTrue(plannedJobs[0].commandLine.contains(subsequence: ["-serialize-diagnostics-path", .path(.absolute(try .init(validating: "/tmp/foo/.build/x86_64-apple-macosx/debug/foo.build/master.emit-module.dia")))])) + XCTAssertTrue(plannedJobs[1].commandLine.contains(subsequence: ["-serialize-diagnostics-path", .path(.absolute(try .init(validating: "/tmp/foo/.build/x86_64-apple-macosx/debug/foo.build/foo.dia")))])) } // WMO @@ -808,8 +810,8 @@ final class SwiftDriverTests: XCTestCase { XCTAssertTrue(plannedJobs[0].kind == .compile) XCTAssertTrue(plannedJobs[1].kind == .emitModule) XCTAssertTrue(plannedJobs[2].kind == .link) - try XCTAssertTrue(plannedJobs[0].commandLine.contains(subsequence: ["-serialize-diagnostics-path", .path(.absolute(.init(validating: "/tmp/foo/.build/x86_64-apple-macosx/debug/foo.build/master.dia")))])) - try XCTAssertTrue(plannedJobs[1].commandLine.contains(subsequence: ["-serialize-diagnostics-path", .path(.absolute(.init(validating: "/tmp/foo/.build/x86_64-apple-macosx/debug/foo.build/master.emit-module.dia")))])) + XCTAssertTrue(plannedJobs[0].commandLine.contains(subsequence: ["-serialize-diagnostics-path", .path(.absolute(try .init(validating: "/tmp/foo/.build/x86_64-apple-macosx/debug/foo.build/master.dia")))])) + XCTAssertTrue(plannedJobs[1].commandLine.contains(subsequence: ["-serialize-diagnostics-path", .path(.absolute(try .init(validating: "/tmp/foo/.build/x86_64-apple-macosx/debug/foo.build/master.emit-module.dia")))])) } } } @@ -838,8 +840,8 @@ final class SwiftDriverTests: XCTestCase { XCTAssertTrue(plannedJobs[0].kind == .emitModule) XCTAssertTrue(plannedJobs[1].kind == .compile) XCTAssertTrue(plannedJobs[2].kind == .link) - try XCTAssertTrue(plannedJobs[0].commandLine.contains(subsequence: ["-emit-dependencies-path", .path(.absolute(.init(validating: "/tmp/foo/.build/x86_64-apple-macosx/debug/foo.build/master.emit-module.d")))])) - try XCTAssertTrue(plannedJobs[1].commandLine.contains(subsequence: ["-emit-dependencies-path", .path(.absolute(.init(validating: "/tmp/foo/.build/x86_64-apple-macosx/debug/foo.build/foo.d")))])) + XCTAssertTrue(plannedJobs[0].commandLine.contains(subsequence: ["-emit-dependencies-path", .path(.absolute(try .init(validating: "/tmp/foo/.build/x86_64-apple-macosx/debug/foo.build/master.emit-module.d")))])) + XCTAssertTrue(plannedJobs[1].commandLine.contains(subsequence: ["-emit-dependencies-path", .path(.absolute(try .init(validating: "/tmp/foo/.build/x86_64-apple-macosx/debug/foo.build/foo.d")))])) } // WMO @@ -852,15 +854,15 @@ final class SwiftDriverTests: XCTestCase { XCTAssertTrue(plannedJobs[0].kind == .compile) XCTAssertTrue(plannedJobs[1].kind == .emitModule) XCTAssertTrue(plannedJobs[2].kind == .link) - try XCTAssertTrue(plannedJobs[0].commandLine.contains(subsequence: ["-emit-dependencies-path", .path(.absolute(.init(validating: "/tmp/foo/.build/x86_64-apple-macosx/debug/foo.build/master.d")))])) - try XCTAssertTrue(plannedJobs[1].commandLine.contains(subsequence: ["-emit-dependencies-path", .path(.absolute(.init(validating: "/tmp/foo/.build/x86_64-apple-macosx/debug/foo.build/master.emit-module.d")))])) + XCTAssertTrue(plannedJobs[0].commandLine.contains(subsequence: ["-emit-dependencies-path", .path(.absolute(try .init(validating: "/tmp/foo/.build/x86_64-apple-macosx/debug/foo.build/master.d")))])) + XCTAssertTrue(plannedJobs[1].commandLine.contains(subsequence: ["-emit-dependencies-path", .path(.absolute(try .init(validating: "/tmp/foo/.build/x86_64-apple-macosx/debug/foo.build/master.emit-module.d")))])) } } } func testOutputFileMapLoading() throws { let objroot: AbsolutePath = - try AbsolutePath(validating: "/tmp/foo/.build/x86_64-apple-macosx/debug/foo.build") + try AbsolutePath(validating: "/tmp/foo/.build/x86_64-apple-macosx/debug/foo.build") let contents = ByteString(""" { @@ -892,7 +894,7 @@ final class SwiftDriverTests: XCTestCase { func testFindingObjectPathFromllvmBCPath() throws { let objroot: AbsolutePath = - try AbsolutePath(validating: "/tmp/foo/.build/x86_64-apple-macosx/debug/foo.build") + try AbsolutePath(validating: "/tmp/foo/.build/x86_64-apple-macosx/debug/foo.build") let contents = ByteString( """ @@ -923,7 +925,7 @@ final class SwiftDriverTests: XCTestCase { func testOutputFileMapLoadingDocAndSourceinfo() throws { let objroot: AbsolutePath = - try AbsolutePath(validating: "/tmp/foo/.build/x86_64-apple-macosx/debug/foo.build") + try AbsolutePath(validating: "/tmp/foo/.build/x86_64-apple-macosx/debug/foo.build") let contents = ByteString( """ @@ -997,10 +999,10 @@ final class SwiftDriverTests: XCTestCase { "-module-name", "test", "/tmp/second.swift", "/tmp/main.swift" ]) var jobs = try driver.planBuild() - try XCTAssertTrue(jobs[0].commandLine.contains(subsequence: ["-o", .path(.absolute(.init(validating: "/tmp/build1/second.o")))])) - try XCTAssertTrue(jobs[1].commandLine.contains(subsequence: ["-o", .path(.absolute(.init(validating: "/tmp/build1/main.o")))])) - try XCTAssertTrue(jobs[0].commandLine.contains(subsequence: ["-index-unit-output-path", .path(.absolute(.init(validating: "/tmp/build2/second.o")))])) - try XCTAssertTrue(jobs[1].commandLine.contains(subsequence: ["-index-unit-output-path", .path(.absolute(.init(validating: "/tmp/build2/main.o")))])) + XCTAssertTrue(jobs[0].commandLine.contains(subsequence: ["-o", .path(.absolute(try .init(validating: "/tmp/build1/second.o")))])) + XCTAssertTrue(jobs[1].commandLine.contains(subsequence: ["-o", .path(.absolute(try .init(validating: "/tmp/build1/main.o")))])) + XCTAssertTrue(jobs[0].commandLine.contains(subsequence: ["-index-unit-output-path", .path(.absolute(try .init(validating: "/tmp/build2/second.o")))])) + XCTAssertTrue(jobs[1].commandLine.contains(subsequence: ["-index-unit-output-path", .path(.absolute(try .init(validating: "/tmp/build2/main.o")))])) // b) with filelists driver = try Driver(args: [ @@ -1009,15 +1011,14 @@ final class SwiftDriverTests: XCTestCase { "-module-name", "test", "/tmp/second.swift", "/tmp/main.swift" ]) jobs = try driver.planBuild() - try XCTAssertEqual(getFileListElements(for: "-output-filelist", job: jobs[0]), - [.absolute(.init(validating: "/tmp/build1/second.o"))]) - try XCTAssertEqual(getFileListElements(for: "-index-unit-output-path-filelist", job: jobs[0]), - [.absolute(.init(validating: "/tmp/build2/second.o"))]) - try XCTAssertEqual(getFileListElements(for: "-output-filelist", job: jobs[1]), - [.absolute(.init(validating: "/tmp/build1/main.o"))]) - try XCTAssertEqual(getFileListElements(for: "-index-unit-output-path-filelist", job: jobs[1]), - [.absolute(.init(validating: "/tmp/build2/main.o"))]) - + XCTAssertEqual(getFileListElements(for: "-output-filelist", job: jobs[0]), + [.absolute(try .init(validating: "/tmp/build1/second.o"))]) + XCTAssertEqual(getFileListElements(for: "-index-unit-output-path-filelist", job: jobs[0]), + [.absolute(try .init(validating: "/tmp/build2/second.o"))]) + XCTAssertEqual(getFileListElements(for: "-output-filelist", job: jobs[1]), + [.absolute(try .init(validating: "/tmp/build1/main.o"))]) + XCTAssertEqual(getFileListElements(for: "-index-unit-output-path-filelist", job: jobs[1]), + [.absolute(try .init(validating: "/tmp/build2/main.o"))]) // 2. Batch mode (two primary files) // a) without filelists @@ -1027,10 +1028,10 @@ final class SwiftDriverTests: XCTestCase { "-module-name", "test", "/tmp/second.swift", "/tmp/main.swift" ]) jobs = try driver.planBuild() - try XCTAssertTrue(jobs[0].commandLine.contains(subsequence: ["-o", .path(.absolute(.init(validating: "/tmp/build1/second.o")))])) - try XCTAssertTrue(jobs[0].commandLine.contains(subsequence: ["-o", .path(.absolute(.init(validating: "/tmp/build1/main.o")))])) - try XCTAssertTrue(jobs[0].commandLine.contains(subsequence: ["-index-unit-output-path", .path(.absolute(.init(validating: "/tmp/build2/second.o")))])) - try XCTAssertTrue(jobs[0].commandLine.contains(subsequence: ["-index-unit-output-path", .path(.absolute(.init(validating: "/tmp/build2/main.o")))])) + XCTAssertTrue(jobs[0].commandLine.contains(subsequence: ["-o", .path(.absolute(try .init(validating: "/tmp/build1/second.o")))])) + XCTAssertTrue(jobs[0].commandLine.contains(subsequence: ["-o", .path(.absolute(try .init(validating: "/tmp/build1/main.o")))])) + XCTAssertTrue(jobs[0].commandLine.contains(subsequence: ["-index-unit-output-path", .path(.absolute(try .init(validating: "/tmp/build2/second.o")))])) + XCTAssertTrue(jobs[0].commandLine.contains(subsequence: ["-index-unit-output-path", .path(.absolute(try .init(validating: "/tmp/build2/main.o")))])) // b) with filelists driver = try Driver(args: [ @@ -1040,10 +1041,10 @@ final class SwiftDriverTests: XCTestCase { "-module-name", "test", "/tmp/second.swift", "/tmp/main.swift" ]) jobs = try driver.planBuild() - try XCTAssertEqual(getFileListElements(for: "-output-filelist", job: jobs[0]), - [.absolute(.init(validating: "/tmp/build1/second.o")), .absolute(.init(validating: "/tmp/build1/main.o"))]) - try XCTAssertEqual(getFileListElements(for: "-index-unit-output-path-filelist", job: jobs[0]), - [.absolute(.init(validating: "/tmp/build2/second.o")), .absolute(.init(validating: "/tmp/build2/main.o"))]) + XCTAssertEqual(getFileListElements(for: "-output-filelist", job: jobs[0]), + [.absolute(try .init(validating: "/tmp/build1/second.o")), .absolute(try .init(validating: "/tmp/build1/main.o"))]) + XCTAssertEqual(getFileListElements(for: "-index-unit-output-path-filelist", job: jobs[0]), + [.absolute(try .init(validating: "/tmp/build2/second.o")), .absolute(try .init(validating: "/tmp/build2/main.o"))]) // 3. Multi-threaded WMO // a) without filelists @@ -1053,10 +1054,10 @@ final class SwiftDriverTests: XCTestCase { "-module-name", "test", "/tmp/second.swift", "/tmp/main.swift" ]) jobs = try driver.planBuild() - try XCTAssertTrue(jobs[0].commandLine.contains(subsequence: ["-o", .path(.absolute(.init(validating: "/tmp/build1/second.o")))])) - try XCTAssertTrue(jobs[0].commandLine.contains(subsequence: ["-index-unit-output-path", .path(.absolute(.init(validating: "/tmp/build2/second.o")))])) - try XCTAssertTrue(jobs[0].commandLine.contains(subsequence: ["-o", .path(.absolute(.init(validating: "/tmp/build1/main.o")))])) - try XCTAssertTrue(jobs[0].commandLine.contains(subsequence: ["-index-unit-output-path", .path(.absolute(.init(validating: "/tmp/build2/main.o")))])) + XCTAssertTrue(jobs[0].commandLine.contains(subsequence: ["-o", .path(.absolute(try .init(validating: "/tmp/build1/second.o")))])) + XCTAssertTrue(jobs[0].commandLine.contains(subsequence: ["-index-unit-output-path", .path(.absolute(try .init(validating: "/tmp/build2/second.o")))])) + XCTAssertTrue(jobs[0].commandLine.contains(subsequence: ["-o", .path(.absolute(try .init(validating: "/tmp/build1/main.o")))])) + XCTAssertTrue(jobs[0].commandLine.contains(subsequence: ["-index-unit-output-path", .path(.absolute(try .init(validating: "/tmp/build2/main.o")))])) // b) with filelists driver = try Driver(args: [ @@ -1066,10 +1067,10 @@ final class SwiftDriverTests: XCTestCase { "-module-name", "test", "/tmp/second.swift", "/tmp/main.swift" ]) jobs = try driver.planBuild() - try XCTAssertEqual(getFileListElements(for: "-output-filelist", job: jobs[0]), - [.absolute(.init(validating: "/tmp/build1/second.o")), .absolute(.init(validating: "/tmp/build1/main.o"))]) - try XCTAssertEqual(getFileListElements(for: "-index-unit-output-path-filelist", job: jobs[0]), - [.absolute(.init(validating: "/tmp/build2/second.o")), .absolute(.init(validating: "/tmp/build2/main.o"))]) + XCTAssertEqual(getFileListElements(for: "-output-filelist", job: jobs[0]), + [.absolute(try .init(validating: "/tmp/build1/second.o")), .absolute(try .init(validating: "/tmp/build1/main.o"))]) + XCTAssertEqual(getFileListElements(for: "-index-unit-output-path-filelist", job: jobs[0]), + [.absolute(try .init(validating: "/tmp/build2/second.o")), .absolute(try .init(validating: "/tmp/build2/main.o"))]) // 4. Index-file (single primary) driver = try Driver(args: [ @@ -1080,8 +1081,8 @@ final class SwiftDriverTests: XCTestCase { "-index-unit-output-path", "/tmp/build2/second.o" ]) jobs = try driver.planBuild() - try XCTAssertTrue(jobs[0].commandLine.contains(subsequence: ["-o", .path(.absolute(.init(validating: "/tmp/build1/second.o")))])) - try XCTAssertTrue(jobs[0].commandLine.contains(subsequence: ["-index-unit-output-path", .path(.absolute(.init(validating: "/tmp/build2/second.o")))])) + XCTAssertTrue(jobs[0].commandLine.contains(subsequence: ["-o", .path(.absolute(try .init(validating: "/tmp/build1/second.o")))])) + XCTAssertTrue(jobs[0].commandLine.contains(subsequence: ["-index-unit-output-path", .path(.absolute(try .init(validating: "/tmp/build2/second.o")))])) } } } @@ -1192,14 +1193,14 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(plannedJobs[0].kind, .compile) XCTAssertTrue(plannedJobs[0].primaryInputs.map{ $0.file.description }.elementsEqual(["foo.swift", "bar.swift"])) - try XCTAssertTrue(plannedJobs[0].commandLine.contains(subsequence: [.flag("-emit-const-values-path"), .path(.absolute(.init(validating: "/tmp/foo.build/foo.swiftconstvalues")))])) - try XCTAssertTrue(plannedJobs[0].commandLine.contains(subsequence: [.flag("-emit-const-values-path"), .path(.absolute(.init(validating: "/tmp/foo.build/bar.swiftconstvalues")))])) + XCTAssertTrue(plannedJobs[0].commandLine.contains(subsequence: [.flag("-emit-const-values-path"), .path(.absolute(try .init(validating: "/tmp/foo.build/foo.swiftconstvalues")))])) + XCTAssertTrue(plannedJobs[0].commandLine.contains(subsequence: [.flag("-emit-const-values-path"), .path(.absolute(try .init(validating: "/tmp/foo.build/bar.swiftconstvalues")))])) XCTAssertEqual(plannedJobs[0].outputs.filter({ $0.type == .swiftConstValues }).count, 2) XCTAssertEqual(plannedJobs[1].kind, .compile) XCTAssertTrue(plannedJobs[1].primaryInputs.map{ $0.file.description }.elementsEqual(["baz.swift"])) XCTAssertTrue(plannedJobs[1].commandLine.contains("-emit-const-values-path")) XCTAssertEqual(plannedJobs[1].outputs.filter({ $0.type == .swiftConstValues }).count, 1) - try XCTAssertTrue(plannedJobs[1].commandLine.contains(subsequence: [.flag("-emit-const-values-path"), .path(.absolute(.init(validating: "/tmp/foo.build/baz.swiftconstvalues")))])) + XCTAssertTrue(plannedJobs[1].commandLine.contains(subsequence: [.flag("-emit-const-values-path"), .path(.absolute(try .init(validating: "/tmp/foo.build/baz.swiftconstvalues")))])) XCTAssertEqual(plannedJobs[2].kind, .link) } @@ -1242,8 +1243,8 @@ final class SwiftDriverTests: XCTestCase { let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs() XCTAssertEqual(plannedJobs.count, 2) XCTAssertEqual(plannedJobs[0].kind, .compile) - try XCTAssertEqual(plannedJobs[0].outputs.first(where: { $0.type == .swiftConstValues })?.file, - .absolute(.init(validating: "/tmp/foo.build/foo.master.swiftconstvalues"))) + XCTAssertEqual(plannedJobs[0].outputs.first(where: { $0.type == .swiftConstValues })?.file, + .absolute(try .init(validating: "/tmp/foo.build/foo.master.swiftconstvalues"))) XCTAssertEqual(plannedJobs[1].kind, .link) } } @@ -1266,7 +1267,7 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(plannedJobs.count, 3) XCTAssertTrue(plannedJobs[0].kind == .emitModule) - try XCTAssertTrue(plannedJobs[0].commandLine.contains(subsequence: [.flag("-serialize-diagnostics-path"), .path(.absolute(.init(validating: "/build/Foo-test.dia")))])) + XCTAssertTrue(plannedJobs[0].commandLine.contains(subsequence: [.flag("-serialize-diagnostics-path"), .path(.absolute(try .init(validating: "/build/Foo-test.dia")))])) } } @@ -1770,7 +1771,7 @@ final class SwiftDriverTests: XCTestCase { XCTAssertTrue(cmd.contains(.flag("-dynamiclib"))) XCTAssertTrue(cmd.contains(.flag("-w"))) XCTAssertTrue(cmd.contains(.flag("-L"))) - try XCTAssertTrue(cmd.contains(.path(.absolute(AbsolutePath(validating: "/tmp"))))) + XCTAssertTrue(cmd.contains(.path(.absolute(try .init(validating: "/tmp"))))) XCTAssertEqual(linkJob.outputs[0].file, try VirtualPath(path: "libTest.dylib")) XCTAssertFalse(cmd.contains(.flag("-static"))) @@ -1866,10 +1867,10 @@ final class SwiftDriverTests: XCTestCase { let cmd = linkJob.commandLine XCTAssertTrue(linkJob.inputs.contains { matchTemporary($0.file, "foo.o") && $0.type == .object }) XCTAssertTrue(linkJob.inputs.contains { matchTemporary($0.file, "bar.o") && $0.type == .object }) - XCTAssertTrue(linkJob.inputs.contains(.init(file: VirtualPath.relative(.init("baz.o")).intern(), type: .object))) + XCTAssertTrue(linkJob.inputs.contains(.init(file: VirtualPath.relative(try .init(validating: "baz.o")).intern(), type: .object))) XCTAssertTrue(commandContainsTemporaryPath(cmd, "foo.o")) XCTAssertTrue(commandContainsTemporaryPath(cmd, "bar.o")) - XCTAssertTrue(cmd.contains(.path(.relative(.init("baz.o"))))) + XCTAssertTrue(cmd.contains(.path(.relative(try .init(validating: "baz.o"))))) } do { @@ -1894,8 +1895,7 @@ final class SwiftDriverTests: XCTestCase { // linker, so be consistent with this XCTAssertFalse(cmd.contains(.flag("-w"))) XCTAssertFalse(cmd.contains(.flag("-L"))) - try XCTAssertFalse(cmd.contains(.path(.absolute(AbsolutePath(validating: "/tmp"))))) - + XCTAssertFalse(cmd.contains(.path(.absolute(try .init(validating: "/tmp"))))) XCTAssertFalse(cmd.contains(.flag("-dylib"))) XCTAssertFalse(cmd.contains(.flag("-shared"))) } @@ -1924,8 +1924,7 @@ final class SwiftDriverTests: XCTestCase { // linker, so be consistent with this XCTAssertFalse(cmd.contains(.flag("-w"))) XCTAssertFalse(cmd.contains(.flag("-L"))) - try XCTAssertFalse(cmd.contains(.path(.absolute(AbsolutePath(validating: "/tmp"))))) - + XCTAssertFalse(cmd.contains(.path(.absolute(try .init(validating: "/tmp"))))) XCTAssertFalse(cmd.contains(.flag("-dylib"))) XCTAssertFalse(cmd.contains(.flag("-shared"))) XCTAssertFalse(cmd.contains("-force_load")) @@ -2002,7 +2001,7 @@ final class SwiftDriverTests: XCTestCase { XCTAssertTrue(cmd.contains(.flag("-o"))) XCTAssertTrue(commandContainsTemporaryPath(cmd, "foo.o")) XCTAssertTrue(commandContainsTemporaryPath(cmd, "bar.o")) - XCTAssertTrue(cmd.contains(.joinedOptionAndPath("-Wl,-add_ast_path,", .relative(.init("Test.swiftmodule"))))) + XCTAssertTrue(cmd.contains(.joinedOptionAndPath("-Wl,-add_ast_path,", .relative(try .init(validating: "Test.swiftmodule"))))) XCTAssertTrue(cmd.contains(.flag("-O0"))) XCTAssertEqual(linkJob.outputs[0].file, try VirtualPath(path: "Test")) @@ -2044,7 +2043,11 @@ final class SwiftDriverTests: XCTestCase { // Linux shared objects (.so) are not offered to autolink-extract try withTemporaryDirectory { path in try localFileSystem.writeFileContents( - path.appending(components: "libEmpty.so")) { $0 <<< "/* empty */" } + path.appending(components: "libEmpty.so"), bytes: + """ + /* empty */ + """ + ) var driver = try Driver(args: commonArgs + ["-emit-executable", "-target", "x86_64-unknown-linux", "libEmpty.so"], env: env) let plannedJobs = try driver.planBuild() @@ -2219,7 +2222,7 @@ final class SwiftDriverTests: XCTestCase { let linkJob = plannedJobs[3] let cmd = linkJob.commandLine XCTAssertTrue(cmd.contains(subsequence: ["-target", "wasm32-unknown-wasi"])) - try XCTAssertTrue(cmd.contains(subsequence: ["--sysroot", .path(.absolute(.init(validating: "/sdk/path")))])) + XCTAssertTrue(cmd.contains(subsequence: ["--sysroot", .path(.absolute(try .init(validating: "/sdk/path")))])) XCTAssertTrue(cmd.contains(.path(.absolute(path.appending(components: "wasi", "wasm32", "swiftrt.o"))))) XCTAssertTrue(commandContainsTemporaryPath(cmd, "foo.o")) XCTAssertTrue(commandContainsTemporaryPath(cmd, "bar.o")) @@ -2313,7 +2316,7 @@ final class SwiftDriverTests: XCTestCase { let result = try process.waitUntilExit() guard result.exitStatus == .terminated(code: EXIT_SUCCESS) else { return nil } guard let path = String(bytes: try result.output.get(), encoding: .utf8) else { return nil } - return try path.isEmpty ? nil : AbsolutePath(validating: path.spm_chomp()) + return path.isEmpty ? nil : try AbsolutePath(validating: path.spm_chomp()) #endif } @@ -2738,7 +2741,7 @@ final class SwiftDriverTests: XCTestCase { XCTAssertTrue(matchTemporary(plannedJobs[2].outputs.first!.file, "foo5.o")) XCTAssertTrue(plannedJobs[3].tool.name.contains("clang")) XCTAssertEqual(plannedJobs[3].outputs.count, 1) - XCTAssertEqual(plannedJobs[3].outputs.first!.file, VirtualPath.relative(RelativePath(executableName("Test")))) + XCTAssertEqual(plannedJobs[3].outputs.first!.file, VirtualPath.relative(try RelativePath(validating: executableName("Test")))) } // Test 1 partition results in 1 job @@ -2783,15 +2786,15 @@ final class SwiftDriverTests: XCTestCase { let emitModuleJob = try plannedJobs.findJob(.emitModule) XCTAssertEqual(emitModuleJob.outputs.count, driver1.targetTriple.isDarwin ? 8 : 7) - XCTAssertEqual(emitModuleJob.outputs[0].file, VirtualPath.relative(RelativePath("Test.swiftmodule"))) - XCTAssertEqual(emitModuleJob.outputs[1].file, VirtualPath.relative(RelativePath("Test.swiftdoc"))) - XCTAssertEqual(emitModuleJob.outputs[2].file, VirtualPath.relative(RelativePath("Test.swiftsourceinfo"))) - XCTAssertEqual(emitModuleJob.outputs[3].file, VirtualPath.relative(RelativePath("Test.swiftinterface"))) - XCTAssertEqual(emitModuleJob.outputs[4].file, VirtualPath.relative(RelativePath("Test.private.swiftinterface"))) - XCTAssertEqual(emitModuleJob.outputs[5].file, VirtualPath.relative(RelativePath("Test-Swift.h"))) - XCTAssertEqual(emitModuleJob.outputs[6].file, VirtualPath.relative(RelativePath("Test.tbd"))) + XCTAssertEqual(emitModuleJob.outputs[0].file, VirtualPath.relative(try RelativePath(validating: "Test.swiftmodule"))) + XCTAssertEqual(emitModuleJob.outputs[1].file, VirtualPath.relative(try RelativePath(validating: "Test.swiftdoc"))) + XCTAssertEqual(emitModuleJob.outputs[2].file, VirtualPath.relative(try RelativePath(validating: "Test.swiftsourceinfo"))) + XCTAssertEqual(emitModuleJob.outputs[3].file, VirtualPath.relative(try RelativePath(validating: "Test.swiftinterface"))) + XCTAssertEqual(emitModuleJob.outputs[4].file, VirtualPath.relative(try RelativePath(validating: "Test.private.swiftinterface"))) + XCTAssertEqual(emitModuleJob.outputs[5].file, VirtualPath.relative(try RelativePath(validating: "Test-Swift.h"))) + XCTAssertEqual(emitModuleJob.outputs[6].file, VirtualPath.relative(try RelativePath(validating: "Test.tbd"))) if driver1.targetTriple.isDarwin { - XCTAssertEqual(emitModuleJob.outputs[7].file, VirtualPath.relative(RelativePath("Test.abi.json"))) + XCTAssertEqual(emitModuleJob.outputs[7].file, VirtualPath.relative(try RelativePath(validating: "Test.abi.json"))) } XCTAssert(!emitModuleJob.commandLine.contains(.flag("-primary-file"))) XCTAssert(emitModuleJob.commandLine.contains(.flag("-emit-module-interface-path"))) @@ -2831,8 +2834,8 @@ final class SwiftDriverTests: XCTestCase { // This is to match the legacy driver behavior // Make sure the supplementary output map has an entry for the Swift file // under indexing and its indexData entry is the primary output file - let entry = map.entries[VirtualPath.relative(RelativePath("foo5.swift")).intern()]! - XCTAssert(VirtualPath.lookup(entry[.indexData]!) == .absolute(try AbsolutePath(validating: "/tmp/t.o"))) + let entry = map.entries[VirtualPath.relative(try RelativePath(validating: "foo5.swift")).intern()]! + XCTAssert(VirtualPath.lookup(entry[.indexData]!) == .absolute(try .init(validating: "/tmp/t.o"))) return default: break @@ -2869,10 +2872,10 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(plannedJobs.count, 1) XCTAssertEqual(plannedJobs[0].kind, .compile) XCTAssertEqual(plannedJobs[0].inputs.count, 2) - XCTAssertEqual(plannedJobs[0].inputs[0].file, VirtualPath.relative(RelativePath("main.swift"))) - XCTAssertEqual(plannedJobs[0].inputs[1].file, VirtualPath.relative(RelativePath("multi-threaded.swift"))) + XCTAssertEqual(plannedJobs[0].inputs[0].file, VirtualPath.relative(try RelativePath(validating: "main.swift"))) + XCTAssertEqual(plannedJobs[0].inputs[1].file, VirtualPath.relative(try RelativePath(validating: "multi-threaded.swift"))) XCTAssertEqual(plannedJobs[0].outputs.count, driver.targetTriple.isDarwin ? 4 : 3) - XCTAssertEqual(plannedJobs[0].outputs[0].file, VirtualPath.relative(RelativePath("test.swiftmodule"))) + XCTAssertEqual(plannedJobs[0].outputs[0].file, VirtualPath.relative(try RelativePath(validating: "test.swiftmodule"))) } } @@ -2933,10 +2936,10 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(plannedJobs.count, 1) XCTAssertEqual(plannedJobs[0].kind, .compile) XCTAssertEqual(plannedJobs[0].inputs.count, 2) - XCTAssertEqual(plannedJobs[0].inputs[0].file, VirtualPath.relative(RelativePath("main.swift"))) - XCTAssertEqual(plannedJobs[0].inputs[1].file, VirtualPath.relative(RelativePath("multi-threaded.swift"))) + XCTAssertEqual(plannedJobs[0].inputs[0].file, VirtualPath.relative(try RelativePath(validating: "main.swift"))) + XCTAssertEqual(plannedJobs[0].inputs[1].file, VirtualPath.relative(try RelativePath(validating: "multi-threaded.swift"))) XCTAssertEqual(plannedJobs[0].outputs.count, driver.targetTriple.isDarwin ? 4 : 3) - XCTAssertEqual(plannedJobs[0].outputs[0].file, VirtualPath.relative(RelativePath("test.swiftmodule"))) + XCTAssertEqual(plannedJobs[0].outputs[0].file, VirtualPath.relative(try RelativePath(validating: "test.swiftmodule"))) } } @@ -2948,7 +2951,7 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(plannedJobs.count, 1) XCTAssertEqual(plannedJobs[0].kind, .interpret) XCTAssertEqual(plannedJobs[0].inputs.count, 1) - XCTAssertEqual(plannedJobs[0].inputs[0].file, VirtualPath.relative(RelativePath("main.swift"))) + XCTAssertEqual(plannedJobs[0].inputs[0].file, VirtualPath.relative(try RelativePath(validating: "main.swift"))) } } @@ -2980,10 +2983,10 @@ final class SwiftDriverTests: XCTestCase { XCTAssertTrue(matchTemporary(plannedJobs[0].outputs[1].file, "bar.o")) XCTAssertTrue(matchTemporary(plannedJobs[0].outputs[2].file, "wibble.o")) XCTAssert(!plannedJobs[0].commandLine.contains(.flag("-primary-file"))) - let emitModuleJob = try plannedJobs.findJob(.emitModule) - XCTAssertEqual(emitModuleJob.outputs[3].file, VirtualPath.absolute(try AbsolutePath(validating: "/tmp/salty/Test.swiftinterface"))) - XCTAssert(!emitModuleJob.commandLine.contains(.flag("-primary-file"))) + let emitModuleJob = plannedJobs.first(where: {$0.kind == .emitModule})! + XCTAssertEqual(emitModuleJob.outputs[3].file, VirtualPath.absolute(try .init(validating: "/tmp/salty/Test.swiftinterface"))) + XCTAssert(!emitModuleJob.commandLine.contains(.flag("-primary-file"))) XCTAssertEqual(plannedJobs[2].kind, .link) } } @@ -3009,8 +3012,7 @@ final class SwiftDriverTests: XCTestCase { let moduleJob = try plannedJobs.findJob(.emitModule) XCTAssertTrue(moduleJob.commandLine.contains("-module-alias")) XCTAssertTrue(moduleJob.commandLine.contains("Car=Bar")) - XCTAssertEqual(moduleJob.outputs[0].file, .absolute(try AbsolutePath(validating: "/tmp/dir/Foo.swiftmodule"))) - + XCTAssertEqual(moduleJob.outputs[0].file, .absolute(try .init(validating: "/tmp/dir/Foo.swiftmodule"))) XCTAssertEqual(driver.moduleOutputInfo.name, "Foo") XCTAssertNotNil(driver.moduleOutputInfo.aliases) XCTAssertEqual(driver.moduleOutputInfo.aliases!.count, 1) @@ -3152,11 +3154,11 @@ final class SwiftDriverTests: XCTestCase { XCTAssertTrue(plannedJobs[2].tool.name.contains("swift")) XCTAssertEqual(plannedJobs[2].outputs.count, driver.targetTriple.isDarwin ? 4 : 3) - XCTAssertEqual(plannedJobs[2].outputs[0].file, .relative(RelativePath("Test.swiftmodule"))) - XCTAssertEqual(plannedJobs[2].outputs[1].file, .relative(RelativePath("Test.swiftdoc"))) - XCTAssertEqual(plannedJobs[2].outputs[2].file, .absolute(try AbsolutePath(validating: "/foo/bar/Test.swiftsourceinfo"))) + XCTAssertEqual(plannedJobs[2].outputs[0].file, .relative(try RelativePath(validating: "Test.swiftmodule"))) + XCTAssertEqual(plannedJobs[2].outputs[1].file, .relative(try RelativePath(validating: "Test.swiftdoc"))) + XCTAssertEqual(plannedJobs[2].outputs[2].file, .absolute(try .init(validating: "/foo/bar/Test.swiftsourceinfo"))) if driver.targetTriple.isDarwin { - XCTAssertEqual(plannedJobs[2].outputs[3].file, .relative(RelativePath("Test.abi.json"))) + XCTAssertEqual(plannedJobs[2].outputs[3].file, .relative(try RelativePath(validating: "Test.abi.json"))) } XCTAssert(plannedJobs[2].commandLine.contains(.flag("-import-objc-header"))) } @@ -3169,11 +3171,11 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(plannedJobs.count, 3) XCTAssertTrue(plannedJobs[2].tool.name.contains("swift")) XCTAssertEqual(plannedJobs[2].outputs.count, driver.targetTriple.isDarwin ? 4 : 3) - try XCTAssertEqual(plannedJobs[2].outputs[0].file, .absolute(AbsolutePath(validating: rebase("Test.swiftmodule", at: root)))) - try XCTAssertEqual(plannedJobs[2].outputs[1].file, .absolute(AbsolutePath(validating: rebase("Test.swiftdoc", at: root)))) - try XCTAssertEqual(plannedJobs[2].outputs[2].file, .absolute(AbsolutePath(validating: rebase("Test.swiftsourceinfo", at: root)))) + XCTAssertEqual(plannedJobs[2].outputs[0].file, .absolute(try .init(validating: rebase("Test.swiftmodule", at: root)))) + XCTAssertEqual(plannedJobs[2].outputs[1].file, .absolute(try .init(validating: rebase("Test.swiftdoc", at: root)))) + XCTAssertEqual(plannedJobs[2].outputs[2].file, .absolute(try .init(validating: rebase("Test.swiftsourceinfo", at: root)))) if driver.targetTriple.isDarwin { - try XCTAssertEqual(plannedJobs[2].outputs[3].file, .absolute(AbsolutePath(validating: rebase("Test.abi.json", at: root)))) + XCTAssertEqual(plannedJobs[2].outputs[3].file, .absolute(try .init(validating: rebase("Test.abi.json", at: root)))) } } @@ -3184,11 +3186,11 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(plannedJobs.count, 3) XCTAssertTrue(plannedJobs[2].tool.name.contains("swift")) XCTAssertEqual(plannedJobs[2].outputs.count, driver.targetTriple.isDarwin ? 4 : 3) - XCTAssertEqual(plannedJobs[2].outputs[0].file, .relative(RelativePath("Test.swiftmodule"))) - XCTAssertEqual(plannedJobs[2].outputs[1].file, .relative(RelativePath("Test.swiftdoc"))) - XCTAssertEqual(plannedJobs[2].outputs[2].file, .relative(RelativePath("Test.swiftsourceinfo"))) + XCTAssertEqual(plannedJobs[2].outputs[0].file, .relative(try RelativePath(validating: "Test.swiftmodule"))) + XCTAssertEqual(plannedJobs[2].outputs[1].file, .relative(try RelativePath(validating: "Test.swiftdoc"))) + XCTAssertEqual(plannedJobs[2].outputs[2].file, .relative(try RelativePath(validating: "Test.swiftsourceinfo"))) if driver.targetTriple.isDarwin { - XCTAssertEqual(plannedJobs[2].outputs[3].file, .relative(RelativePath("Test.abi.json"))) + XCTAssertEqual(plannedJobs[2].outputs[3].file, .relative(try RelativePath(validating: "Test.abi.json"))) } } @@ -3199,11 +3201,11 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(plannedJobs.count, 3) XCTAssertTrue(plannedJobs[2].tool.name.contains("swift")) XCTAssertEqual(plannedJobs[2].outputs.count, driver.targetTriple.isDarwin ? 4 : 3) - XCTAssertEqual(plannedJobs[2].outputs[0].file, .relative(RelativePath("Test.swiftmodule"))) - XCTAssertEqual(plannedJobs[2].outputs[1].file, .relative(RelativePath("Test.swiftdoc"))) - XCTAssertEqual(plannedJobs[2].outputs[2].file, .relative(RelativePath("Test.swiftsourceinfo"))) + XCTAssertEqual(plannedJobs[2].outputs[0].file, .relative(try RelativePath(validating: "Test.swiftmodule"))) + XCTAssertEqual(plannedJobs[2].outputs[1].file, .relative(try RelativePath(validating: "Test.swiftdoc"))) + XCTAssertEqual(plannedJobs[2].outputs[2].file, .relative(try RelativePath(validating: "Test.swiftsourceinfo"))) if driver.targetTriple.isDarwin { - XCTAssertEqual(plannedJobs[2].outputs[3].file, .relative(RelativePath("Test.abi.json"))) + XCTAssertEqual(plannedJobs[2].outputs[3].file, .relative(try RelativePath(validating: "Test.abi.json"))) } } @@ -3217,7 +3219,7 @@ final class SwiftDriverTests: XCTestCase { XCTAssertTrue(matchTemporary(plannedJobs[0].outputs[0].file, "input.swiftmodule")) XCTAssertEqual(plannedJobs[1].kind, .mergeModule) XCTAssertTrue(matchTemporary(plannedJobs[1].inputs[0].file, "input.swiftmodule")) - XCTAssertEqual(plannedJobs[1].outputs[0].file, .absolute(try AbsolutePath(validating: "/tmp/test.swiftmodule"))) + XCTAssertEqual(plannedJobs[1].outputs[0].file, .absolute(try .init(validating: "/tmp/test.swiftmodule"))) } } @@ -3236,11 +3238,11 @@ final class SwiftDriverTests: XCTestCase { XCTAssertTrue(plannedJobs[0].tool.name.contains("swift")) XCTAssertTrue(plannedJobs[0].commandLine.contains(.flag("-parse-as-library"))) XCTAssertEqual(plannedJobs[0].outputs.count, driver.targetTriple.isDarwin ? 4 : 3) - XCTAssertEqual(plannedJobs[0].outputs[0].file, .absolute(try AbsolutePath(validating: rebase("Test.swiftmodule", at: root)))) - XCTAssertEqual(plannedJobs[0].outputs[1].file, .absolute(try AbsolutePath(validating: rebase("Test.swiftdoc", at: root)))) - XCTAssertEqual(plannedJobs[0].outputs[2].file, .absolute(try AbsolutePath(validating: rebase("Test.swiftsourceinfo", at: root)))) + XCTAssertEqual(plannedJobs[0].outputs[0].file, .absolute(try .init(validating: rebase("Test.swiftmodule", at: root)))) + XCTAssertEqual(plannedJobs[0].outputs[1].file, .absolute(try .init(validating: rebase("Test.swiftdoc", at: root)))) + XCTAssertEqual(plannedJobs[0].outputs[2].file, .absolute(try .init(validating: rebase("Test.swiftsourceinfo", at: root)))) if driver.targetTriple.isDarwin { - XCTAssertEqual(plannedJobs[0].outputs[3].file, .absolute(try AbsolutePath(validating: rebase("Test.abi.json", at: root)))) + XCTAssertEqual(plannedJobs[0].outputs[3].file, .absolute(try .init(validating: rebase("Test.abi.json", at: root)))) } // We don't know the output file of the symbol graph, just make sure the flag is passed along. @@ -3258,11 +3260,11 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(Set(plannedJobs.map { $0.kind }), Set([.emitModule, .compile])) XCTAssertTrue(plannedJobs[0].tool.name.contains("swift")) XCTAssertEqual(plannedJobs[0].outputs.count, driver.targetTriple.isDarwin ? 4 : 3) - XCTAssertEqual(plannedJobs[0].outputs[0].file, .absolute(try AbsolutePath(validating: rebase("Test.swiftmodule", at: root)))) - XCTAssertEqual(plannedJobs[0].outputs[1].file, .absolute(try AbsolutePath(validating: rebase("Test.swiftdoc", at: root)))) - XCTAssertEqual(plannedJobs[0].outputs[2].file, .absolute(try AbsolutePath(validating: rebase("Test.swiftsourceinfo", at: root)))) + XCTAssertEqual(plannedJobs[0].outputs[0].file, .absolute(try .init(validating: rebase("Test.swiftmodule", at: root)))) + XCTAssertEqual(plannedJobs[0].outputs[1].file, .absolute(try .init(validating: rebase("Test.swiftdoc", at: root)))) + XCTAssertEqual(plannedJobs[0].outputs[2].file, .absolute(try .init(validating: rebase("Test.swiftsourceinfo", at: root)))) if driver.targetTriple.isDarwin { - XCTAssertEqual(plannedJobs[0].outputs[3].file, .absolute(try AbsolutePath(validating: rebase("Test.abi.json", at: root)))) + XCTAssertEqual(plannedJobs[0].outputs[3].file, .absolute(try .init(validating: rebase("Test.abi.json", at: root)))) } } @@ -3318,11 +3320,11 @@ final class SwiftDriverTests: XCTestCase { let emitModuleJob = try plannedJobs.findJob(.emitModule) XCTAssertTrue(emitModuleJob.tool.name.contains("swift")) XCTAssertEqual(emitModuleJob.outputs.count, 3 + abiFileCount) - XCTAssertEqual(1, try emitModuleJob.outputs.filter({$0.file == .absolute(try AbsolutePath(validating: rebase("Test.swiftmodule", at: root)))}).count) - XCTAssertEqual(1, try emitModuleJob.outputs.filter({$0.file == .absolute(try AbsolutePath(validating: rebase("Test.swiftdoc", at: root)))}).count) - XCTAssertEqual(1, try emitModuleJob.outputs.filter({$0.file == .absolute(try AbsolutePath(validating: rebase("Test.swiftsourceinfo", at: root)))}).count) + XCTAssertEqual(1, try emitModuleJob.outputs.filter({$0.file == .absolute(try .init(validating: rebase("Test.swiftmodule", at: root)))}).count) + XCTAssertEqual(1, try emitModuleJob.outputs.filter({$0.file == .absolute(try .init(validating: rebase("Test.swiftdoc", at: root)))}).count) + XCTAssertEqual(1, try emitModuleJob.outputs.filter({$0.file == .absolute(try .init(validating: rebase("Test.swiftsourceinfo", at: root)))}).count) if abiFileCount == 1 { - XCTAssertEqual(abiFileCount, try emitModuleJob.outputs.filter({$0.file == .absolute(try AbsolutePath(validating: rebase("Test.abi.json", at: root)))}).count) + XCTAssertEqual(abiFileCount, try emitModuleJob.outputs.filter({$0.file == .absolute(try .init(validating: rebase("Test.abi.json", at: root)))}).count) } // We don't know the output file of the symbol graph, just make sure the flag is passed along. @@ -3341,11 +3343,11 @@ final class SwiftDriverTests: XCTestCase { let emitModuleJob = plannedJobs[0] XCTAssertTrue(emitModuleJob.tool.name.contains("swift")) XCTAssertEqual(emitModuleJob.outputs.count, 3 + abiFileCount) - XCTAssertEqual(1, try emitModuleJob.outputs.filter({$0.file == .absolute(try AbsolutePath(validating: rebase("Test.swiftmodule", at: root)))}).count) - XCTAssertEqual(1, try emitModuleJob.outputs.filter({$0.file == .absolute(try AbsolutePath(validating: rebase("Test.swiftdoc", at: root)))}).count) - XCTAssertEqual(1, try emitModuleJob.outputs.filter({$0.file == .absolute(try AbsolutePath(validating: rebase("Test.swiftsourceinfo", at: root)))}).count) + XCTAssertEqual(1, try emitModuleJob.outputs.filter({$0.file == .absolute(try .init(validating: rebase("Test.swiftmodule", at: root)))}).count) + XCTAssertEqual(1, try emitModuleJob.outputs.filter({$0.file == .absolute(try .init(validating: rebase("Test.swiftdoc", at: root)))}).count) + XCTAssertEqual(1, try emitModuleJob.outputs.filter({$0.file == .absolute(try .init(validating: rebase("Test.swiftsourceinfo", at: root)))}).count) if abiFileCount == 1 { - XCTAssertEqual(abiFileCount, try emitModuleJob.outputs.filter({$0.file == .absolute(try AbsolutePath(validating: rebase("Test.abi.json", at: root)))}).count) + XCTAssertEqual(abiFileCount, try emitModuleJob.outputs.filter({$0.file == .absolute(try .init(validating: rebase("Test.abi.json", at: root)))}).count) } } @@ -3366,11 +3368,11 @@ final class SwiftDriverTests: XCTestCase { let compileJob = try plannedJobs.findJob(.compile) XCTAssertEqual(compileJob.outputs.count, 4 + abiFileCount) XCTAssertEqual(1, compileJob.outputs.filter({$0.type == .object}).count) - XCTAssertEqual(1, try compileJob.outputs.filter({$0.file == .absolute(try AbsolutePath(validating: rebase("Test.swiftmodule", at: root)))}).count) - XCTAssertEqual(1, try compileJob.outputs.filter({$0.file == .absolute(try AbsolutePath(validating: rebase("Test.swiftdoc", at: root)))}).count) - XCTAssertEqual(1, try compileJob.outputs.filter({$0.file == .absolute(try AbsolutePath(validating: rebase("Test.swiftsourceinfo", at: root)))}).count) + XCTAssertEqual(1, try compileJob.outputs.filter({$0.file == .absolute(try .init(validating: rebase("Test.swiftmodule", at: root)))}).count) + XCTAssertEqual(1, try compileJob.outputs.filter({$0.file == .absolute(try .init(validating: rebase("Test.swiftdoc", at: root)))}).count) + XCTAssertEqual(1, try compileJob.outputs.filter({$0.file == .absolute(try .init(validating: rebase("Test.swiftsourceinfo", at: root)))}).count) if abiFileCount == 1 { - XCTAssertEqual(abiFileCount, try compileJob.outputs.filter({$0.file == .absolute(try AbsolutePath(validating: rebase("Test.abi.json", at: root)))}).count) + XCTAssertEqual(abiFileCount, try compileJob.outputs.filter({$0.file == .absolute(try .init(validating: rebase("Test.abi.json", at: root)))}).count) } } @@ -3589,7 +3591,7 @@ final class SwiftDriverTests: XCTestCase { let job = plannedJobs[0] XCTAssertTrue(job.requiresInPlaceExecution) XCTAssertEqual(job.inputs.count, 1) - XCTAssertEqual(job.inputs[0].file, .relative(RelativePath("foo.swift"))) + XCTAssertEqual(job.inputs[0].file, .relative(try RelativePath(validating: "foo.swift"))) XCTAssertEqual(job.outputs.count, 0) XCTAssertTrue(job.commandLine.contains(.flag("-frontend"))) XCTAssertTrue(job.commandLine.contains(.flag("-interpret"))) @@ -3637,7 +3639,7 @@ final class SwiftDriverTests: XCTestCase { let job = plannedJobs[0] XCTAssertTrue(job.requiresInPlaceExecution) XCTAssertEqual(job.inputs.count, 1) - XCTAssertEqual(job.inputs[0].file, .relative(RelativePath("foo.swift"))) + XCTAssertEqual(job.inputs[0].file, .relative(try RelativePath(validating: "foo.swift"))) XCTAssertEqual(job.outputs.count, 0) XCTAssertTrue(job.commandLine.contains(.flag("-frontend"))) XCTAssertTrue(job.commandLine.contains(.flag("-interpret"))) @@ -3656,7 +3658,7 @@ final class SwiftDriverTests: XCTestCase { let job = plannedJobs[0] XCTAssertTrue(job.requiresInPlaceExecution) XCTAssertEqual(job.inputs.count, 1) - XCTAssertEqual(job.inputs[0].file, .relative(RelativePath("foo.swift"))) + XCTAssertEqual(job.inputs[0].file, .relative(try RelativePath(validating: "foo.swift"))) XCTAssertEqual(job.outputs.count, 0) let envVar: String @@ -3788,7 +3790,7 @@ final class SwiftDriverTests: XCTestCase { func testClangTargetForExplicitModule() throws { #if os(macOS) - let sdkRoot = testInputsPath.appending(component: "SDKChecks").appending(component: "MacOSX10.15.sdk") + let sdkRoot = try testInputsPath.appending(component: "SDKChecks").appending(component: "MacOSX10.15.sdk") // Check -clang-target is on by default when explicit module is on. try withTemporaryDirectory { path in @@ -3810,9 +3812,11 @@ final class SwiftDriverTests: XCTestCase { // Check -clang-target is handled correctly with the MacCatalyst remap. try withTemporaryDirectory { path in let main = path.appending(component: "Foo.swift") - try localFileSystem.writeFileContents(main) { - $0 <<< "import Swift" - } + try localFileSystem.writeFileContents(main, bytes: + """ + import Swift + """ + ) var driver = try Driver(args: ["swiftc", "-explicit-module-build", "-target", "arm64e-apple-ios13.0-macabi", "-sdk", sdkRoot.pathString, @@ -3851,7 +3855,7 @@ final class SwiftDriverTests: XCTestCase { var envVars = ProcessEnv.vars envVars["SWIFT_DRIVER_LD_EXEC"] = ld.nativePathString(escaped: false) - let sdkRoot = testInputsPath.appending(component: "SDKChecks").appending(component: "iPhoneOS.sdk") + let sdkRoot = try testInputsPath.appending(component: "SDKChecks").appending(component: "iPhoneOS.sdk") var driver = try Driver(args: ["swiftc", "-target", "arm64-apple-ios12.0", "foo.swift", "-sdk", sdkRoot.pathString], @@ -3878,7 +3882,7 @@ final class SwiftDriverTests: XCTestCase { } func testEnvironmentInferenceWarning() throws { - let sdkRoot = testInputsPath.appending(component: "SDKChecks").appending(component: "iPhoneOS.sdk") + let sdkRoot = try testInputsPath.appending(component: "SDKChecks").appending(component: "iPhoneOS.sdk") try assertDriverDiagnostics(args: ["swiftc", "-target", "x86_64-apple-ios13.0", "foo.swift", "-sdk", sdkRoot.pathString]) { $1.expect(.warning("inferring simulator environment for target 'x86_64-apple-ios13.0'; use '-target x86_64-apple-ios13.0-simulator'")) @@ -4219,6 +4223,7 @@ final class SwiftDriverTests: XCTestCase { ] try localFileSystem.writeFileContents(ld, bytes: contents) try localFileSystem.chmod(.executable, path: try AbsolutePath(validating: ld.pathString)) + // Drop SWIFT_DRIVER_CLANG_EXEC from the environment so it doesn't // interfere with tool lookup. var env = ProcessEnv.vars @@ -4392,14 +4397,14 @@ final class SwiftDriverTests: XCTestCase { } func testDarwinSDKTooOld() throws { - func getSDKPath(sdkDirName: String) -> AbsolutePath { - return testInputsPath.appending(component: "SDKChecks").appending(component: sdkDirName) + func getSDKPath(sdkDirName: String) throws -> AbsolutePath { + return try testInputsPath.appending(component: "SDKChecks").appending(component: sdkDirName) } // Ensure an error is emitted for an unsupported SDK func checkSDKUnsupported(sdkDirName: String) throws { - let sdkPath = getSDKPath(sdkDirName: sdkDirName) + let sdkPath = try getSDKPath(sdkDirName: sdkDirName) // Get around the check for SDK's existence try localFileSystem.createDirectory(sdkPath) let args = [ "swiftc", "foo.swift", "-target", "x86_64-apple-macosx10.9", "-sdk", sdkPath.pathString ] @@ -4410,7 +4415,7 @@ final class SwiftDriverTests: XCTestCase { // Ensure no error is emitted for a supported SDK func checkSDKOkay(sdkDirName: String) throws { - let sdkPath = getSDKPath(sdkDirName: sdkDirName) + let sdkPath = try getSDKPath(sdkDirName: sdkDirName) try localFileSystem.createDirectory(sdkPath) let args = [ "swiftc", "foo.swift", "-target", "x86_64-apple-macosx10.9", "-sdk", sdkPath.pathString ] try assertNoDiagnostics { de in let _ = try Driver(args: args, diagnosticsEngine: de) } @@ -4641,7 +4646,7 @@ final class SwiftDriverTests: XCTestCase { let job = plannedJobs[0] XCTAssertTrue( job.commandLine.contains(subsequence: ["-emit-loaded-module-trace-path", - .path(.relative(.init("foo.trace.json")))]) + .path(.relative(try .init(validating: "foo.trace.json")))]) ) } do { @@ -4649,9 +4654,9 @@ final class SwiftDriverTests: XCTestCase { "-emit-loaded-module-trace", "foo.swift", "bar.swift", "baz.swift"]) let plannedJobs = try driver.planBuild() - let tracedJobs = plannedJobs.filter { + let tracedJobs = try plannedJobs.filter { $0.commandLine.contains(subsequence: ["-emit-loaded-module-trace-path", - .path(.relative(.init("main.trace.json")))]) + .path(.relative(try .init(validating: "main.trace.json")))]) } XCTAssertEqual(tracedJobs.count, 1) } @@ -4661,12 +4666,12 @@ final class SwiftDriverTests: XCTestCase { var driver = try Driver(args: ["swiftc", "-emit-loaded-module-trace", "foo.o", "bar.swift", "baz.o"]) let plannedJobs = try driver.planBuild() - let tracedJobs = plannedJobs.filter { + let tracedJobs = try plannedJobs.filter { $0.commandLine.contains(subsequence: ["-emit-loaded-module-trace-path", - .path(.relative(.init("main.trace.json")))]) + .path(.relative(try .init(validating: "main.trace.json")))]) } XCTAssertEqual(tracedJobs.count, 1) - XCTAssertTrue(tracedJobs[0].inputs.contains(.init(file: VirtualPath.relative(.init("bar.swift")).intern(), type: .swift))) + XCTAssertTrue(tracedJobs[0].inputs.contains(.init(file: VirtualPath.relative(try .init(validating: "bar.swift")).intern(), type: .swift))) } do { var env = ProcessEnv.vars @@ -4678,8 +4683,8 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(plannedJobs.count, 1) let job = plannedJobs[0] XCTAssertTrue( - try job.commandLine.contains(subsequence: ["-emit-loaded-module-trace-path", - .path(.absolute(.init(validating: "/some/path/to/the.trace.json")))]) + job.commandLine.contains(subsequence: ["-emit-loaded-module-trace-path", + .path(.absolute(try .init(validating: "/some/path/to/the.trace.json")))]) ) } } @@ -5395,7 +5400,7 @@ final class SwiftDriverTests: XCTestCase { let plannedJobs = try driver.planBuild() XCTAssertEqual(plannedJobs.count, 1) XCTAssertTrue(plannedJobs[0].commandLine.contains(.flag("-emit-bc"))) - XCTAssertEqual(plannedJobs[0].outputs.first!.file, VirtualPath.relative(RelativePath("foo.bc"))) + XCTAssertEqual(plannedJobs[0].outputs.first!.file, VirtualPath.relative(try RelativePath(validating: "foo.bc"))) } func testScanDependenciesOption() throws { @@ -5606,7 +5611,7 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(plannedJobs[0].kind, .generatePCH) XCTAssertEqual(plannedJobs[0].inputs.count, 1) - XCTAssertEqual(plannedJobs[0].inputs[0].file.nativePathString(escaped: false), VirtualPath.relative(RelativePath("TestInputHeader.h")).nativePathString(escaped: false)) + XCTAssertEqual(plannedJobs[0].inputs[0].file.nativePathString(escaped: false), VirtualPath.relative(try RelativePath(validating: "TestInputHeader.h")).nativePathString(escaped: false)) XCTAssertEqual(plannedJobs[0].inputs[0].type, .objcHeader) XCTAssertEqual(plannedJobs[0].outputs.count, 1) XCTAssertTrue(matchTemporary(plannedJobs[0].outputs[0].file, "TestInputHeader.pch")) @@ -5641,7 +5646,7 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(plannedJobs[0].kind, .generatePCH) XCTAssertEqual(plannedJobs[0].inputs.count, 1) - XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(RelativePath("TestInputHeader.h"))) + XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(try RelativePath(validating: "TestInputHeader.h"))) XCTAssertEqual(plannedJobs[0].inputs[0].type, .objcHeader) XCTAssertEqual(plannedJobs[0].outputs.count, 1) XCTAssertTrue(matchTemporary(plannedJobs[0].outputs[0].file, "TestInputHeader.pch")) @@ -5665,7 +5670,7 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(plannedJobs[0].kind, .generatePCH) XCTAssertEqual(plannedJobs[0].inputs.count, 1) - XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(RelativePath("TestInputHeader.h"))) + XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(try RelativePath(validating: "TestInputHeader.h"))) XCTAssertEqual(plannedJobs[0].inputs[0].type, .objcHeader) XCTAssertEqual(plannedJobs[0].outputs.count, 1) XCTAssertEqual(plannedJobs[0].outputs[0].file.nativePathString(escaped: false), try VirtualPath(path: "/pch/TestInputHeader.pch").nativePathString(escaped: false)) @@ -5688,7 +5693,7 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(plannedJobs[0].kind, .generatePCH) XCTAssertEqual(plannedJobs[0].inputs.count, 1) - XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(RelativePath("TestInputHeader.h"))) + XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(try RelativePath(validating: "TestInputHeader.h"))) XCTAssertEqual(plannedJobs[0].inputs[0].type, .objcHeader) XCTAssertEqual(plannedJobs[0].outputs.count, 1) XCTAssertEqual(plannedJobs[0].outputs[0].file.nativePathString(escaped: false), try VirtualPath(path: "/pch/TestInputHeader.pch").nativePathString(escaped: false)) @@ -5738,7 +5743,7 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(plannedJobs[0].kind, .generatePCH) XCTAssertEqual(plannedJobs[0].inputs.count, 1) - XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(RelativePath("TestInputHeader.h"))) + XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(try RelativePath(validating: "TestInputHeader.h"))) XCTAssertEqual(plannedJobs[0].inputs[0].type, .objcHeader) XCTAssertEqual(plannedJobs[0].outputs.count, 2) XCTAssertTrue(matchTemporary(plannedJobs[0].outputs[0].file, "TestInputHeader.dia")) @@ -5765,7 +5770,7 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(plannedJobs[0].kind, .generatePCH) XCTAssertEqual(plannedJobs[0].inputs.count, 1) - XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(RelativePath("TestInputHeader.h"))) + XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(try RelativePath(validating: "TestInputHeader.h"))) XCTAssertEqual(plannedJobs[0].inputs[0].type, .objcHeader) XCTAssertEqual(plannedJobs[0].outputs.count, 2) XCTAssertNotNil(plannedJobs[0].outputs[0].file.name.range(of: #"[\\/]pch[\\/]TestInputHeader-.*.dia"#, options: .regularExpression)) @@ -5797,7 +5802,7 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(plannedJobs[0].kind, .generatePCH) XCTAssertEqual(plannedJobs[0].inputs.count, 1) - XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(RelativePath("TestInputHeader.h"))) + XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(try RelativePath(validating: "TestInputHeader.h"))) XCTAssertEqual(plannedJobs[0].inputs[0].type, .objcHeader) XCTAssertEqual(plannedJobs[0].outputs.count, 1) XCTAssertEqual(plannedJobs[0].outputs[0].file.nativePathString(escaped: false), try VirtualPath(path: "/pch/TestInputHeader.pch").nativePathString(escaped: false)) @@ -5820,7 +5825,7 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(plannedJobs[0].kind, .generatePCH) XCTAssertEqual(plannedJobs[0].inputs.count, 1) - XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(RelativePath("TestInputHeader.h"))) + XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(try RelativePath(validating: "TestInputHeader.h"))) XCTAssertEqual(plannedJobs[0].inputs[0].type, .objcHeader) XCTAssertEqual(plannedJobs[0].outputs.count, 1) XCTAssertTrue(matchTemporary(plannedJobs[0].outputs[0].file, "TestInputHeader.pch")) @@ -5844,7 +5849,7 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(plannedJobs[0].kind, .generatePCH) XCTAssertEqual(plannedJobs[0].inputs.count, 1) - XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(RelativePath("header.h"))) + XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(try RelativePath(validating: "header.h"))) XCTAssertEqual(plannedJobs[0].inputs[0].type, .objcHeader) XCTAssertEqual(plannedJobs[0].outputs.count, 1) XCTAssertTrue(matchTemporary(plannedJobs[0].outputs[0].file, "header.pch")) @@ -5860,7 +5865,7 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(plannedJobs[2].kind, .mergeModule) XCTAssertTrue(plannedJobs[2].commandLine.contains(subsequence: ["-import-objc-header", - .path(.relative(RelativePath("header.h")))])) + .path(.relative(try RelativePath(validating: "header.h")))])) } // Immediate mode doesn't generate a pch @@ -5870,7 +5875,7 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(plannedJobs.count, 1) XCTAssertEqual(plannedJobs[0].kind, .interpret) XCTAssert(plannedJobs[0].commandLine.contains(.flag("-import-objc-header"))) - XCTAssert(plannedJobs[0].commandLine.contains(.path(.relative(RelativePath("TestInputHeader.h"))))) + XCTAssert(plannedJobs[0].commandLine.contains(.path(.relative(try RelativePath(validating: "TestInputHeader.h"))))) } } @@ -5882,9 +5887,9 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(plannedJobs[0].kind, .generatePCM) XCTAssertEqual(plannedJobs[0].inputs.count, 1) - XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(RelativePath("module.modulemap"))) + XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(try RelativePath(validating: "module.modulemap"))) XCTAssertEqual(plannedJobs[0].outputs.count, 1) - XCTAssertEqual(plannedJobs[0].outputs[0].file, .relative(RelativePath("Test.pcm"))) + XCTAssertEqual(plannedJobs[0].outputs[0].file, .relative(try RelativePath(validating: "Test.pcm"))) } } @@ -5896,7 +5901,7 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(plannedJobs[0].kind, .dumpPCM) XCTAssertEqual(plannedJobs[0].inputs.count, 1) - XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(RelativePath("module.pcm"))) + XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(try RelativePath(validating: "module.pcm"))) XCTAssertEqual(plannedJobs[0].outputs.count, 0) } } @@ -5910,10 +5915,10 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(plannedJobs.count, 1) XCTAssertEqual(plannedJobs[0].kind, .compile) let job = plannedJobs[0] - XCTAssertTrue(job.commandLine.contains(subsequence: [.path(.relative(.init("foo.swift"))), + XCTAssertTrue(job.commandLine.contains(subsequence: [.path(.relative(try .init(validating: "foo.swift"))), "-primary-file", - .path(.relative(.init("bar.swift"))), - .path(.relative(.init("baz.swift")))])) + .path(.relative(try .init(validating: "bar.swift"))), + .path(.relative(try .init(validating: "baz.swift")))])) } } @@ -5925,7 +5930,7 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(plannedJobs[0].kind, .compile) XCTAssertEqual(plannedJobs[0].inputs.count, 1) - XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(RelativePath("embed-bitcode.swift"))) + XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(try RelativePath(validating: "embed-bitcode.swift"))) XCTAssertEqual(plannedJobs[0].outputs.count, 1) XCTAssertTrue(matchTemporary(plannedJobs[0].outputs[0].file, "embed-bitcode.bc")) @@ -5937,7 +5942,7 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(plannedJobs[2].kind, .link) XCTAssertEqual(plannedJobs[2].outputs.count, 1) - XCTAssertEqual(plannedJobs[2].outputs[0].file, .relative(RelativePath("embed-bitcode"))) + XCTAssertEqual(plannedJobs[2].outputs[0].file, .relative(try RelativePath(validating: "embed-bitcode"))) } do { @@ -5947,8 +5952,8 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(plannedJobs[0].kind, .compile) XCTAssertEqual(plannedJobs[0].inputs.count, 2) - XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(RelativePath("main.swift"))) - XCTAssertEqual(plannedJobs[0].inputs[1].file, .relative(RelativePath("hi.swift"))) + XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(try RelativePath(validating: "main.swift"))) + XCTAssertEqual(plannedJobs[0].inputs[1].file, .relative(try RelativePath(validating: "hi.swift"))) XCTAssertEqual(plannedJobs[0].outputs.count, 1) XCTAssertTrue(matchTemporary(plannedJobs[0].outputs[0].file, "main.bc")) @@ -5960,8 +5965,8 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(plannedJobs[2].kind, .compile) XCTAssertEqual(plannedJobs[2].inputs.count, 2) - XCTAssertEqual(plannedJobs[2].inputs[0].file, .relative(RelativePath("main.swift"))) - XCTAssertEqual(plannedJobs[2].inputs[1].file, .relative(RelativePath("hi.swift"))) + XCTAssertEqual(plannedJobs[2].inputs[0].file, .relative(try RelativePath(validating: "main.swift"))) + XCTAssertEqual(plannedJobs[2].inputs[1].file, .relative(try RelativePath(validating: "hi.swift"))) XCTAssertEqual(plannedJobs[2].outputs.count, 1) XCTAssertTrue(matchTemporary(plannedJobs[2].outputs[0].file, "hi.bc")) @@ -5981,7 +5986,7 @@ final class SwiftDriverTests: XCTestCase { let compileJob = try plannedJobs.findJob(.compile) XCTAssertEqual(compileJob.inputs.count, 1) - XCTAssertEqual(compileJob.inputs[0].file, .relative(RelativePath("embed-bitcode.swift"))) + XCTAssertEqual(compileJob.inputs[0].file, .relative(try RelativePath(validating: "embed-bitcode.swift"))) XCTAssertEqual(compileJob.outputs.count, 1) XCTAssertTrue(matchTemporary(compileJob.outputs[0].file, "embed-bitcode.bc")) @@ -5989,17 +5994,17 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(backendJob.inputs.count, 1) XCTAssertTrue(matchTemporary(backendJob.inputs[0].file, "embed-bitcode.bc")) XCTAssertEqual(backendJob.outputs.count, 1) - XCTAssertEqual(backendJob.outputs[0].file, .relative(RelativePath("embed-bitcode.o"))) + XCTAssertEqual(backendJob.outputs[0].file, .relative(try RelativePath(validating: "embed-bitcode.o"))) let emitModuleJob = try plannedJobs.findJob(.emitModule) XCTAssertEqual(emitModuleJob.inputs.count, 1) - XCTAssertEqual(emitModuleJob.inputs[0].file, .relative(RelativePath("embed-bitcode.swift"))) + XCTAssertEqual(emitModuleJob.inputs[0].file, .relative(try RelativePath(validating: "embed-bitcode.swift"))) XCTAssertEqual(emitModuleJob.outputs.count, driver.targetTriple.isDarwin ? 4 : 3) - XCTAssertEqual(emitModuleJob.outputs[0].file, .relative(RelativePath("main.swiftmodule"))) - XCTAssertEqual(emitModuleJob.outputs[1].file, .relative(RelativePath("main.swiftdoc"))) - XCTAssertEqual(emitModuleJob.outputs[2].file, .relative(RelativePath("main.swiftsourceinfo"))) + XCTAssertEqual(emitModuleJob.outputs[0].file, .relative(try RelativePath(validating: "main.swiftmodule"))) + XCTAssertEqual(emitModuleJob.outputs[1].file, .relative(try RelativePath(validating: "main.swiftdoc"))) + XCTAssertEqual(emitModuleJob.outputs[2].file, .relative(try RelativePath(validating: "main.swiftsourceinfo"))) if driver.targetTriple.isDarwin { - XCTAssertEqual(emitModuleJob.outputs[3].file, .relative(RelativePath("main.abi.json"))) + XCTAssertEqual(emitModuleJob.outputs[3].file, .relative(try RelativePath(validating: "main.abi.json"))) } } @@ -6010,7 +6015,7 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(plannedJobs[0].kind, .compile) XCTAssertEqual(plannedJobs[0].inputs.count, 1) - XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(RelativePath("embed-bitcode.swift"))) + XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(try RelativePath(validating: "embed-bitcode.swift"))) XCTAssertEqual(plannedJobs[0].outputs.count, 1) XCTAssertTrue(matchTemporary(plannedJobs[0].outputs[0].file, "main.bc")) @@ -6022,7 +6027,7 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(plannedJobs[2].kind, .link) XCTAssertEqual(plannedJobs[2].outputs.count, 1) - XCTAssertEqual(plannedJobs[2].outputs[0].file, .relative(RelativePath("embed-bitcode"))) + XCTAssertEqual(plannedJobs[2].outputs[0].file, .relative(try RelativePath(validating: "embed-bitcode"))) } do { @@ -6038,7 +6043,7 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(plannedJobs[2].inputs.count, 1) XCTAssertTrue(matchTemporary(plannedJobs[2].inputs[0].file, "embed-bitcode.bc")) XCTAssertEqual(plannedJobs[2].outputs.count, 1) - XCTAssertEqual(plannedJobs[2].outputs[0].file, .relative(RelativePath("embed-bitcode.o"))) + XCTAssertEqual(plannedJobs[2].outputs[0].file, .relative(try RelativePath(validating: "embed-bitcode.o"))) XCTAssertEqual(plannedJobs[3].kind, .compile) XCTAssertEqual(plannedJobs[3].outputs.count, 1) @@ -6049,18 +6054,18 @@ final class SwiftDriverTests: XCTestCase { XCTAssertTrue(matchTemporary(plannedJobs[4].inputs[0].file, "empty.bc")) XCTAssertEqual(plannedJobs[4].outputs.count, 1) - XCTAssertEqual(plannedJobs[4].outputs[0].file, .relative(RelativePath("empty.o"))) + XCTAssertEqual(plannedJobs[4].outputs[0].file, .relative(try RelativePath(validating: "empty.o"))) let emitModuleJob = try plannedJobs.findJob(.emitModule) XCTAssertEqual(emitModuleJob.inputs.count, 2) - XCTAssertEqual(emitModuleJob.inputs[0].file, .relative(RelativePath("embed-bitcode.swift"))) - XCTAssertEqual(emitModuleJob.inputs[1].file, .relative(RelativePath("empty.swift"))) + XCTAssertEqual(emitModuleJob.inputs[0].file, .relative(try RelativePath(validating: "embed-bitcode.swift"))) + XCTAssertEqual(emitModuleJob.inputs[1].file, .relative(try RelativePath(validating: "empty.swift"))) XCTAssertEqual(emitModuleJob.outputs.count, driver.targetTriple.isDarwin ? 4 : 3) - XCTAssertEqual(emitModuleJob.outputs[0].file, .relative(RelativePath("ABC.swiftmodule"))) - XCTAssertEqual(emitModuleJob.outputs[1].file, .relative(RelativePath("ABC.swiftdoc"))) - XCTAssertEqual(emitModuleJob.outputs[2].file, .relative(RelativePath("ABC.swiftsourceinfo"))) + XCTAssertEqual(emitModuleJob.outputs[0].file, .relative(try RelativePath(validating: "ABC.swiftmodule"))) + XCTAssertEqual(emitModuleJob.outputs[1].file, .relative(try RelativePath(validating: "ABC.swiftdoc"))) + XCTAssertEqual(emitModuleJob.outputs[2].file, .relative(try RelativePath(validating: "ABC.swiftsourceinfo"))) if driver.targetTriple.isDarwin { - XCTAssertEqual(emitModuleJob.outputs[3].file, .relative(RelativePath("ABC.abi.json"))) + XCTAssertEqual(emitModuleJob.outputs[3].file, .relative(try RelativePath(validating: "ABC.abi.json"))) } } @@ -6071,7 +6076,7 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(plannedJobs[0].kind, .compile) XCTAssertEqual(plannedJobs[0].inputs.count, 1) - XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(RelativePath("embed-bitcode.swift"))) + XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(try RelativePath(validating: "embed-bitcode.swift"))) XCTAssertEqual(plannedJobs[0].outputs.count, 1) XCTAssertTrue(matchTemporary(plannedJobs[0].outputs[0].file, "Swift.bc")) @@ -6079,18 +6084,18 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(plannedJobs[1].inputs.count, 1) XCTAssertTrue(matchTemporary(plannedJobs[1].inputs[0].file, "Swift.bc")) XCTAssertEqual(plannedJobs[1].outputs.count, 1) - XCTAssertEqual(plannedJobs[1].outputs[0].file, .relative(RelativePath("Swift.o"))) + XCTAssertEqual(plannedJobs[1].outputs[0].file, .relative(try RelativePath(validating: "Swift.o"))) let emitModuleJob = plannedJobs[2] XCTAssertEqual(emitModuleJob.kind, .emitModule) XCTAssertEqual(emitModuleJob.inputs.count, 1) - XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(RelativePath("embed-bitcode.swift"))) + XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(try RelativePath(validating: "embed-bitcode.swift"))) XCTAssertEqual(emitModuleJob.outputs.count, driver.targetTriple.isDarwin ? 4 : 3) - XCTAssertEqual(1, emitModuleJob.outputs.filter({$0.file == .relative(RelativePath("Swift.swiftmodule"))}).count) - XCTAssertEqual(1, emitModuleJob.outputs.filter({$0.file == .relative(RelativePath("Swift.swiftdoc"))}).count) - XCTAssertEqual(1, emitModuleJob.outputs.filter({$0.file == .relative(RelativePath("Swift.swiftsourceinfo"))}).count) + XCTAssertEqual(1, try emitModuleJob.outputs.filter({$0.file == .relative(try RelativePath(validating: "Swift.swiftmodule"))}).count) + XCTAssertEqual(1, try emitModuleJob.outputs.filter({$0.file == .relative(try RelativePath(validating: "Swift.swiftdoc"))}).count) + XCTAssertEqual(1, try emitModuleJob.outputs.filter({$0.file == .relative(try RelativePath(validating: "Swift.swiftsourceinfo"))}).count) if driver.targetTriple.isDarwin { - XCTAssertEqual(1, emitModuleJob.outputs.filter({$0.file == .relative(RelativePath("Swift.abi.json"))}).count) + XCTAssertEqual(1, try emitModuleJob.outputs.filter({$0.file == .relative(try RelativePath(validating: "Swift.abi.json"))}).count) } } @@ -6290,7 +6295,7 @@ final class SwiftDriverTests: XCTestCase { let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs() XCTAssertEqual(plannedJobs.count, 1) XCTAssertEqual(plannedJobs[0].kind, .compile) - XCTAssert(plannedJobs[0].commandLine.contains(subsequence: [.flag("-vfsoverlay"), .path(.relative(RelativePath("overlay.yaml")))])) + XCTAssert(plannedJobs[0].commandLine.contains(subsequence: [.flag("-vfsoverlay"), .path(.relative(try RelativePath(validating: "overlay.yaml")))])) } // Verify that the overlays are passed to the frontend in the same order. @@ -6299,7 +6304,7 @@ final class SwiftDriverTests: XCTestCase { let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs() XCTAssertEqual(plannedJobs.count, 1) XCTAssertEqual(plannedJobs[0].kind, .compile) - XCTAssert(plannedJobs[0].commandLine.contains(subsequence: [.flag("-vfsoverlay"), .path(.relative(RelativePath("overlay1.yaml"))), .flag("-vfsoverlay"), .path(.relative(RelativePath("overlay2.yaml"))), .flag("-vfsoverlay"), .path(.relative(RelativePath("overlay3.yaml")))])) + XCTAssert(plannedJobs[0].commandLine.contains(subsequence: [.flag("-vfsoverlay"), .path(.relative(try RelativePath(validating: "overlay1.yaml"))), .flag("-vfsoverlay"), .path(.relative(try RelativePath(validating: "overlay2.yaml"))), .flag("-vfsoverlay"), .path(.relative(try RelativePath(validating: "overlay3.yaml")))])) } } @@ -6326,11 +6331,11 @@ final class SwiftDriverTests: XCTestCase { let emitModuleJob = plannedJobs[0] XCTAssertTrue(emitModuleJob.commandLine.contains(.flag("-emit-module-source-info-path"))) XCTAssertEqual(emitModuleJob.outputs.count, driver.targetTriple.isDarwin ? 4 : 3) - XCTAssertTrue(emitModuleJob.outputs[0].file == VirtualPath.relative(RelativePath("foo.swiftmodule"))) - XCTAssertTrue(emitModuleJob.outputs[1].file == VirtualPath.relative(RelativePath("foo.swiftdoc"))) - XCTAssertTrue(emitModuleJob.outputs[2].file == VirtualPath.relative(RelativePath("foo.swiftsourceinfo"))) + XCTAssertTrue(emitModuleJob.outputs[0].file == VirtualPath.relative(try RelativePath(validating: "foo.swiftmodule"))) + XCTAssertTrue(emitModuleJob.outputs[1].file == VirtualPath.relative(try RelativePath(validating: "foo.swiftdoc"))) + XCTAssertTrue(emitModuleJob.outputs[2].file == VirtualPath.relative(try RelativePath(validating: "foo.swiftsourceinfo"))) if driver.targetTriple.isDarwin { - XCTAssertTrue(emitModuleJob.outputs[3].file == VirtualPath.relative(RelativePath("foo.abi.json"))) + XCTAssertTrue(emitModuleJob.outputs[3].file == VirtualPath.relative(try RelativePath(validating: "foo.abi.json"))) } } // implicit with Project/ Directory @@ -6360,10 +6365,10 @@ final class SwiftDriverTests: XCTestCase { let emitModuleJob = plannedJobs[0] XCTAssertFalse(emitModuleJob.commandLine.contains(.flag("-emit-module-source-info-path"))) XCTAssertEqual(emitModuleJob.outputs.count, driver.targetTriple.isDarwin ? 3 : 2) - XCTAssertTrue(emitModuleJob.outputs[0].file == VirtualPath.relative(RelativePath("foo.swiftmodule"))) - XCTAssertTrue(emitModuleJob.outputs[1].file == VirtualPath.relative(RelativePath("foo.swiftdoc"))) + XCTAssertTrue(emitModuleJob.outputs[0].file == VirtualPath.relative(try RelativePath(validating: "foo.swiftmodule"))) + XCTAssertTrue(emitModuleJob.outputs[1].file == VirtualPath.relative(try RelativePath(validating: "foo.swiftdoc"))) if driver.targetTriple.isDarwin { - XCTAssertTrue(emitModuleJob.outputs[2].file == VirtualPath.relative(RelativePath("foo.abi.json"))) + XCTAssertTrue(emitModuleJob.outputs[2].file == VirtualPath.relative(try RelativePath(validating: "foo.abi.json"))) } } } @@ -6421,9 +6426,9 @@ final class SwiftDriverTests: XCTestCase { let plannedJobs = try driver.planBuild() let job = plannedJobs[0] XCTAssertTrue(job.commandLine.contains(.path(try VirtualPath(path: rebase("resource", "dir", at: workingDirectory))))) - XCTAssertFalse(job.commandLine.contains(.path(.relative(.init("resource/dir"))))) + XCTAssertFalse(job.commandLine.contains(.path(.relative(try .init(validating: "resource/dir"))))) XCTAssertTrue(job.commandLine.contains(.path(try VirtualPath(path: rebase("sdk", at: workingDirectory))))) - XCTAssertFalse(job.commandLine.contains(.path(.relative(.init("sdk"))))) + XCTAssertFalse(job.commandLine.contains(.path(.relative(try .init(validating: "sdk"))))) } } @@ -6450,7 +6455,7 @@ final class SwiftDriverTests: XCTestCase { envVars["SWIFT_DRIVER_LD_EXEC"] = ld.nativePathString(escaped: false) let mockSDKPath: String = - testInputsPath.appending(component: "mock-sdk.sdk").nativePathString(escaped: false) + try testInputsPath.appending(component: "mock-sdk.sdk").nativePathString(escaped: false) do { var driver = try Driver(args: ["swiftc", "-target", "x86_64-apple-ios13.1-macabi", "foo.swift", "-sdk", mockSDKPath], @@ -6478,15 +6483,15 @@ final class SwiftDriverTests: XCTestCase { let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs() let compileJob = plannedJobs[0] XCTAssertEqual(compileJob.kind, .compile) - XCTAssertTrue(compileJob.commandLine.contains(subsequence: ["-resource-dir", .path(.relative(.init("resource/dir")))])) + XCTAssertTrue(compileJob.commandLine.contains(subsequence: ["-resource-dir", .path(.relative(try .init(validating: "resource/dir")))])) let linkJob = plannedJobs[1] XCTAssertEqual(linkJob.kind, .link) XCTAssertTrue(linkJob.commandLine.contains(subsequence: ["-Xlinker", "-rpath", - "-Xlinker", .path(.relative(.init("resource/dir/linux")))])) - XCTAssertTrue(linkJob.commandLine.contains(.path(.relative(.init("resource/dir/linux/x86_64/swiftrt.o"))))) + "-Xlinker", .path(.relative(try .init(validating: "resource/dir/linux")))])) + XCTAssertTrue(linkJob.commandLine.contains(.path(.relative(try .init(validating: "resource/dir/linux/x86_64/swiftrt.o"))))) XCTAssertTrue(linkJob.commandLine.contains(subsequence: - ["-L", .path(.relative(.init("resource/dir/linux")))])) + ["-L", .path(.relative(try .init(validating: "resource/dir/linux")))])) } } @@ -6610,7 +6615,7 @@ final class SwiftDriverTests: XCTestCase { XCTFail("FileList wasn't OutputFileMap") return } - let filesA = try XCTUnwrap(mapA.entries[VirtualPath.relative(RelativePath("a.swift")).intern()]) + let filesA = try XCTUnwrap(mapA.entries[VirtualPath.relative(try RelativePath(validating: "a.swift")).intern()]) XCTAssertTrue(filesA.keys.contains(.swiftModule)) XCTAssertTrue(filesA.keys.contains(.swiftDocumentation)) XCTAssertTrue(filesA.keys.contains(.swiftSourceInfoFile)) @@ -6626,7 +6631,7 @@ final class SwiftDriverTests: XCTestCase { XCTFail("FileList wasn't OutputFileMap") return } - let filesB = try XCTUnwrap(mapB.entries[VirtualPath.relative(RelativePath("b.swift")).intern()]) + let filesB = try XCTUnwrap(mapB.entries[VirtualPath.relative(try RelativePath(validating: "b.swift")).intern()]) XCTAssertTrue(filesB.keys.contains(.swiftModule)) XCTAssertTrue(filesB.keys.contains(.swiftDocumentation)) XCTAssertTrue(filesB.keys.contains(.swiftSourceInfoFile)) @@ -6642,7 +6647,7 @@ final class SwiftDriverTests: XCTestCase { XCTFail("FileList wasn't OutputFileMap") return } - let filesC = try XCTUnwrap(mapC.entries[VirtualPath.relative(RelativePath("c.swift")).intern()]) + let filesC = try XCTUnwrap(mapC.entries[VirtualPath.relative(try RelativePath(validating: "c.swift")).intern()]) XCTAssertTrue(filesC.keys.contains(.swiftModule)) XCTAssertTrue(filesC.keys.contains(.swiftDocumentation)) XCTAssertTrue(filesC.keys.contains(.swiftSourceInfoFile)) @@ -6663,7 +6668,7 @@ final class SwiftDriverTests: XCTestCase { XCTFail("FileList wasn't List") return } - XCTAssertEqual(inputs, [.relative(RelativePath("a.swift")), .relative(RelativePath("b.swift")), .relative(RelativePath("c.swift"))]) + XCTAssertEqual(inputs, [.relative(try RelativePath(validating: "a.swift")), .relative(try RelativePath(validating: "b.swift")), .relative(try RelativePath(validating: "c.swift"))]) let outputsFlag = job.commandLine.firstIndex(of: .flag("-output-filelist"))! let outputFileListArgument = job.commandLine[job.commandLine.index(after: outputsFlag)] @@ -6675,7 +6680,7 @@ final class SwiftDriverTests: XCTestCase { XCTFail("FileList wasn't List") return } - XCTAssertEqual(outputs, [.relative(RelativePath("main.o"))]) + XCTAssertEqual(outputs, [.relative(try RelativePath(validating: "main.o"))]) } do { @@ -6693,7 +6698,7 @@ final class SwiftDriverTests: XCTestCase { XCTFail("FileList wasn't List") return } - XCTAssertEqual(outputs, [.relative(RelativePath("a.o")), .relative(RelativePath("b.o")), .relative(RelativePath("c.o"))]) + XCTAssertEqual(outputs, [.relative(try RelativePath(validating: "a.o")), .relative(try RelativePath(validating: "b.o")), .relative(try RelativePath(validating: "c.o"))]) } do { @@ -6774,7 +6779,7 @@ final class SwiftDriverTests: XCTestCase { XCTFail("FileList wasn't OutputFileMap") return } - XCTAssertEqual(mapA.entries, [VirtualPath.relative(.init("a.swift")).intern(): [:]]) + XCTAssertEqual(mapA.entries, [VirtualPath.relative(try .init(validating: "a.swift")).intern(): [:]]) let jobB = plannedJobs[1] let flagB = jobB.commandLine.firstIndex(of: .flag("-supplementary-output-file-map"))! @@ -6787,7 +6792,7 @@ final class SwiftDriverTests: XCTestCase { XCTFail("FileList wasn't OutputFileMap") return } - XCTAssertEqual(mapB.entries, [VirtualPath.relative(.init("b.swift")).intern(): [:]]) + XCTAssertEqual(mapB.entries, [VirtualPath.relative(try .init(validating: "b.swift")).intern(): [:]]) } do { @@ -6805,7 +6810,7 @@ final class SwiftDriverTests: XCTestCase { XCTFail("FileList wasn't OutputFileMap") return } - XCTAssertEqual(mapA.entries, [VirtualPath.relative(.init("a.swift")).intern(): [:]]) + XCTAssertEqual(mapA.entries, [VirtualPath.relative(try .init(validating: "a.swift")).intern(): [:]]) } } @@ -6898,7 +6903,7 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(jobs.count, 2) let job = jobs.first! XCTAssertTrue(job.commandLine.contains(.flag("-emit-objc-header-path"))) - XCTAssertTrue(job.commandLine.contains(.path(.relative(RelativePath("path/to/header"))))) + XCTAssertTrue(job.commandLine.contains(.path(.relative(try RelativePath(validating: "path/to/header"))))) } func testGccToolchainFlags() throws { @@ -6919,7 +6924,7 @@ final class SwiftDriverTests: XCTestCase { } func pluginPathTest(platform: String, sdk: String, searchPlatform: String) throws { - let sdkRoot = testInputsPath.appending( + let sdkRoot = try testInputsPath.appending( components: ["Platform Checks", "\(platform).platform", "Developer", "SDKs", "\(sdk).sdk"]) var driver = try Driver(args: ["swiftc", "-typecheck", "foo.swift", "-sdk", VirtualPath.absolute(sdkRoot).name, "-plugin-path", "PluginA", "-external-plugin-path", "Plugin~B#Bexe", "-load-plugin-library", "PluginB2", "-plugin-path", "PluginC"]) guard driver.isFrontendArgSupported(.pluginPath) && driver.isFrontendArgSupported(.externalPluginPath) else { @@ -6931,18 +6936,18 @@ final class SwiftDriverTests: XCTestCase { let job = jobs.first! // Check that the we have the plugin paths we expect, in the order we expect. - let pluginAIndex = job.commandLine.firstIndex(of: .path(VirtualPath.relative(.init("PluginA")))) + let pluginAIndex = job.commandLine.firstIndex(of: .path(VirtualPath.relative(try .init(validating: "PluginA")))) XCTAssertNotNil(pluginAIndex) - let pluginBIndex = job.commandLine.firstIndex(of: .path(VirtualPath.relative(.init("Plugin~B#Bexe")))) + let pluginBIndex = job.commandLine.firstIndex(of: .path(VirtualPath.relative(try .init(validating: "Plugin~B#Bexe")))) XCTAssertNotNil(pluginBIndex) XCTAssertLessThan(pluginAIndex!, pluginBIndex!) - let pluginB2Index = job.commandLine.firstIndex(of: .path(VirtualPath.relative(.init("PluginB2")))) + let pluginB2Index = job.commandLine.firstIndex(of: .path(VirtualPath.relative(try .init(validating: "PluginB2")))) XCTAssertNotNil(pluginB2Index) XCTAssertLessThan(pluginBIndex!, pluginB2Index!) - let pluginCIndex = job.commandLine.firstIndex(of: .path(VirtualPath.relative(.init("PluginC")))) + let pluginCIndex = job.commandLine.firstIndex(of: .path(VirtualPath.relative(try .init(validating: "PluginC")))) XCTAssertNotNil(pluginCIndex) XCTAssertLessThan(pluginB2Index!, pluginCIndex!) @@ -7112,14 +7117,14 @@ final class SwiftDriverTests: XCTestCase { } func testFindingBlockLists() throws { - let execDir = testInputsPath.appending(components: "Dummy.xctoolchain", "usr", "bin") + let execDir = try testInputsPath.appending(components: "Dummy.xctoolchain", "usr", "bin") let list = try Driver.findBlocklists(RelativeTo: execDir) XCTAssertEqual(list.count, 2) XCTAssertTrue(list.allSatisfy { $0.extension! == "yml" || $0.extension! == "yaml"}) } func testFindingBlockListVersion() throws { - let execDir = testInputsPath.appending(components: "Dummy.xctoolchain", "usr", "bin") + let execDir = try testInputsPath.appending(components: "Dummy.xctoolchain", "usr", "bin") let version = try Driver.findCompilerClientsConfigVersion(RelativeTo: execDir) XCTAssertEqual(version, "compilerClientsConfig-9999.99.9") } diff --git a/Tests/TestUtilities/Fixture.swift b/Tests/TestUtilities/Fixture.swift index 8cc7c3b90..b3758a356 100644 --- a/Tests/TestUtilities/Fixture.swift +++ b/Tests/TestUtilities/Fixture.swift @@ -28,13 +28,13 @@ public enum Fixture { at relativePath: RelativePath, for file: String, on fileSystem: FileSystem = localFileSystem - ) -> AbsolutePath? { + ) throws -> AbsolutePath? { let packageRootPath: AbsolutePath = - try! AbsolutePath(validating: #file).parentDirectory.parentDirectory.parentDirectory + try AbsolutePath(validating: #file).parentDirectory.parentDirectory.parentDirectory let fixturePath = - try! AbsolutePath(validating: relativePath.pathString, - relativeTo: packageRootPath.appending(component: "TestInputs")) - .appending(component: file) + try AbsolutePath(validating: relativePath.pathString, + relativeTo: packageRootPath.appending(component: "TestInputs")) + .appending(component: file) // Check that the fixture is really there. guard fileSystem.exists(fixturePath) else {