From a12a18e878ef22f44e9951895ac051038f70ab1d Mon Sep 17 00:00:00 2001 From: Colton Schlosser <1498529+cltnschlosser@users.noreply.github.com> Date: Wed, 11 Nov 2020 01:55:47 -0600 Subject: [PATCH 1/4] Install swift-help for integration tests. Suppress .noDriver options from being emitted by swift-help. Fixes: Driver/help.swift --- Sources/SwiftOptions/OptionTable.swift | 1 + Tests/SwiftDriverTests/IntegrationTests.swift | 10 +++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Sources/SwiftOptions/OptionTable.swift b/Sources/SwiftOptions/OptionTable.swift index 4b0e0c697..c91ecb024 100644 --- a/Sources/SwiftOptions/OptionTable.swift +++ b/Sources/SwiftOptions/OptionTable.swift @@ -37,6 +37,7 @@ extension OptionTable { for option in options { if option.isAlias { continue } + if option.attributes.contains(.noDriver) { continue } if option.isHelpHidden && !includeHidden { continue } guard option.isAccepted(by: driverKind) else { continue } guard let helpText = option.helpText else { continue } diff --git a/Tests/SwiftDriverTests/IntegrationTests.swift b/Tests/SwiftDriverTests/IntegrationTests.swift index 942eaad2e..5637adb08 100644 --- a/Tests/SwiftDriverTests/IntegrationTests.swift +++ b/Tests/SwiftDriverTests/IntegrationTests.swift @@ -34,17 +34,21 @@ func makeDriverSymlinks( try makeDirectories(tempBinDir) let swift = tempBinDir.appending(component: "swift") - try createSymlink(swift, pointingAt: driver, relative: false) + try localFileSystem.createSymbolicLink(swift, pointingAt: driver, relative: false) let swiftc = tempBinDir.appending(components: "swiftc") - try createSymlink(swiftc, pointingAt: driver, relative: false) + try localFileSystem.createSymbolicLink(swiftc, pointingAt: driver, relative: false) + + let swiftHelp = binDir.appending(component: "swift-help") + let swiftHelpSimlink = tempBinDir.appending(component: "swift-help") + try localFileSystem.createSymbolicLink(swiftHelpSimlink, pointingAt: swiftHelp, relative: false) // If we've been given a build dir, link in its lib folder so we can find its // resource directory. if let swiftBuildDir = swiftBuildDir { let libDir = swiftBuildDir.appending(component: "lib") let tempLibDir = tempDir.appending(component: "lib" ) - try createSymlink(tempLibDir, pointingAt: libDir, relative: false) + try localFileSystem.createSymbolicLink(tempLibDir, pointingAt: libDir, relative: false) } return (swift: swift, swiftc: swiftc) From c7613124e7997e673b8a85a7879d1a477b2a26ad Mon Sep 17 00:00:00 2001 From: Colton Schlosser <1498529+cltnschlosser@users.noreply.github.com> Date: Fri, 13 Nov 2020 00:06:24 -0600 Subject: [PATCH 2/4] Move check to isAccepted(by:) --- Sources/SwiftOptions/Option.swift | 4 ++-- Sources/SwiftOptions/OptionTable.swift | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Sources/SwiftOptions/Option.swift b/Sources/SwiftOptions/Option.swift index e98a8e237..5535d8b6f 100644 --- a/Sources/SwiftOptions/Option.swift +++ b/Sources/SwiftOptions/Option.swift @@ -135,9 +135,9 @@ extension Option { public func isAccepted(by driverKind: DriverKind) -> Bool { switch driverKind { case .batch: - return !attributes.contains(.noBatch) + return attributes.isDisjoint(with: [.noDriver, .noBatch]) case .interactive: - return !attributes.contains(.noInteractive) + return attributes.isDisjoint(with: [.noDriver, .noInteractive]) } } } diff --git a/Sources/SwiftOptions/OptionTable.swift b/Sources/SwiftOptions/OptionTable.swift index c91ecb024..4b0e0c697 100644 --- a/Sources/SwiftOptions/OptionTable.swift +++ b/Sources/SwiftOptions/OptionTable.swift @@ -37,7 +37,6 @@ extension OptionTable { for option in options { if option.isAlias { continue } - if option.attributes.contains(.noDriver) { continue } if option.isHelpHidden && !includeHidden { continue } guard option.isAccepted(by: driverKind) else { continue } guard let helpText = option.helpText else { continue } From 7426a741919ecaf045bcadef90a973ae39eb18f4 Mon Sep 17 00:00:00 2001 From: Colton Schlosser <1498529+cltnschlosser@users.noreply.github.com> Date: Sat, 14 Nov 2020 20:45:00 -0600 Subject: [PATCH 3/4] Match C++ logic for unknown arguments --- Sources/SwiftOptions/OptionParsing.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Sources/SwiftOptions/OptionParsing.swift b/Sources/SwiftOptions/OptionParsing.swift index e441cd46f..50ef7b40d 100644 --- a/Sources/SwiftOptions/OptionParsing.swift +++ b/Sources/SwiftOptions/OptionParsing.swift @@ -38,7 +38,8 @@ extension OptionTable { public func parse(_ arguments: [String], for driverKind: DriverKind) throws -> ParsedOptions { var trie = PrefixTrie