From 313ead086deca1a95ea0787d16b9ab9dad226910 Mon Sep 17 00:00:00 2001 From: David Jennes Date: Mon, 29 May 2017 15:57:04 +0200 Subject: [PATCH 1/5] Unify the iOS and macOS storyboard templates --- Documentation/storyboards/macOS-swift2.md | 87 -------------- Documentation/storyboards/macOS-swift3.md | 86 -------------- Documentation/storyboards/swift2.md | 3 +- Documentation/storyboards/swift3.md | 3 +- .../swift2-context-all-customname.swift | 51 ++++---- .../swift2-context-all-ignore-module.swift | 51 ++++---- .../Storyboards-iOS/swift2-context-all.swift | 51 ++++---- .../swift3-context-all-customname.swift | 51 ++++---- .../swift3-context-all-ignore-module.swift | 51 ++++---- .../Storyboards-iOS/swift3-context-all.swift | 51 ++++---- .../swift2-context-all-customname.swift | 87 ++++++-------- .../swift2-context-all-ignore-module.swift | 87 ++++++-------- .../swift2-context-all.swift | 87 ++++++-------- .../swift3-context-all-customname.swift | 89 ++++++-------- .../swift3-context-all-ignore-module.swift | 89 ++++++-------- .../swift3-context-all.swift | 89 ++++++-------- .../StoryboardsMacOSTests.swift | 55 ++++----- Tests/TemplatesTests/TestsHelper.swift | 8 +- templates/storyboards/macOS-swift2.stencil | 109 ------------------ templates/storyboards/macOS-swift3.stencil | 109 ------------------ templates/storyboards/swift2.stencil | 89 ++++++-------- templates/storyboards/swift3.stencil | 89 ++++++-------- 22 files changed, 451 insertions(+), 1021 deletions(-) delete mode 100644 Documentation/storyboards/macOS-swift2.md delete mode 100644 Documentation/storyboards/macOS-swift3.md delete mode 100644 templates/storyboards/macOS-swift2.stencil delete mode 100644 templates/storyboards/macOS-swift3.stencil diff --git a/Documentation/storyboards/macOS-swift2.md b/Documentation/storyboards/macOS-swift2.md deleted file mode 100644 index 4215c6e..0000000 --- a/Documentation/storyboards/macOS-swift2.md +++ /dev/null @@ -1,87 +0,0 @@ -## Template Information - -| Name | Description | -| --------- | ----------------- | -| File name | storyboards/macOS-swift2.stencil | -| Invocation example | `swiftgen storyboards -t macOS-swift2 …` | -| Language | Swift 2 | -| Author | Olivier Halligon | - -## When to use it - -- When you need to generate *Swift 2* code -- You want to generate code for AppKit platforms (macOS). -- **Warning**: Swift 2 is no longer actively supported, so we cannot guarantee that there won't be issues with the generated code. - -## Customization - -You can customize some elements of this template by overriding the following parameters when invoking `swiftgen` in the command line, using `--param =` - -| Parameter Name | Default Value | Description | -| -------------- | ------------- | ----------- | -| `sceneEnumName` | `StoryboardScene` | Allows you to change the name of the generated `enum` containing all storyboard scenes. | -| `segueEnumName` | `StoryboardSegue` | Allows you to change the name of the generated `enum` containing all storyboard segues. | - -## Generated Code - -**Extract:** - -```swift -enum StoryboardScene { - enum Dependency: String, StoryboardSceneType { - static let storyboardName = "Dependency" - - case DependentScene = "Dependent" - static func instantiateDependent() -> NSViewController { - guard let vc = StoryboardScene.Dependency.DependentScene.controller() as? NSViewController - else { - fatalError("ViewController 'Dependent' is not of the expected class NSViewController.") - } - return vc - } - } - enum Message: String, StoryboardSceneType { - static let storyboardName = "Message" - - case MessageListScene = "MessageList" - static func instantiateMessageList() -> NSViewController { - guard let vc = StoryboardScene.Message.MessageListScene.controller() as? NSViewController - else { - fatalError("ViewController 'MessageList' is not of the expected class NSViewController.") - } - return vc - } - } -} -enum StoryboardSegue { - enum Message: String, StoryboardSegueType { - case Embed - case Modal - } -} -``` - -[Full generated code](https://github.com/SwiftGen/templates/blob/master/Tests/Expected/Storyboards-macOS/swift2-context-all.swift) - -## Usage example - -```swift -// You can instantiate scenes using the generic `controller()` method: -let vc = StoryboardScene.Dependency.DependentScene.controller() - -// or the `instantiate...()` method (which will cast to the correct type): -let vc2 = StoryboardScene.Message.instantiateMessageList() - -// You can perform segues using: -vc.performSegue(StoryboardSegue.Message.Embed) - -// or match them (in prepareForSegue): -override func prepareForSegue(_ segue: NSStoryboardSegue, sender sender: AnyObject?) { - switch StoryboardSegue.Message(rawValue: segue.identifier!)! { - case .Embed: - // Prepare for your custom segue transition - case .Modal: - // Pass in information to the destination View Controller - } -} -``` diff --git a/Documentation/storyboards/macOS-swift3.md b/Documentation/storyboards/macOS-swift3.md deleted file mode 100644 index 4b88b38..0000000 --- a/Documentation/storyboards/macOS-swift3.md +++ /dev/null @@ -1,86 +0,0 @@ -## Template Information - -| Name | Description | -| --------- | ----------------- | -| File name | storyboards/macOS-swift3.stencil | -| Invocation example | `swiftgen storyboards -t macOS-swift3 …` | -| Language | Swift 3 | -| Author | Olivier Halligon | - -## When to use it - -- When you need to generate *Swift 3* code -- You want to generate code for AppKit platforms (macOS). - -## Customization - -You can customize some elements of this template by overriding the following parameters when invoking `swiftgen` in the command line, using `--param =` - -| Parameter Name | Default Value | Description | -| -------------- | ------------- | ----------- | -| `sceneEnumName` | `StoryboardScene` | Allows you to change the name of the generated `enum` containing all storyboard scenes. | -| `segueEnumName` | `StoryboardSegue` | Allows you to change the name of the generated `enum` containing all storyboard segues. | - -## Generated Code - -**Extract:** - -```swift -enum StoryboardScene { - enum Dependency: String, StoryboardSceneType { - static let storyboardName = "Dependency" - - case dependentScene = "Dependent" - static func instantiateDependent() -> NSViewController { - guard let vc = StoryboardScene.Dependency.dependentScene.controller() as? NSViewController - else { - fatalError("ViewController 'Dependent' is not of the expected class NSViewController.") - } - return vc - } - } - enum Message: String, StoryboardSceneType { - static let storyboardName = "Message" - - case messageListScene = "MessageList" - static func instantiateMessageList() -> NSViewController { - guard let vc = StoryboardScene.Message.messageListScene.controller() as? NSViewController - else { - fatalError("ViewController 'MessageList' is not of the expected class NSViewController.") - } - return vc - } - } -} -enum StoryboardSegue { - enum Message: String, StoryboardSegueType { - case embed - case modal - } -} -``` - -[Full generated code](https://github.com/SwiftGen/templates/blob/master/Tests/Expected/Storyboards-macOS/swift3-context-all.swift) - -## Usage example - -```swift -// You can instantiate scenes using the generic `controller()` method: -let vc = StoryboardScene.Dependency.dependentScene.controller() - -// or the `instantiate...()` method (which will cast to the correct type): -let vc2 = StoryboardScene.Message.instantiateMessageList() - -// You can perform segues using: -vc.perform(segue: StoryboardSegue.Message.embed) - -// or match them (in prepareForSegue): -override func prepare(for segue: UIStoryboardSegue, sender: Any?) { - switch UIStoryboard.Segue.Message(rawValue: segue.identifier!)! { - case .embed: - // Prepare for your custom segue transition - case .modal: - // Pass in information to the destination View Controller - } -} -``` diff --git a/Documentation/storyboards/swift2.md b/Documentation/storyboards/swift2.md index 7b080f3..1546244 100644 --- a/Documentation/storyboards/swift2.md +++ b/Documentation/storyboards/swift2.md @@ -10,7 +10,6 @@ ## When to use it - When you need to generate *Swift 2* code -- You want to generate code for UIKit platforms (iOS, tvOS and watchOS) - **Warning**: Swift 2 is no longer actively supported, so we cannot guarantee that there won't be issues with the generated code. ## Customization @@ -24,6 +23,8 @@ You can customize some elements of this template by overriding the following par ## Generated Code +Note: the generated code may look differently depending on the platform the storyboard file is targeting. + **Extract:** ```swift diff --git a/Documentation/storyboards/swift3.md b/Documentation/storyboards/swift3.md index 035956d..a99a940 100644 --- a/Documentation/storyboards/swift3.md +++ b/Documentation/storyboards/swift3.md @@ -10,7 +10,6 @@ ## When to use it - When you need to generate *Swift 3* code -- You want to generate code for UIKit platforms (iOS, tvOS and watchOS) ## Customization @@ -23,6 +22,8 @@ You can customize some elements of this template by overriding the following par ## Generated Code +Note: the generated code may look differently depending on the platform the storyboard file is targeting. + **Extract:** ```swift diff --git a/Tests/Expected/Storyboards-iOS/swift2-context-all-customname.swift b/Tests/Expected/Storyboards-iOS/swift2-context-all-customname.swift index 40cb14e..df8826d 100644 --- a/Tests/Expected/Storyboards-iOS/swift2-context-all-customname.swift +++ b/Tests/Expected/Storyboards-iOS/swift2-context-all-customname.swift @@ -19,10 +19,10 @@ extension StoryboardSceneType { } static func initialViewController() -> UIViewController { - guard let vc = storyboard().instantiateInitialViewController() else { + guard let controller = storyboard().instantiateInitialViewController() else { fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") } - return vc + return controller } } @@ -49,29 +49,28 @@ enum XCTStoryboardsScene { static let storyboardName = "AdditionalImport" static func initialViewController() -> LocationPicker.LocationPickerViewController { - guard let vc = storyboard().instantiateInitialViewController() as? LocationPicker.LocationPickerViewController else { + guard let controller = storyboard().instantiateInitialViewController() as? LocationPicker.LocationPickerViewController else { fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") } - return vc + return controller } case PublicScene = "public" static func instantiatePublic() -> SlackTextViewController.SLKTextViewController { - guard let vc = XCTStoryboardsScene.AdditionalImport.PublicScene.viewController() as? SlackTextViewController.SLKTextViewController - else { + guard let controller = XCTStoryboardsScene.AdditionalImport.PublicScene.viewController() as? SlackTextViewController.SLKTextViewController else { fatalError("ViewController 'public' is not of the expected class SlackTextViewController.SLKTextViewController.") } - return vc + return controller } } enum Anonymous: StoryboardSceneType { static let storyboardName = "Anonymous" static func initialViewController() -> UINavigationController { - guard let vc = storyboard().instantiateInitialViewController() as? UINavigationController else { + guard let controller = storyboard().instantiateInitialViewController() as? UINavigationController else { fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") } - return vc + return controller } } enum Dependency: String, StoryboardSceneType { @@ -92,29 +91,26 @@ enum XCTStoryboardsScene { case MessagesListScene = "MessagesList" static func instantiateMessagesList() -> UITableViewController { - guard let vc = XCTStoryboardsScene.Message.MessagesListScene.viewController() as? UITableViewController - else { + guard let controller = XCTStoryboardsScene.Message.MessagesListScene.viewController() as? UITableViewController else { fatalError("ViewController 'MessagesList' is not of the expected class UITableViewController.") } - return vc + return controller } case NavCtrlScene = "NavCtrl" static func instantiateNavCtrl() -> UINavigationController { - guard let vc = XCTStoryboardsScene.Message.NavCtrlScene.viewController() as? UINavigationController - else { + guard let controller = XCTStoryboardsScene.Message.NavCtrlScene.viewController() as? UINavigationController else { fatalError("ViewController 'NavCtrl' is not of the expected class UINavigationController.") } - return vc + return controller } case URLChooserScene = "URLChooser" static func instantiateURLChooser() -> XXPickerViewController { - guard let vc = XCTStoryboardsScene.Message.URLChooserScene.viewController() as? XXPickerViewController - else { + guard let controller = XCTStoryboardsScene.Message.URLChooserScene.viewController() as? XXPickerViewController else { fatalError("ViewController 'URLChooser' is not of the expected class XXPickerViewController.") } - return vc + return controller } } enum Placeholder: String, StoryboardSceneType { @@ -122,21 +118,20 @@ enum XCTStoryboardsScene { case NavigationScene = "Navigation" static func instantiateNavigation() -> UINavigationController { - guard let vc = XCTStoryboardsScene.Placeholder.NavigationScene.viewController() as? UINavigationController - else { + guard let controller = XCTStoryboardsScene.Placeholder.NavigationScene.viewController() as? UINavigationController else { fatalError("ViewController 'Navigation' is not of the expected class UINavigationController.") } - return vc + return controller } } enum Wizard: String, StoryboardSceneType { static let storyboardName = "Wizard" static func initialViewController() -> CreateAccViewController { - guard let vc = storyboard().instantiateInitialViewController() as? CreateAccViewController else { + guard let controller = storyboard().instantiateInitialViewController() as? CreateAccViewController else { fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") } - return vc + return controller } case Accept_CGUScene = "Accept-CGU" @@ -146,20 +141,18 @@ enum XCTStoryboardsScene { case CreateAccountScene = "CreateAccount" static func instantiateCreateAccount() -> CreateAccViewController { - guard let vc = XCTStoryboardsScene.Wizard.CreateAccountScene.viewController() as? CreateAccViewController - else { + guard let controller = XCTStoryboardsScene.Wizard.CreateAccountScene.viewController() as? CreateAccViewController else { fatalError("ViewController 'CreateAccount' is not of the expected class CreateAccViewController.") } - return vc + return controller } case PreferencesScene = "Preferences" static func instantiatePreferences() -> UITableViewController { - guard let vc = XCTStoryboardsScene.Wizard.PreferencesScene.viewController() as? UITableViewController - else { + guard let controller = XCTStoryboardsScene.Wizard.PreferencesScene.viewController() as? UITableViewController else { fatalError("ViewController 'Preferences' is not of the expected class UITableViewController.") } - return vc + return controller } case Validate_PasswordScene = "Validate_Password" diff --git a/Tests/Expected/Storyboards-iOS/swift2-context-all-ignore-module.swift b/Tests/Expected/Storyboards-iOS/swift2-context-all-ignore-module.swift index 8ea3d73..d64d3b4 100644 --- a/Tests/Expected/Storyboards-iOS/swift2-context-all-ignore-module.swift +++ b/Tests/Expected/Storyboards-iOS/swift2-context-all-ignore-module.swift @@ -18,10 +18,10 @@ extension StoryboardSceneType { } static func initialViewController() -> UIViewController { - guard let vc = storyboard().instantiateInitialViewController() else { + guard let controller = storyboard().instantiateInitialViewController() else { fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") } - return vc + return controller } } @@ -48,29 +48,28 @@ enum StoryboardScene { static let storyboardName = "AdditionalImport" static func initialViewController() -> LocationPicker.LocationPickerViewController { - guard let vc = storyboard().instantiateInitialViewController() as? LocationPicker.LocationPickerViewController else { + guard let controller = storyboard().instantiateInitialViewController() as? LocationPicker.LocationPickerViewController else { fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") } - return vc + return controller } case PublicScene = "public" static func instantiatePublic() -> SlackTextViewController.SLKTextViewController { - guard let vc = StoryboardScene.AdditionalImport.PublicScene.viewController() as? SlackTextViewController.SLKTextViewController - else { + guard let controller = StoryboardScene.AdditionalImport.PublicScene.viewController() as? SlackTextViewController.SLKTextViewController else { fatalError("ViewController 'public' is not of the expected class SlackTextViewController.SLKTextViewController.") } - return vc + return controller } } enum Anonymous: StoryboardSceneType { static let storyboardName = "Anonymous" static func initialViewController() -> UINavigationController { - guard let vc = storyboard().instantiateInitialViewController() as? UINavigationController else { + guard let controller = storyboard().instantiateInitialViewController() as? UINavigationController else { fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") } - return vc + return controller } } enum Dependency: String, StoryboardSceneType { @@ -91,29 +90,26 @@ enum StoryboardScene { case MessagesListScene = "MessagesList" static func instantiateMessagesList() -> UITableViewController { - guard let vc = StoryboardScene.Message.MessagesListScene.viewController() as? UITableViewController - else { + guard let controller = StoryboardScene.Message.MessagesListScene.viewController() as? UITableViewController else { fatalError("ViewController 'MessagesList' is not of the expected class UITableViewController.") } - return vc + return controller } case NavCtrlScene = "NavCtrl" static func instantiateNavCtrl() -> UINavigationController { - guard let vc = StoryboardScene.Message.NavCtrlScene.viewController() as? UINavigationController - else { + guard let controller = StoryboardScene.Message.NavCtrlScene.viewController() as? UINavigationController else { fatalError("ViewController 'NavCtrl' is not of the expected class UINavigationController.") } - return vc + return controller } case URLChooserScene = "URLChooser" static func instantiateURLChooser() -> XXPickerViewController { - guard let vc = StoryboardScene.Message.URLChooserScene.viewController() as? XXPickerViewController - else { + guard let controller = StoryboardScene.Message.URLChooserScene.viewController() as? XXPickerViewController else { fatalError("ViewController 'URLChooser' is not of the expected class XXPickerViewController.") } - return vc + return controller } } enum Placeholder: String, StoryboardSceneType { @@ -121,21 +117,20 @@ enum StoryboardScene { case NavigationScene = "Navigation" static func instantiateNavigation() -> UINavigationController { - guard let vc = StoryboardScene.Placeholder.NavigationScene.viewController() as? UINavigationController - else { + guard let controller = StoryboardScene.Placeholder.NavigationScene.viewController() as? UINavigationController else { fatalError("ViewController 'Navigation' is not of the expected class UINavigationController.") } - return vc + return controller } } enum Wizard: String, StoryboardSceneType { static let storyboardName = "Wizard" static func initialViewController() -> CreateAccViewController { - guard let vc = storyboard().instantiateInitialViewController() as? CreateAccViewController else { + guard let controller = storyboard().instantiateInitialViewController() as? CreateAccViewController else { fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") } - return vc + return controller } case Accept_CGUScene = "Accept-CGU" @@ -145,20 +140,18 @@ enum StoryboardScene { case CreateAccountScene = "CreateAccount" static func instantiateCreateAccount() -> CreateAccViewController { - guard let vc = StoryboardScene.Wizard.CreateAccountScene.viewController() as? CreateAccViewController - else { + guard let controller = StoryboardScene.Wizard.CreateAccountScene.viewController() as? CreateAccViewController else { fatalError("ViewController 'CreateAccount' is not of the expected class CreateAccViewController.") } - return vc + return controller } case PreferencesScene = "Preferences" static func instantiatePreferences() -> UITableViewController { - guard let vc = StoryboardScene.Wizard.PreferencesScene.viewController() as? UITableViewController - else { + guard let controller = StoryboardScene.Wizard.PreferencesScene.viewController() as? UITableViewController else { fatalError("ViewController 'Preferences' is not of the expected class UITableViewController.") } - return vc + return controller } case Validate_PasswordScene = "Validate_Password" diff --git a/Tests/Expected/Storyboards-iOS/swift2-context-all.swift b/Tests/Expected/Storyboards-iOS/swift2-context-all.swift index c4f4256..02c2626 100644 --- a/Tests/Expected/Storyboards-iOS/swift2-context-all.swift +++ b/Tests/Expected/Storyboards-iOS/swift2-context-all.swift @@ -19,10 +19,10 @@ extension StoryboardSceneType { } static func initialViewController() -> UIViewController { - guard let vc = storyboard().instantiateInitialViewController() else { + guard let controller = storyboard().instantiateInitialViewController() else { fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") } - return vc + return controller } } @@ -49,29 +49,28 @@ enum StoryboardScene { static let storyboardName = "AdditionalImport" static func initialViewController() -> LocationPicker.LocationPickerViewController { - guard let vc = storyboard().instantiateInitialViewController() as? LocationPicker.LocationPickerViewController else { + guard let controller = storyboard().instantiateInitialViewController() as? LocationPicker.LocationPickerViewController else { fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") } - return vc + return controller } case PublicScene = "public" static func instantiatePublic() -> SlackTextViewController.SLKTextViewController { - guard let vc = StoryboardScene.AdditionalImport.PublicScene.viewController() as? SlackTextViewController.SLKTextViewController - else { + guard let controller = StoryboardScene.AdditionalImport.PublicScene.viewController() as? SlackTextViewController.SLKTextViewController else { fatalError("ViewController 'public' is not of the expected class SlackTextViewController.SLKTextViewController.") } - return vc + return controller } } enum Anonymous: StoryboardSceneType { static let storyboardName = "Anonymous" static func initialViewController() -> UINavigationController { - guard let vc = storyboard().instantiateInitialViewController() as? UINavigationController else { + guard let controller = storyboard().instantiateInitialViewController() as? UINavigationController else { fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") } - return vc + return controller } } enum Dependency: String, StoryboardSceneType { @@ -92,29 +91,26 @@ enum StoryboardScene { case MessagesListScene = "MessagesList" static func instantiateMessagesList() -> UITableViewController { - guard let vc = StoryboardScene.Message.MessagesListScene.viewController() as? UITableViewController - else { + guard let controller = StoryboardScene.Message.MessagesListScene.viewController() as? UITableViewController else { fatalError("ViewController 'MessagesList' is not of the expected class UITableViewController.") } - return vc + return controller } case NavCtrlScene = "NavCtrl" static func instantiateNavCtrl() -> UINavigationController { - guard let vc = StoryboardScene.Message.NavCtrlScene.viewController() as? UINavigationController - else { + guard let controller = StoryboardScene.Message.NavCtrlScene.viewController() as? UINavigationController else { fatalError("ViewController 'NavCtrl' is not of the expected class UINavigationController.") } - return vc + return controller } case URLChooserScene = "URLChooser" static func instantiateURLChooser() -> XXPickerViewController { - guard let vc = StoryboardScene.Message.URLChooserScene.viewController() as? XXPickerViewController - else { + guard let controller = StoryboardScene.Message.URLChooserScene.viewController() as? XXPickerViewController else { fatalError("ViewController 'URLChooser' is not of the expected class XXPickerViewController.") } - return vc + return controller } } enum Placeholder: String, StoryboardSceneType { @@ -122,21 +118,20 @@ enum StoryboardScene { case NavigationScene = "Navigation" static func instantiateNavigation() -> UINavigationController { - guard let vc = StoryboardScene.Placeholder.NavigationScene.viewController() as? UINavigationController - else { + guard let controller = StoryboardScene.Placeholder.NavigationScene.viewController() as? UINavigationController else { fatalError("ViewController 'Navigation' is not of the expected class UINavigationController.") } - return vc + return controller } } enum Wizard: String, StoryboardSceneType { static let storyboardName = "Wizard" static func initialViewController() -> CreateAccViewController { - guard let vc = storyboard().instantiateInitialViewController() as? CreateAccViewController else { + guard let controller = storyboard().instantiateInitialViewController() as? CreateAccViewController else { fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") } - return vc + return controller } case Accept_CGUScene = "Accept-CGU" @@ -146,20 +141,18 @@ enum StoryboardScene { case CreateAccountScene = "CreateAccount" static func instantiateCreateAccount() -> CreateAccViewController { - guard let vc = StoryboardScene.Wizard.CreateAccountScene.viewController() as? CreateAccViewController - else { + guard let controller = StoryboardScene.Wizard.CreateAccountScene.viewController() as? CreateAccViewController else { fatalError("ViewController 'CreateAccount' is not of the expected class CreateAccViewController.") } - return vc + return controller } case PreferencesScene = "Preferences" static func instantiatePreferences() -> UITableViewController { - guard let vc = StoryboardScene.Wizard.PreferencesScene.viewController() as? UITableViewController - else { + guard let controller = StoryboardScene.Wizard.PreferencesScene.viewController() as? UITableViewController else { fatalError("ViewController 'Preferences' is not of the expected class UITableViewController.") } - return vc + return controller } case Validate_PasswordScene = "Validate_Password" diff --git a/Tests/Expected/Storyboards-iOS/swift3-context-all-customname.swift b/Tests/Expected/Storyboards-iOS/swift3-context-all-customname.swift index f184372..345efc8 100644 --- a/Tests/Expected/Storyboards-iOS/swift3-context-all-customname.swift +++ b/Tests/Expected/Storyboards-iOS/swift3-context-all-customname.swift @@ -19,10 +19,10 @@ extension StoryboardSceneType { } static func initialViewController() -> UIViewController { - guard let vc = storyboard().instantiateInitialViewController() else { + guard let controller = storyboard().instantiateInitialViewController() else { fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") } - return vc + return controller } } @@ -49,29 +49,28 @@ enum XCTStoryboardsScene { static let storyboardName = "AdditionalImport" static func initialViewController() -> LocationPicker.LocationPickerViewController { - guard let vc = storyboard().instantiateInitialViewController() as? LocationPicker.LocationPickerViewController else { + guard let controller = storyboard().instantiateInitialViewController() as? LocationPicker.LocationPickerViewController else { fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") } - return vc + return controller } case publicScene = "public" static func instantiatePublic() -> SlackTextViewController.SLKTextViewController { - guard let vc = XCTStoryboardsScene.AdditionalImport.publicScene.viewController() as? SlackTextViewController.SLKTextViewController - else { + guard let controller = XCTStoryboardsScene.AdditionalImport.publicScene.viewController() as? SlackTextViewController.SLKTextViewController else { fatalError("ViewController 'public' is not of the expected class SlackTextViewController.SLKTextViewController.") } - return vc + return controller } } enum Anonymous: StoryboardSceneType { static let storyboardName = "Anonymous" static func initialViewController() -> UINavigationController { - guard let vc = storyboard().instantiateInitialViewController() as? UINavigationController else { + guard let controller = storyboard().instantiateInitialViewController() as? UINavigationController else { fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") } - return vc + return controller } } enum Dependency: String, StoryboardSceneType { @@ -92,29 +91,26 @@ enum XCTStoryboardsScene { case messagesListScene = "MessagesList" static func instantiateMessagesList() -> UITableViewController { - guard let vc = XCTStoryboardsScene.Message.messagesListScene.viewController() as? UITableViewController - else { + guard let controller = XCTStoryboardsScene.Message.messagesListScene.viewController() as? UITableViewController else { fatalError("ViewController 'MessagesList' is not of the expected class UITableViewController.") } - return vc + return controller } case navCtrlScene = "NavCtrl" static func instantiateNavCtrl() -> UINavigationController { - guard let vc = XCTStoryboardsScene.Message.navCtrlScene.viewController() as? UINavigationController - else { + guard let controller = XCTStoryboardsScene.Message.navCtrlScene.viewController() as? UINavigationController else { fatalError("ViewController 'NavCtrl' is not of the expected class UINavigationController.") } - return vc + return controller } case urlChooserScene = "URLChooser" static func instantiateUrlChooser() -> XXPickerViewController { - guard let vc = XCTStoryboardsScene.Message.urlChooserScene.viewController() as? XXPickerViewController - else { + guard let controller = XCTStoryboardsScene.Message.urlChooserScene.viewController() as? XXPickerViewController else { fatalError("ViewController 'URLChooser' is not of the expected class XXPickerViewController.") } - return vc + return controller } } enum Placeholder: String, StoryboardSceneType { @@ -122,21 +118,20 @@ enum XCTStoryboardsScene { case navigationScene = "Navigation" static func instantiateNavigation() -> UINavigationController { - guard let vc = XCTStoryboardsScene.Placeholder.navigationScene.viewController() as? UINavigationController - else { + guard let controller = XCTStoryboardsScene.Placeholder.navigationScene.viewController() as? UINavigationController else { fatalError("ViewController 'Navigation' is not of the expected class UINavigationController.") } - return vc + return controller } } enum Wizard: String, StoryboardSceneType { static let storyboardName = "Wizard" static func initialViewController() -> CreateAccViewController { - guard let vc = storyboard().instantiateInitialViewController() as? CreateAccViewController else { + guard let controller = storyboard().instantiateInitialViewController() as? CreateAccViewController else { fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") } - return vc + return controller } case acceptCGUScene = "Accept-CGU" @@ -146,20 +141,18 @@ enum XCTStoryboardsScene { case createAccountScene = "CreateAccount" static func instantiateCreateAccount() -> CreateAccViewController { - guard let vc = XCTStoryboardsScene.Wizard.createAccountScene.viewController() as? CreateAccViewController - else { + guard let controller = XCTStoryboardsScene.Wizard.createAccountScene.viewController() as? CreateAccViewController else { fatalError("ViewController 'CreateAccount' is not of the expected class CreateAccViewController.") } - return vc + return controller } case preferencesScene = "Preferences" static func instantiatePreferences() -> UITableViewController { - guard let vc = XCTStoryboardsScene.Wizard.preferencesScene.viewController() as? UITableViewController - else { + guard let controller = XCTStoryboardsScene.Wizard.preferencesScene.viewController() as? UITableViewController else { fatalError("ViewController 'Preferences' is not of the expected class UITableViewController.") } - return vc + return controller } case validatePasswordScene = "Validate_Password" diff --git a/Tests/Expected/Storyboards-iOS/swift3-context-all-ignore-module.swift b/Tests/Expected/Storyboards-iOS/swift3-context-all-ignore-module.swift index ed9228d..c43f51a 100644 --- a/Tests/Expected/Storyboards-iOS/swift3-context-all-ignore-module.swift +++ b/Tests/Expected/Storyboards-iOS/swift3-context-all-ignore-module.swift @@ -18,10 +18,10 @@ extension StoryboardSceneType { } static func initialViewController() -> UIViewController { - guard let vc = storyboard().instantiateInitialViewController() else { + guard let controller = storyboard().instantiateInitialViewController() else { fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") } - return vc + return controller } } @@ -48,29 +48,28 @@ enum StoryboardScene { static let storyboardName = "AdditionalImport" static func initialViewController() -> LocationPicker.LocationPickerViewController { - guard let vc = storyboard().instantiateInitialViewController() as? LocationPicker.LocationPickerViewController else { + guard let controller = storyboard().instantiateInitialViewController() as? LocationPicker.LocationPickerViewController else { fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") } - return vc + return controller } case publicScene = "public" static func instantiatePublic() -> SlackTextViewController.SLKTextViewController { - guard let vc = StoryboardScene.AdditionalImport.publicScene.viewController() as? SlackTextViewController.SLKTextViewController - else { + guard let controller = StoryboardScene.AdditionalImport.publicScene.viewController() as? SlackTextViewController.SLKTextViewController else { fatalError("ViewController 'public' is not of the expected class SlackTextViewController.SLKTextViewController.") } - return vc + return controller } } enum Anonymous: StoryboardSceneType { static let storyboardName = "Anonymous" static func initialViewController() -> UINavigationController { - guard let vc = storyboard().instantiateInitialViewController() as? UINavigationController else { + guard let controller = storyboard().instantiateInitialViewController() as? UINavigationController else { fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") } - return vc + return controller } } enum Dependency: String, StoryboardSceneType { @@ -91,29 +90,26 @@ enum StoryboardScene { case messagesListScene = "MessagesList" static func instantiateMessagesList() -> UITableViewController { - guard let vc = StoryboardScene.Message.messagesListScene.viewController() as? UITableViewController - else { + guard let controller = StoryboardScene.Message.messagesListScene.viewController() as? UITableViewController else { fatalError("ViewController 'MessagesList' is not of the expected class UITableViewController.") } - return vc + return controller } case navCtrlScene = "NavCtrl" static func instantiateNavCtrl() -> UINavigationController { - guard let vc = StoryboardScene.Message.navCtrlScene.viewController() as? UINavigationController - else { + guard let controller = StoryboardScene.Message.navCtrlScene.viewController() as? UINavigationController else { fatalError("ViewController 'NavCtrl' is not of the expected class UINavigationController.") } - return vc + return controller } case urlChooserScene = "URLChooser" static func instantiateUrlChooser() -> XXPickerViewController { - guard let vc = StoryboardScene.Message.urlChooserScene.viewController() as? XXPickerViewController - else { + guard let controller = StoryboardScene.Message.urlChooserScene.viewController() as? XXPickerViewController else { fatalError("ViewController 'URLChooser' is not of the expected class XXPickerViewController.") } - return vc + return controller } } enum Placeholder: String, StoryboardSceneType { @@ -121,21 +117,20 @@ enum StoryboardScene { case navigationScene = "Navigation" static func instantiateNavigation() -> UINavigationController { - guard let vc = StoryboardScene.Placeholder.navigationScene.viewController() as? UINavigationController - else { + guard let controller = StoryboardScene.Placeholder.navigationScene.viewController() as? UINavigationController else { fatalError("ViewController 'Navigation' is not of the expected class UINavigationController.") } - return vc + return controller } } enum Wizard: String, StoryboardSceneType { static let storyboardName = "Wizard" static func initialViewController() -> CreateAccViewController { - guard let vc = storyboard().instantiateInitialViewController() as? CreateAccViewController else { + guard let controller = storyboard().instantiateInitialViewController() as? CreateAccViewController else { fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") } - return vc + return controller } case acceptCGUScene = "Accept-CGU" @@ -145,20 +140,18 @@ enum StoryboardScene { case createAccountScene = "CreateAccount" static func instantiateCreateAccount() -> CreateAccViewController { - guard let vc = StoryboardScene.Wizard.createAccountScene.viewController() as? CreateAccViewController - else { + guard let controller = StoryboardScene.Wizard.createAccountScene.viewController() as? CreateAccViewController else { fatalError("ViewController 'CreateAccount' is not of the expected class CreateAccViewController.") } - return vc + return controller } case preferencesScene = "Preferences" static func instantiatePreferences() -> UITableViewController { - guard let vc = StoryboardScene.Wizard.preferencesScene.viewController() as? UITableViewController - else { + guard let controller = StoryboardScene.Wizard.preferencesScene.viewController() as? UITableViewController else { fatalError("ViewController 'Preferences' is not of the expected class UITableViewController.") } - return vc + return controller } case validatePasswordScene = "Validate_Password" diff --git a/Tests/Expected/Storyboards-iOS/swift3-context-all.swift b/Tests/Expected/Storyboards-iOS/swift3-context-all.swift index 629346d..be69ed9 100644 --- a/Tests/Expected/Storyboards-iOS/swift3-context-all.swift +++ b/Tests/Expected/Storyboards-iOS/swift3-context-all.swift @@ -19,10 +19,10 @@ extension StoryboardSceneType { } static func initialViewController() -> UIViewController { - guard let vc = storyboard().instantiateInitialViewController() else { + guard let controller = storyboard().instantiateInitialViewController() else { fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") } - return vc + return controller } } @@ -49,29 +49,28 @@ enum StoryboardScene { static let storyboardName = "AdditionalImport" static func initialViewController() -> LocationPicker.LocationPickerViewController { - guard let vc = storyboard().instantiateInitialViewController() as? LocationPicker.LocationPickerViewController else { + guard let controller = storyboard().instantiateInitialViewController() as? LocationPicker.LocationPickerViewController else { fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") } - return vc + return controller } case publicScene = "public" static func instantiatePublic() -> SlackTextViewController.SLKTextViewController { - guard let vc = StoryboardScene.AdditionalImport.publicScene.viewController() as? SlackTextViewController.SLKTextViewController - else { + guard let controller = StoryboardScene.AdditionalImport.publicScene.viewController() as? SlackTextViewController.SLKTextViewController else { fatalError("ViewController 'public' is not of the expected class SlackTextViewController.SLKTextViewController.") } - return vc + return controller } } enum Anonymous: StoryboardSceneType { static let storyboardName = "Anonymous" static func initialViewController() -> UINavigationController { - guard let vc = storyboard().instantiateInitialViewController() as? UINavigationController else { + guard let controller = storyboard().instantiateInitialViewController() as? UINavigationController else { fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") } - return vc + return controller } } enum Dependency: String, StoryboardSceneType { @@ -92,29 +91,26 @@ enum StoryboardScene { case messagesListScene = "MessagesList" static func instantiateMessagesList() -> UITableViewController { - guard let vc = StoryboardScene.Message.messagesListScene.viewController() as? UITableViewController - else { + guard let controller = StoryboardScene.Message.messagesListScene.viewController() as? UITableViewController else { fatalError("ViewController 'MessagesList' is not of the expected class UITableViewController.") } - return vc + return controller } case navCtrlScene = "NavCtrl" static func instantiateNavCtrl() -> UINavigationController { - guard let vc = StoryboardScene.Message.navCtrlScene.viewController() as? UINavigationController - else { + guard let controller = StoryboardScene.Message.navCtrlScene.viewController() as? UINavigationController else { fatalError("ViewController 'NavCtrl' is not of the expected class UINavigationController.") } - return vc + return controller } case urlChooserScene = "URLChooser" static func instantiateUrlChooser() -> XXPickerViewController { - guard let vc = StoryboardScene.Message.urlChooserScene.viewController() as? XXPickerViewController - else { + guard let controller = StoryboardScene.Message.urlChooserScene.viewController() as? XXPickerViewController else { fatalError("ViewController 'URLChooser' is not of the expected class XXPickerViewController.") } - return vc + return controller } } enum Placeholder: String, StoryboardSceneType { @@ -122,21 +118,20 @@ enum StoryboardScene { case navigationScene = "Navigation" static func instantiateNavigation() -> UINavigationController { - guard let vc = StoryboardScene.Placeholder.navigationScene.viewController() as? UINavigationController - else { + guard let controller = StoryboardScene.Placeholder.navigationScene.viewController() as? UINavigationController else { fatalError("ViewController 'Navigation' is not of the expected class UINavigationController.") } - return vc + return controller } } enum Wizard: String, StoryboardSceneType { static let storyboardName = "Wizard" static func initialViewController() -> CreateAccViewController { - guard let vc = storyboard().instantiateInitialViewController() as? CreateAccViewController else { + guard let controller = storyboard().instantiateInitialViewController() as? CreateAccViewController else { fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") } - return vc + return controller } case acceptCGUScene = "Accept-CGU" @@ -146,20 +141,18 @@ enum StoryboardScene { case createAccountScene = "CreateAccount" static func instantiateCreateAccount() -> CreateAccViewController { - guard let vc = StoryboardScene.Wizard.createAccountScene.viewController() as? CreateAccViewController - else { + guard let controller = StoryboardScene.Wizard.createAccountScene.viewController() as? CreateAccViewController else { fatalError("ViewController 'CreateAccount' is not of the expected class CreateAccViewController.") } - return vc + return controller } case preferencesScene = "Preferences" static func instantiatePreferences() -> UITableViewController { - guard let vc = StoryboardScene.Wizard.preferencesScene.viewController() as? UITableViewController - else { + guard let controller = StoryboardScene.Wizard.preferencesScene.viewController() as? UITableViewController else { fatalError("ViewController 'Preferences' is not of the expected class UITableViewController.") } - return vc + return controller } case validatePasswordScene = "Validate_Password" diff --git a/Tests/Expected/Storyboards-macOS/swift2-context-all-customname.swift b/Tests/Expected/Storyboards-macOS/swift2-context-all-customname.swift index cb31cbe..c1ad608 100644 --- a/Tests/Expected/Storyboards-macOS/swift2-context-all-customname.swift +++ b/Tests/Expected/Storyboards-macOS/swift2-context-all-customname.swift @@ -1,8 +1,8 @@ // Generated using SwiftGen, by O.Halligon — https://github.com/SwiftGen/SwiftGen // swiftlint:disable sorted_imports -import Cocoa import Foundation +import Cocoa import FadeSegue import PrefsWindowController @@ -18,9 +18,8 @@ extension StoryboardSceneType { } static func initialController() -> AnyObject { - guard let controller = storyboard().instantiateInitialController() - else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") + guard let controller = storyboard().instantiateInitialController() else { + fatalError("Failed to instantiate initialController for \(self.storyboardName)") } return controller } @@ -37,15 +36,9 @@ extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == Str protocol StoryboardSegueType: RawRepresentable { } -extension NSWindowController { - func performSegue(segue: S, sender: AnyObject? = nil) { - performSegueWithIdentifier(segue.rawValue, sender: sender) - } -} - -extension NSViewController { +extension NSSeguePerforming { func performSegue(segue: S, sender: AnyObject? = nil) { - performSegueWithIdentifier(segue.rawValue, sender: sender) + performSegueWithIdentifier?(segue.rawValue, sender: sender) } } @@ -56,11 +49,10 @@ enum XCTStoryboardsScene { case PrivateScene = "private" static func instantiatePrivate() -> PrefsWindowController.DBPrefsWindowController { - guard let vc = XCTStoryboardsScene.AdditionalImport.PrivateScene.controller() as? PrefsWindowController.DBPrefsWindowController - else { - fatalError("ViewController 'private' is not of the expected class PrefsWindowController.DBPrefsWindowController.") + guard let controller = XCTStoryboardsScene.AdditionalImport.PrivateScene.controller() as? PrefsWindowController.DBPrefsWindowController else { + fatalError("Controller 'private' is not of the expected class PrefsWindowController.DBPrefsWindowController.") } - return vc + return controller } } enum Anonymous: StoryboardSceneType { @@ -71,11 +63,10 @@ enum XCTStoryboardsScene { case DependentScene = "Dependent" static func instantiateDependent() -> NSViewController { - guard let vc = XCTStoryboardsScene.Dependency.DependentScene.controller() as? NSViewController - else { - fatalError("ViewController 'Dependent' is not of the expected class NSViewController.") + guard let controller = XCTStoryboardsScene.Dependency.DependentScene.controller() as? NSViewController else { + fatalError("Controller 'Dependent' is not of the expected class NSViewController.") } - return vc + return controller } } enum Message: String, StoryboardSceneType { @@ -83,56 +74,50 @@ enum XCTStoryboardsScene { case MessageDetailsScene = "MessageDetails" static func instantiateMessageDetails() -> NSViewController { - guard let vc = XCTStoryboardsScene.Message.MessageDetailsScene.controller() as? NSViewController - else { - fatalError("ViewController 'MessageDetails' is not of the expected class NSViewController.") + guard let controller = XCTStoryboardsScene.Message.MessageDetailsScene.controller() as? NSViewController else { + fatalError("Controller 'MessageDetails' is not of the expected class NSViewController.") } - return vc + return controller } case MessageListScene = "MessageList" static func instantiateMessageList() -> NSViewController { - guard let vc = XCTStoryboardsScene.Message.MessageListScene.controller() as? NSViewController - else { - fatalError("ViewController 'MessageList' is not of the expected class NSViewController.") + guard let controller = XCTStoryboardsScene.Message.MessageListScene.controller() as? NSViewController else { + fatalError("Controller 'MessageList' is not of the expected class NSViewController.") } - return vc + return controller } case MessageListFooterScene = "MessageListFooter" static func instantiateMessageListFooter() -> NSViewController { - guard let vc = XCTStoryboardsScene.Message.MessageListFooterScene.controller() as? NSViewController - else { - fatalError("ViewController 'MessageListFooter' is not of the expected class NSViewController.") + guard let controller = XCTStoryboardsScene.Message.MessageListFooterScene.controller() as? NSViewController else { + fatalError("Controller 'MessageListFooter' is not of the expected class NSViewController.") } - return vc + return controller } case MessagesTabScene = "MessagesTab" static func instantiateMessagesTab() -> CustomTabViewController { - guard let vc = XCTStoryboardsScene.Message.MessagesTabScene.controller() as? CustomTabViewController - else { - fatalError("ViewController 'MessagesTab' is not of the expected class CustomTabViewController.") + guard let controller = XCTStoryboardsScene.Message.MessagesTabScene.controller() as? CustomTabViewController else { + fatalError("Controller 'MessagesTab' is not of the expected class CustomTabViewController.") } - return vc + return controller } case SplitMessagesScene = "SplitMessages" static func instantiateSplitMessages() -> NSSplitViewController { - guard let vc = XCTStoryboardsScene.Message.SplitMessagesScene.controller() as? NSSplitViewController - else { - fatalError("ViewController 'SplitMessages' is not of the expected class NSSplitViewController.") + guard let controller = XCTStoryboardsScene.Message.SplitMessagesScene.controller() as? NSSplitViewController else { + fatalError("Controller 'SplitMessages' is not of the expected class NSSplitViewController.") } - return vc + return controller } case WindowCtrlScene = "WindowCtrl" static func instantiateWindowCtrl() -> NSWindowController { - guard let vc = XCTStoryboardsScene.Message.WindowCtrlScene.controller() as? NSWindowController - else { - fatalError("ViewController 'WindowCtrl' is not of the expected class NSWindowController.") + guard let controller = XCTStoryboardsScene.Message.WindowCtrlScene.controller() as? NSWindowController else { + fatalError("Controller 'WindowCtrl' is not of the expected class NSWindowController.") } - return vc + return controller } } enum Placeholder: String, StoryboardSceneType { @@ -140,20 +125,18 @@ enum XCTStoryboardsScene { case DependentScene = "Dependent" static func instantiateDependent() -> NSControllerPlaceholder { - guard let vc = XCTStoryboardsScene.Placeholder.DependentScene.controller() as? NSControllerPlaceholder - else { - fatalError("ViewController 'Dependent' is not of the expected class NSControllerPlaceholder.") + guard let controller = XCTStoryboardsScene.Placeholder.DependentScene.controller() as? NSControllerPlaceholder else { + fatalError("Controller 'Dependent' is not of the expected class NSControllerPlaceholder.") } - return vc + return controller } case WindowScene = "Window" static func instantiateWindow() -> NSWindowController { - guard let vc = XCTStoryboardsScene.Placeholder.WindowScene.controller() as? NSWindowController - else { - fatalError("ViewController 'Window' is not of the expected class NSWindowController.") + guard let controller = XCTStoryboardsScene.Placeholder.WindowScene.controller() as? NSWindowController else { + fatalError("Controller 'Window' is not of the expected class NSWindowController.") } - return vc + return controller } } } diff --git a/Tests/Expected/Storyboards-macOS/swift2-context-all-ignore-module.swift b/Tests/Expected/Storyboards-macOS/swift2-context-all-ignore-module.swift index 03c5497..299d8d5 100644 --- a/Tests/Expected/Storyboards-macOS/swift2-context-all-ignore-module.swift +++ b/Tests/Expected/Storyboards-macOS/swift2-context-all-ignore-module.swift @@ -1,8 +1,8 @@ // Generated using SwiftGen, by O.Halligon — https://github.com/SwiftGen/SwiftGen // swiftlint:disable sorted_imports -import Cocoa import Foundation +import Cocoa import PrefsWindowController // swiftlint:disable file_length @@ -17,9 +17,8 @@ extension StoryboardSceneType { } static func initialController() -> AnyObject { - guard let controller = storyboard().instantiateInitialController() - else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") + guard let controller = storyboard().instantiateInitialController() else { + fatalError("Failed to instantiate initialController for \(self.storyboardName)") } return controller } @@ -36,15 +35,9 @@ extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == Str protocol StoryboardSegueType: RawRepresentable { } -extension NSWindowController { - func performSegue(segue: S, sender: AnyObject? = nil) { - performSegueWithIdentifier(segue.rawValue, sender: sender) - } -} - -extension NSViewController { +extension NSSeguePerforming { func performSegue(segue: S, sender: AnyObject? = nil) { - performSegueWithIdentifier(segue.rawValue, sender: sender) + performSegueWithIdentifier?(segue.rawValue, sender: sender) } } @@ -55,11 +48,10 @@ enum StoryboardScene { case PrivateScene = "private" static func instantiatePrivate() -> PrefsWindowController.DBPrefsWindowController { - guard let vc = StoryboardScene.AdditionalImport.PrivateScene.controller() as? PrefsWindowController.DBPrefsWindowController - else { - fatalError("ViewController 'private' is not of the expected class PrefsWindowController.DBPrefsWindowController.") + guard let controller = StoryboardScene.AdditionalImport.PrivateScene.controller() as? PrefsWindowController.DBPrefsWindowController else { + fatalError("Controller 'private' is not of the expected class PrefsWindowController.DBPrefsWindowController.") } - return vc + return controller } } enum Anonymous: StoryboardSceneType { @@ -70,11 +62,10 @@ enum StoryboardScene { case DependentScene = "Dependent" static func instantiateDependent() -> NSViewController { - guard let vc = StoryboardScene.Dependency.DependentScene.controller() as? NSViewController - else { - fatalError("ViewController 'Dependent' is not of the expected class NSViewController.") + guard let controller = StoryboardScene.Dependency.DependentScene.controller() as? NSViewController else { + fatalError("Controller 'Dependent' is not of the expected class NSViewController.") } - return vc + return controller } } enum Message: String, StoryboardSceneType { @@ -82,56 +73,50 @@ enum StoryboardScene { case MessageDetailsScene = "MessageDetails" static func instantiateMessageDetails() -> NSViewController { - guard let vc = StoryboardScene.Message.MessageDetailsScene.controller() as? NSViewController - else { - fatalError("ViewController 'MessageDetails' is not of the expected class NSViewController.") + guard let controller = StoryboardScene.Message.MessageDetailsScene.controller() as? NSViewController else { + fatalError("Controller 'MessageDetails' is not of the expected class NSViewController.") } - return vc + return controller } case MessageListScene = "MessageList" static func instantiateMessageList() -> NSViewController { - guard let vc = StoryboardScene.Message.MessageListScene.controller() as? NSViewController - else { - fatalError("ViewController 'MessageList' is not of the expected class NSViewController.") + guard let controller = StoryboardScene.Message.MessageListScene.controller() as? NSViewController else { + fatalError("Controller 'MessageList' is not of the expected class NSViewController.") } - return vc + return controller } case MessageListFooterScene = "MessageListFooter" static func instantiateMessageListFooter() -> NSViewController { - guard let vc = StoryboardScene.Message.MessageListFooterScene.controller() as? NSViewController - else { - fatalError("ViewController 'MessageListFooter' is not of the expected class NSViewController.") + guard let controller = StoryboardScene.Message.MessageListFooterScene.controller() as? NSViewController else { + fatalError("Controller 'MessageListFooter' is not of the expected class NSViewController.") } - return vc + return controller } case MessagesTabScene = "MessagesTab" static func instantiateMessagesTab() -> CustomTabViewController { - guard let vc = StoryboardScene.Message.MessagesTabScene.controller() as? CustomTabViewController - else { - fatalError("ViewController 'MessagesTab' is not of the expected class CustomTabViewController.") + guard let controller = StoryboardScene.Message.MessagesTabScene.controller() as? CustomTabViewController else { + fatalError("Controller 'MessagesTab' is not of the expected class CustomTabViewController.") } - return vc + return controller } case SplitMessagesScene = "SplitMessages" static func instantiateSplitMessages() -> NSSplitViewController { - guard let vc = StoryboardScene.Message.SplitMessagesScene.controller() as? NSSplitViewController - else { - fatalError("ViewController 'SplitMessages' is not of the expected class NSSplitViewController.") + guard let controller = StoryboardScene.Message.SplitMessagesScene.controller() as? NSSplitViewController else { + fatalError("Controller 'SplitMessages' is not of the expected class NSSplitViewController.") } - return vc + return controller } case WindowCtrlScene = "WindowCtrl" static func instantiateWindowCtrl() -> NSWindowController { - guard let vc = StoryboardScene.Message.WindowCtrlScene.controller() as? NSWindowController - else { - fatalError("ViewController 'WindowCtrl' is not of the expected class NSWindowController.") + guard let controller = StoryboardScene.Message.WindowCtrlScene.controller() as? NSWindowController else { + fatalError("Controller 'WindowCtrl' is not of the expected class NSWindowController.") } - return vc + return controller } } enum Placeholder: String, StoryboardSceneType { @@ -139,20 +124,18 @@ enum StoryboardScene { case DependentScene = "Dependent" static func instantiateDependent() -> NSControllerPlaceholder { - guard let vc = StoryboardScene.Placeholder.DependentScene.controller() as? NSControllerPlaceholder - else { - fatalError("ViewController 'Dependent' is not of the expected class NSControllerPlaceholder.") + guard let controller = StoryboardScene.Placeholder.DependentScene.controller() as? NSControllerPlaceholder else { + fatalError("Controller 'Dependent' is not of the expected class NSControllerPlaceholder.") } - return vc + return controller } case WindowScene = "Window" static func instantiateWindow() -> NSWindowController { - guard let vc = StoryboardScene.Placeholder.WindowScene.controller() as? NSWindowController - else { - fatalError("ViewController 'Window' is not of the expected class NSWindowController.") + guard let controller = StoryboardScene.Placeholder.WindowScene.controller() as? NSWindowController else { + fatalError("Controller 'Window' is not of the expected class NSWindowController.") } - return vc + return controller } } } diff --git a/Tests/Expected/Storyboards-macOS/swift2-context-all.swift b/Tests/Expected/Storyboards-macOS/swift2-context-all.swift index f041635..4125ab3 100644 --- a/Tests/Expected/Storyboards-macOS/swift2-context-all.swift +++ b/Tests/Expected/Storyboards-macOS/swift2-context-all.swift @@ -1,8 +1,8 @@ // Generated using SwiftGen, by O.Halligon — https://github.com/SwiftGen/SwiftGen // swiftlint:disable sorted_imports -import Cocoa import Foundation +import Cocoa import FadeSegue import PrefsWindowController @@ -18,9 +18,8 @@ extension StoryboardSceneType { } static func initialController() -> AnyObject { - guard let controller = storyboard().instantiateInitialController() - else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") + guard let controller = storyboard().instantiateInitialController() else { + fatalError("Failed to instantiate initialController for \(self.storyboardName)") } return controller } @@ -37,15 +36,9 @@ extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == Str protocol StoryboardSegueType: RawRepresentable { } -extension NSWindowController { - func performSegue(segue: S, sender: AnyObject? = nil) { - performSegueWithIdentifier(segue.rawValue, sender: sender) - } -} - -extension NSViewController { +extension NSSeguePerforming { func performSegue(segue: S, sender: AnyObject? = nil) { - performSegueWithIdentifier(segue.rawValue, sender: sender) + performSegueWithIdentifier?(segue.rawValue, sender: sender) } } @@ -56,11 +49,10 @@ enum StoryboardScene { case PrivateScene = "private" static func instantiatePrivate() -> PrefsWindowController.DBPrefsWindowController { - guard let vc = StoryboardScene.AdditionalImport.PrivateScene.controller() as? PrefsWindowController.DBPrefsWindowController - else { - fatalError("ViewController 'private' is not of the expected class PrefsWindowController.DBPrefsWindowController.") + guard let controller = StoryboardScene.AdditionalImport.PrivateScene.controller() as? PrefsWindowController.DBPrefsWindowController else { + fatalError("Controller 'private' is not of the expected class PrefsWindowController.DBPrefsWindowController.") } - return vc + return controller } } enum Anonymous: StoryboardSceneType { @@ -71,11 +63,10 @@ enum StoryboardScene { case DependentScene = "Dependent" static func instantiateDependent() -> NSViewController { - guard let vc = StoryboardScene.Dependency.DependentScene.controller() as? NSViewController - else { - fatalError("ViewController 'Dependent' is not of the expected class NSViewController.") + guard let controller = StoryboardScene.Dependency.DependentScene.controller() as? NSViewController else { + fatalError("Controller 'Dependent' is not of the expected class NSViewController.") } - return vc + return controller } } enum Message: String, StoryboardSceneType { @@ -83,56 +74,50 @@ enum StoryboardScene { case MessageDetailsScene = "MessageDetails" static func instantiateMessageDetails() -> NSViewController { - guard let vc = StoryboardScene.Message.MessageDetailsScene.controller() as? NSViewController - else { - fatalError("ViewController 'MessageDetails' is not of the expected class NSViewController.") + guard let controller = StoryboardScene.Message.MessageDetailsScene.controller() as? NSViewController else { + fatalError("Controller 'MessageDetails' is not of the expected class NSViewController.") } - return vc + return controller } case MessageListScene = "MessageList" static func instantiateMessageList() -> NSViewController { - guard let vc = StoryboardScene.Message.MessageListScene.controller() as? NSViewController - else { - fatalError("ViewController 'MessageList' is not of the expected class NSViewController.") + guard let controller = StoryboardScene.Message.MessageListScene.controller() as? NSViewController else { + fatalError("Controller 'MessageList' is not of the expected class NSViewController.") } - return vc + return controller } case MessageListFooterScene = "MessageListFooter" static func instantiateMessageListFooter() -> NSViewController { - guard let vc = StoryboardScene.Message.MessageListFooterScene.controller() as? NSViewController - else { - fatalError("ViewController 'MessageListFooter' is not of the expected class NSViewController.") + guard let controller = StoryboardScene.Message.MessageListFooterScene.controller() as? NSViewController else { + fatalError("Controller 'MessageListFooter' is not of the expected class NSViewController.") } - return vc + return controller } case MessagesTabScene = "MessagesTab" static func instantiateMessagesTab() -> CustomTabViewController { - guard let vc = StoryboardScene.Message.MessagesTabScene.controller() as? CustomTabViewController - else { - fatalError("ViewController 'MessagesTab' is not of the expected class CustomTabViewController.") + guard let controller = StoryboardScene.Message.MessagesTabScene.controller() as? CustomTabViewController else { + fatalError("Controller 'MessagesTab' is not of the expected class CustomTabViewController.") } - return vc + return controller } case SplitMessagesScene = "SplitMessages" static func instantiateSplitMessages() -> NSSplitViewController { - guard let vc = StoryboardScene.Message.SplitMessagesScene.controller() as? NSSplitViewController - else { - fatalError("ViewController 'SplitMessages' is not of the expected class NSSplitViewController.") + guard let controller = StoryboardScene.Message.SplitMessagesScene.controller() as? NSSplitViewController else { + fatalError("Controller 'SplitMessages' is not of the expected class NSSplitViewController.") } - return vc + return controller } case WindowCtrlScene = "WindowCtrl" static func instantiateWindowCtrl() -> NSWindowController { - guard let vc = StoryboardScene.Message.WindowCtrlScene.controller() as? NSWindowController - else { - fatalError("ViewController 'WindowCtrl' is not of the expected class NSWindowController.") + guard let controller = StoryboardScene.Message.WindowCtrlScene.controller() as? NSWindowController else { + fatalError("Controller 'WindowCtrl' is not of the expected class NSWindowController.") } - return vc + return controller } } enum Placeholder: String, StoryboardSceneType { @@ -140,20 +125,18 @@ enum StoryboardScene { case DependentScene = "Dependent" static func instantiateDependent() -> NSControllerPlaceholder { - guard let vc = StoryboardScene.Placeholder.DependentScene.controller() as? NSControllerPlaceholder - else { - fatalError("ViewController 'Dependent' is not of the expected class NSControllerPlaceholder.") + guard let controller = StoryboardScene.Placeholder.DependentScene.controller() as? NSControllerPlaceholder else { + fatalError("Controller 'Dependent' is not of the expected class NSControllerPlaceholder.") } - return vc + return controller } case WindowScene = "Window" static func instantiateWindow() -> NSWindowController { - guard let vc = StoryboardScene.Placeholder.WindowScene.controller() as? NSWindowController - else { - fatalError("ViewController 'Window' is not of the expected class NSWindowController.") + guard let controller = StoryboardScene.Placeholder.WindowScene.controller() as? NSWindowController else { + fatalError("Controller 'Window' is not of the expected class NSWindowController.") } - return vc + return controller } } } diff --git a/Tests/Expected/Storyboards-macOS/swift3-context-all-customname.swift b/Tests/Expected/Storyboards-macOS/swift3-context-all-customname.swift index e268ddf..bf0633d 100644 --- a/Tests/Expected/Storyboards-macOS/swift3-context-all-customname.swift +++ b/Tests/Expected/Storyboards-macOS/swift3-context-all-customname.swift @@ -1,8 +1,8 @@ // Generated using SwiftGen, by O.Halligon — https://github.com/SwiftGen/SwiftGen // swiftlint:disable sorted_imports -import Cocoa import Foundation +import Cocoa import FadeSegue import PrefsWindowController @@ -18,9 +18,8 @@ extension StoryboardSceneType { } static func initialController() -> Any { - guard let controller = storyboard().instantiateInitialController() - else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") + guard let controller = storyboard().instantiateInitialController() else { + fatalError("Failed to instantiate initialController for \(self.storyboardName)") } return controller } @@ -37,15 +36,9 @@ extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == Str protocol StoryboardSegueType: RawRepresentable { } -extension NSWindowController { - func performSegue(segue: S, sender: Any? = nil) where S.RawValue == String { - performSegue(withIdentifier: segue.rawValue, sender: sender) - } -} - -extension NSViewController { - func performSegue(segue: S, sender: Any? = nil) where S.RawValue == String { - performSegue(withIdentifier: segue.rawValue, sender: sender) +extension NSSeguePerforming { + func perform(segue: S, sender: Any? = nil) where S.RawValue == String { + performSegue?(withIdentifier: segue.rawValue, sender: sender) } } @@ -56,11 +49,10 @@ enum XCTStoryboardsScene { case privateScene = "private" static func instantiatePrivate() -> PrefsWindowController.DBPrefsWindowController { - guard let vc = XCTStoryboardsScene.AdditionalImport.privateScene.controller() as? PrefsWindowController.DBPrefsWindowController - else { - fatalError("ViewController 'private' is not of the expected class PrefsWindowController.DBPrefsWindowController.") + guard let controller = XCTStoryboardsScene.AdditionalImport.privateScene.controller() as? PrefsWindowController.DBPrefsWindowController else { + fatalError("Controller 'private' is not of the expected class PrefsWindowController.DBPrefsWindowController.") } - return vc + return controller } } enum Anonymous: StoryboardSceneType { @@ -71,11 +63,10 @@ enum XCTStoryboardsScene { case dependentScene = "Dependent" static func instantiateDependent() -> NSViewController { - guard let vc = XCTStoryboardsScene.Dependency.dependentScene.controller() as? NSViewController - else { - fatalError("ViewController 'Dependent' is not of the expected class NSViewController.") + guard let controller = XCTStoryboardsScene.Dependency.dependentScene.controller() as? NSViewController else { + fatalError("Controller 'Dependent' is not of the expected class NSViewController.") } - return vc + return controller } } enum Message: String, StoryboardSceneType { @@ -83,56 +74,50 @@ enum XCTStoryboardsScene { case messageDetailsScene = "MessageDetails" static func instantiateMessageDetails() -> NSViewController { - guard let vc = XCTStoryboardsScene.Message.messageDetailsScene.controller() as? NSViewController - else { - fatalError("ViewController 'MessageDetails' is not of the expected class NSViewController.") + guard let controller = XCTStoryboardsScene.Message.messageDetailsScene.controller() as? NSViewController else { + fatalError("Controller 'MessageDetails' is not of the expected class NSViewController.") } - return vc + return controller } case messageListScene = "MessageList" static func instantiateMessageList() -> NSViewController { - guard let vc = XCTStoryboardsScene.Message.messageListScene.controller() as? NSViewController - else { - fatalError("ViewController 'MessageList' is not of the expected class NSViewController.") + guard let controller = XCTStoryboardsScene.Message.messageListScene.controller() as? NSViewController else { + fatalError("Controller 'MessageList' is not of the expected class NSViewController.") } - return vc + return controller } case messageListFooterScene = "MessageListFooter" static func instantiateMessageListFooter() -> NSViewController { - guard let vc = XCTStoryboardsScene.Message.messageListFooterScene.controller() as? NSViewController - else { - fatalError("ViewController 'MessageListFooter' is not of the expected class NSViewController.") + guard let controller = XCTStoryboardsScene.Message.messageListFooterScene.controller() as? NSViewController else { + fatalError("Controller 'MessageListFooter' is not of the expected class NSViewController.") } - return vc + return controller } case messagesTabScene = "MessagesTab" static func instantiateMessagesTab() -> CustomTabViewController { - guard let vc = XCTStoryboardsScene.Message.messagesTabScene.controller() as? CustomTabViewController - else { - fatalError("ViewController 'MessagesTab' is not of the expected class CustomTabViewController.") + guard let controller = XCTStoryboardsScene.Message.messagesTabScene.controller() as? CustomTabViewController else { + fatalError("Controller 'MessagesTab' is not of the expected class CustomTabViewController.") } - return vc + return controller } case splitMessagesScene = "SplitMessages" static func instantiateSplitMessages() -> NSSplitViewController { - guard let vc = XCTStoryboardsScene.Message.splitMessagesScene.controller() as? NSSplitViewController - else { - fatalError("ViewController 'SplitMessages' is not of the expected class NSSplitViewController.") + guard let controller = XCTStoryboardsScene.Message.splitMessagesScene.controller() as? NSSplitViewController else { + fatalError("Controller 'SplitMessages' is not of the expected class NSSplitViewController.") } - return vc + return controller } case windowCtrlScene = "WindowCtrl" static func instantiateWindowCtrl() -> NSWindowController { - guard let vc = XCTStoryboardsScene.Message.windowCtrlScene.controller() as? NSWindowController - else { - fatalError("ViewController 'WindowCtrl' is not of the expected class NSWindowController.") + guard let controller = XCTStoryboardsScene.Message.windowCtrlScene.controller() as? NSWindowController else { + fatalError("Controller 'WindowCtrl' is not of the expected class NSWindowController.") } - return vc + return controller } } enum Placeholder: String, StoryboardSceneType { @@ -140,20 +125,18 @@ enum XCTStoryboardsScene { case dependentScene = "Dependent" static func instantiateDependent() -> NSControllerPlaceholder { - guard let vc = XCTStoryboardsScene.Placeholder.dependentScene.controller() as? NSControllerPlaceholder - else { - fatalError("ViewController 'Dependent' is not of the expected class NSControllerPlaceholder.") + guard let controller = XCTStoryboardsScene.Placeholder.dependentScene.controller() as? NSControllerPlaceholder else { + fatalError("Controller 'Dependent' is not of the expected class NSControllerPlaceholder.") } - return vc + return controller } case windowScene = "Window" static func instantiateWindow() -> NSWindowController { - guard let vc = XCTStoryboardsScene.Placeholder.windowScene.controller() as? NSWindowController - else { - fatalError("ViewController 'Window' is not of the expected class NSWindowController.") + guard let controller = XCTStoryboardsScene.Placeholder.windowScene.controller() as? NSWindowController else { + fatalError("Controller 'Window' is not of the expected class NSWindowController.") } - return vc + return controller } } } diff --git a/Tests/Expected/Storyboards-macOS/swift3-context-all-ignore-module.swift b/Tests/Expected/Storyboards-macOS/swift3-context-all-ignore-module.swift index a603b97..02bb395 100644 --- a/Tests/Expected/Storyboards-macOS/swift3-context-all-ignore-module.swift +++ b/Tests/Expected/Storyboards-macOS/swift3-context-all-ignore-module.swift @@ -1,8 +1,8 @@ // Generated using SwiftGen, by O.Halligon — https://github.com/SwiftGen/SwiftGen // swiftlint:disable sorted_imports -import Cocoa import Foundation +import Cocoa import PrefsWindowController // swiftlint:disable file_length @@ -17,9 +17,8 @@ extension StoryboardSceneType { } static func initialController() -> Any { - guard let controller = storyboard().instantiateInitialController() - else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") + guard let controller = storyboard().instantiateInitialController() else { + fatalError("Failed to instantiate initialController for \(self.storyboardName)") } return controller } @@ -36,15 +35,9 @@ extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == Str protocol StoryboardSegueType: RawRepresentable { } -extension NSWindowController { - func performSegue(segue: S, sender: Any? = nil) where S.RawValue == String { - performSegue(withIdentifier: segue.rawValue, sender: sender) - } -} - -extension NSViewController { - func performSegue(segue: S, sender: Any? = nil) where S.RawValue == String { - performSegue(withIdentifier: segue.rawValue, sender: sender) +extension NSSeguePerforming { + func perform(segue: S, sender: Any? = nil) where S.RawValue == String { + performSegue?(withIdentifier: segue.rawValue, sender: sender) } } @@ -55,11 +48,10 @@ enum StoryboardScene { case privateScene = "private" static func instantiatePrivate() -> PrefsWindowController.DBPrefsWindowController { - guard let vc = StoryboardScene.AdditionalImport.privateScene.controller() as? PrefsWindowController.DBPrefsWindowController - else { - fatalError("ViewController 'private' is not of the expected class PrefsWindowController.DBPrefsWindowController.") + guard let controller = StoryboardScene.AdditionalImport.privateScene.controller() as? PrefsWindowController.DBPrefsWindowController else { + fatalError("Controller 'private' is not of the expected class PrefsWindowController.DBPrefsWindowController.") } - return vc + return controller } } enum Anonymous: StoryboardSceneType { @@ -70,11 +62,10 @@ enum StoryboardScene { case dependentScene = "Dependent" static func instantiateDependent() -> NSViewController { - guard let vc = StoryboardScene.Dependency.dependentScene.controller() as? NSViewController - else { - fatalError("ViewController 'Dependent' is not of the expected class NSViewController.") + guard let controller = StoryboardScene.Dependency.dependentScene.controller() as? NSViewController else { + fatalError("Controller 'Dependent' is not of the expected class NSViewController.") } - return vc + return controller } } enum Message: String, StoryboardSceneType { @@ -82,56 +73,50 @@ enum StoryboardScene { case messageDetailsScene = "MessageDetails" static func instantiateMessageDetails() -> NSViewController { - guard let vc = StoryboardScene.Message.messageDetailsScene.controller() as? NSViewController - else { - fatalError("ViewController 'MessageDetails' is not of the expected class NSViewController.") + guard let controller = StoryboardScene.Message.messageDetailsScene.controller() as? NSViewController else { + fatalError("Controller 'MessageDetails' is not of the expected class NSViewController.") } - return vc + return controller } case messageListScene = "MessageList" static func instantiateMessageList() -> NSViewController { - guard let vc = StoryboardScene.Message.messageListScene.controller() as? NSViewController - else { - fatalError("ViewController 'MessageList' is not of the expected class NSViewController.") + guard let controller = StoryboardScene.Message.messageListScene.controller() as? NSViewController else { + fatalError("Controller 'MessageList' is not of the expected class NSViewController.") } - return vc + return controller } case messageListFooterScene = "MessageListFooter" static func instantiateMessageListFooter() -> NSViewController { - guard let vc = StoryboardScene.Message.messageListFooterScene.controller() as? NSViewController - else { - fatalError("ViewController 'MessageListFooter' is not of the expected class NSViewController.") + guard let controller = StoryboardScene.Message.messageListFooterScene.controller() as? NSViewController else { + fatalError("Controller 'MessageListFooter' is not of the expected class NSViewController.") } - return vc + return controller } case messagesTabScene = "MessagesTab" static func instantiateMessagesTab() -> CustomTabViewController { - guard let vc = StoryboardScene.Message.messagesTabScene.controller() as? CustomTabViewController - else { - fatalError("ViewController 'MessagesTab' is not of the expected class CustomTabViewController.") + guard let controller = StoryboardScene.Message.messagesTabScene.controller() as? CustomTabViewController else { + fatalError("Controller 'MessagesTab' is not of the expected class CustomTabViewController.") } - return vc + return controller } case splitMessagesScene = "SplitMessages" static func instantiateSplitMessages() -> NSSplitViewController { - guard let vc = StoryboardScene.Message.splitMessagesScene.controller() as? NSSplitViewController - else { - fatalError("ViewController 'SplitMessages' is not of the expected class NSSplitViewController.") + guard let controller = StoryboardScene.Message.splitMessagesScene.controller() as? NSSplitViewController else { + fatalError("Controller 'SplitMessages' is not of the expected class NSSplitViewController.") } - return vc + return controller } case windowCtrlScene = "WindowCtrl" static func instantiateWindowCtrl() -> NSWindowController { - guard let vc = StoryboardScene.Message.windowCtrlScene.controller() as? NSWindowController - else { - fatalError("ViewController 'WindowCtrl' is not of the expected class NSWindowController.") + guard let controller = StoryboardScene.Message.windowCtrlScene.controller() as? NSWindowController else { + fatalError("Controller 'WindowCtrl' is not of the expected class NSWindowController.") } - return vc + return controller } } enum Placeholder: String, StoryboardSceneType { @@ -139,20 +124,18 @@ enum StoryboardScene { case dependentScene = "Dependent" static func instantiateDependent() -> NSControllerPlaceholder { - guard let vc = StoryboardScene.Placeholder.dependentScene.controller() as? NSControllerPlaceholder - else { - fatalError("ViewController 'Dependent' is not of the expected class NSControllerPlaceholder.") + guard let controller = StoryboardScene.Placeholder.dependentScene.controller() as? NSControllerPlaceholder else { + fatalError("Controller 'Dependent' is not of the expected class NSControllerPlaceholder.") } - return vc + return controller } case windowScene = "Window" static func instantiateWindow() -> NSWindowController { - guard let vc = StoryboardScene.Placeholder.windowScene.controller() as? NSWindowController - else { - fatalError("ViewController 'Window' is not of the expected class NSWindowController.") + guard let controller = StoryboardScene.Placeholder.windowScene.controller() as? NSWindowController else { + fatalError("Controller 'Window' is not of the expected class NSWindowController.") } - return vc + return controller } } } diff --git a/Tests/Expected/Storyboards-macOS/swift3-context-all.swift b/Tests/Expected/Storyboards-macOS/swift3-context-all.swift index bd3774c..09daed5 100644 --- a/Tests/Expected/Storyboards-macOS/swift3-context-all.swift +++ b/Tests/Expected/Storyboards-macOS/swift3-context-all.swift @@ -1,8 +1,8 @@ // Generated using SwiftGen, by O.Halligon — https://github.com/SwiftGen/SwiftGen // swiftlint:disable sorted_imports -import Cocoa import Foundation +import Cocoa import FadeSegue import PrefsWindowController @@ -18,9 +18,8 @@ extension StoryboardSceneType { } static func initialController() -> Any { - guard let controller = storyboard().instantiateInitialController() - else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") + guard let controller = storyboard().instantiateInitialController() else { + fatalError("Failed to instantiate initialController for \(self.storyboardName)") } return controller } @@ -37,15 +36,9 @@ extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == Str protocol StoryboardSegueType: RawRepresentable { } -extension NSWindowController { - func performSegue(segue: S, sender: Any? = nil) where S.RawValue == String { - performSegue(withIdentifier: segue.rawValue, sender: sender) - } -} - -extension NSViewController { - func performSegue(segue: S, sender: Any? = nil) where S.RawValue == String { - performSegue(withIdentifier: segue.rawValue, sender: sender) +extension NSSeguePerforming { + func perform(segue: S, sender: Any? = nil) where S.RawValue == String { + performSegue?(withIdentifier: segue.rawValue, sender: sender) } } @@ -56,11 +49,10 @@ enum StoryboardScene { case privateScene = "private" static func instantiatePrivate() -> PrefsWindowController.DBPrefsWindowController { - guard let vc = StoryboardScene.AdditionalImport.privateScene.controller() as? PrefsWindowController.DBPrefsWindowController - else { - fatalError("ViewController 'private' is not of the expected class PrefsWindowController.DBPrefsWindowController.") + guard let controller = StoryboardScene.AdditionalImport.privateScene.controller() as? PrefsWindowController.DBPrefsWindowController else { + fatalError("Controller 'private' is not of the expected class PrefsWindowController.DBPrefsWindowController.") } - return vc + return controller } } enum Anonymous: StoryboardSceneType { @@ -71,11 +63,10 @@ enum StoryboardScene { case dependentScene = "Dependent" static func instantiateDependent() -> NSViewController { - guard let vc = StoryboardScene.Dependency.dependentScene.controller() as? NSViewController - else { - fatalError("ViewController 'Dependent' is not of the expected class NSViewController.") + guard let controller = StoryboardScene.Dependency.dependentScene.controller() as? NSViewController else { + fatalError("Controller 'Dependent' is not of the expected class NSViewController.") } - return vc + return controller } } enum Message: String, StoryboardSceneType { @@ -83,56 +74,50 @@ enum StoryboardScene { case messageDetailsScene = "MessageDetails" static func instantiateMessageDetails() -> NSViewController { - guard let vc = StoryboardScene.Message.messageDetailsScene.controller() as? NSViewController - else { - fatalError("ViewController 'MessageDetails' is not of the expected class NSViewController.") + guard let controller = StoryboardScene.Message.messageDetailsScene.controller() as? NSViewController else { + fatalError("Controller 'MessageDetails' is not of the expected class NSViewController.") } - return vc + return controller } case messageListScene = "MessageList" static func instantiateMessageList() -> NSViewController { - guard let vc = StoryboardScene.Message.messageListScene.controller() as? NSViewController - else { - fatalError("ViewController 'MessageList' is not of the expected class NSViewController.") + guard let controller = StoryboardScene.Message.messageListScene.controller() as? NSViewController else { + fatalError("Controller 'MessageList' is not of the expected class NSViewController.") } - return vc + return controller } case messageListFooterScene = "MessageListFooter" static func instantiateMessageListFooter() -> NSViewController { - guard let vc = StoryboardScene.Message.messageListFooterScene.controller() as? NSViewController - else { - fatalError("ViewController 'MessageListFooter' is not of the expected class NSViewController.") + guard let controller = StoryboardScene.Message.messageListFooterScene.controller() as? NSViewController else { + fatalError("Controller 'MessageListFooter' is not of the expected class NSViewController.") } - return vc + return controller } case messagesTabScene = "MessagesTab" static func instantiateMessagesTab() -> CustomTabViewController { - guard let vc = StoryboardScene.Message.messagesTabScene.controller() as? CustomTabViewController - else { - fatalError("ViewController 'MessagesTab' is not of the expected class CustomTabViewController.") + guard let controller = StoryboardScene.Message.messagesTabScene.controller() as? CustomTabViewController else { + fatalError("Controller 'MessagesTab' is not of the expected class CustomTabViewController.") } - return vc + return controller } case splitMessagesScene = "SplitMessages" static func instantiateSplitMessages() -> NSSplitViewController { - guard let vc = StoryboardScene.Message.splitMessagesScene.controller() as? NSSplitViewController - else { - fatalError("ViewController 'SplitMessages' is not of the expected class NSSplitViewController.") + guard let controller = StoryboardScene.Message.splitMessagesScene.controller() as? NSSplitViewController else { + fatalError("Controller 'SplitMessages' is not of the expected class NSSplitViewController.") } - return vc + return controller } case windowCtrlScene = "WindowCtrl" static func instantiateWindowCtrl() -> NSWindowController { - guard let vc = StoryboardScene.Message.windowCtrlScene.controller() as? NSWindowController - else { - fatalError("ViewController 'WindowCtrl' is not of the expected class NSWindowController.") + guard let controller = StoryboardScene.Message.windowCtrlScene.controller() as? NSWindowController else { + fatalError("Controller 'WindowCtrl' is not of the expected class NSWindowController.") } - return vc + return controller } } enum Placeholder: String, StoryboardSceneType { @@ -140,20 +125,18 @@ enum StoryboardScene { case dependentScene = "Dependent" static func instantiateDependent() -> NSControllerPlaceholder { - guard let vc = StoryboardScene.Placeholder.dependentScene.controller() as? NSControllerPlaceholder - else { - fatalError("ViewController 'Dependent' is not of the expected class NSControllerPlaceholder.") + guard let controller = StoryboardScene.Placeholder.dependentScene.controller() as? NSControllerPlaceholder else { + fatalError("Controller 'Dependent' is not of the expected class NSControllerPlaceholder.") } - return vc + return controller } case windowScene = "Window" static func instantiateWindow() -> NSWindowController { - guard let vc = StoryboardScene.Placeholder.windowScene.controller() as? NSWindowController - else { - fatalError("ViewController 'Window' is not of the expected class NSWindowController.") + guard let controller = StoryboardScene.Placeholder.windowScene.controller() as? NSWindowController else { + fatalError("Controller 'Window' is not of the expected class NSWindowController.") } - return vc + return controller } } } diff --git a/Tests/TemplatesTests/StoryboardsMacOSTests.swift b/Tests/TemplatesTests/StoryboardsMacOSTests.swift index 41788ed..06d6f75 100644 --- a/Tests/TemplatesTests/StoryboardsMacOSTests.swift +++ b/Tests/TemplatesTests/StoryboardsMacOSTests.swift @@ -6,7 +6,6 @@ import StencilSwiftKit import XCTest -import StencilSwiftKit class StoryboardsMacOSTests: XCTestCase { enum Contexts { @@ -17,47 +16,41 @@ class StoryboardsMacOSTests: XCTestCase { let variations: VariationGenerator = { name, context in guard name == "all" else { return [(context: context, suffix: "")] } - do { - return [ - (context: context, - suffix: ""), - (context: try StencilContext.enrich(context: context, - parameters: ["sceneEnumName=XCTStoryboardsScene", - "segueEnumName=XCTStoryboardsSegue"]), - suffix: "-customname"), - (context: try StencilContext.enrich(context: context, - parameters: [], - environment: ["PRODUCT_MODULE_NAME": "Test"]), - suffix: ""), - (context: try StencilContext.enrich(context: context, - parameters: [], - environment: ["PRODUCT_MODULE_NAME": "FadeSegue"]), - suffix: "-ignore-module"), - (context: try StencilContext.enrich(context: context, - parameters: ["module=Test"]), - suffix: ""), - (context: try StencilContext.enrich(context: context, - parameters: ["module=FadeSegue"]), - suffix: "-ignore-module") - ] - } catch { - fatalError("Unable to create context variations") - } + return [ + (context: context, + suffix: ""), + (context: try StencilContext.enrich(context: context, + parameters: ["sceneEnumName=XCTStoryboardsScene", + "segueEnumName=XCTStoryboardsSegue"]), + suffix: "-customname"), + (context: try StencilContext.enrich(context: context, + parameters: [], + environment: ["PRODUCT_MODULE_NAME": "Test"]), + suffix: ""), + (context: try StencilContext.enrich(context: context, + parameters: [], + environment: ["PRODUCT_MODULE_NAME": "FadeSegue"]), + suffix: "-ignore-module"), + (context: try StencilContext.enrich(context: context, + parameters: ["module=Test"]), + suffix: ""), + (context: try StencilContext.enrich(context: context, + parameters: ["module=FadeSegue"]), + suffix: "-ignore-module") + ] } func testSwift2() { - test(template: "macOS-swift2", + test(template: "swift2", contextNames: Contexts.all, - outputPrefix: "swift2", directory: .storyboards, resourceDirectory: .storyboardsMacOS, contextVariations: variations) } func testSwift3() { - test(template: "macOS-swift3", + test(template: "swift3", contextNames: Contexts.all, - outputPrefix: "swift3", directory: .storyboards, resourceDirectory: .storyboardsMacOS, contextVariations: variations) diff --git a/Tests/TemplatesTests/TestsHelper.swift b/Tests/TemplatesTests/TestsHelper.swift index a727ad9..f2483c6 100644 --- a/Tests/TemplatesTests/TestsHelper.swift +++ b/Tests/TemplatesTests/TestsHelper.swift @@ -141,15 +141,12 @@ extension XCTestCase { - Parameter template: The name of the template (without the `stencil` extension) - Parameter contextNames: A list of context names (without the `plist` extension) - - Parameter outputPrefix: Prefix for the output files, becomes "{outputPrefix}-context-{contextName}.swift". - Defaults to template name. - Parameter directory: The directory to look for files in (correspons to de command) - - Parameter resourceDirectory: The directory to look for files in (corresponds to de command) + - Parameter resourceDirectory: The directory to look for files in (corresponds to the command) - Parameter contextVariations: Optional closure to generate context variations. */ func test(template templateName: String, contextNames: [String], - outputPrefix: String? = nil, directory: Fixtures.Directory, resourceDirectory: Fixtures.Directory? = nil, file: StaticString = #file, @@ -161,7 +158,6 @@ extension XCTestCase { // default values let contextVariations = contextVariations ?? { [(context: $1, suffix: "")] } - let prefix = outputPrefix ?? templateName let resourceDir = resourceDirectory ?? directory for contextName in contextNames { @@ -174,7 +170,7 @@ extension XCTestCase { } for (index, (context: context, suffix: suffix)) in variations.enumerated() { - let outputFile = "\(prefix)-context-\(contextName)\(suffix).swift" + let outputFile = "\(templateName)-context-\(contextName)\(suffix).swift" if variations.count > 1 { print(" - Variation #\(index)... (expecting: \(outputFile))") } guard let result = try? template.render(context) else { fatalError("Unable to render template") diff --git a/templates/storyboards/macOS-swift2.stencil b/templates/storyboards/macOS-swift2.stencil deleted file mode 100644 index 19745bb..0000000 --- a/templates/storyboards/macOS-swift2.stencil +++ /dev/null @@ -1,109 +0,0 @@ -// Generated using SwiftGen, by O.Halligon — https://github.com/SwiftGen/SwiftGen - -{% if storyboards %} -// swiftlint:disable sorted_imports -{% macro className scene %}{% filter removeNewlines %} - {% if scene.customClass %} - {% if scene.customModule %}{{scene.customModule}}.{% endif %} - {{scene.customClass}} - {% else %} - NS{{scene.baseType}} - {% endif %} -{% endfilter %}{% endmacro %} -import Cocoa -import Foundation -{% for module in modules where module != env.PRODUCT_MODULE_NAME and module != param.module %} -import {{module}} -{% endfor %} - -// swiftlint:disable file_length - -{# This first part of the code is static, same every time whatever Storyboard you have #} -protocol StoryboardSceneType { - static var storyboardName: String { get } -} - -extension StoryboardSceneType { - static func storyboard() -> NSStoryboard { - return NSStoryboard(name: self.storyboardName, bundle: NSBundle(forClass: BundleToken.self)) - } - - static func initialController() -> AnyObject { - guard let controller = storyboard().instantiateInitialController() - else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") - } - return controller - } -} - -extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == String { - func controller() -> AnyObject { - return Self.storyboard().instantiateControllerWithIdentifier(self.rawValue) - } - static func controller(identifier: Self) -> AnyObject { - return identifier.controller() - } -} - -protocol StoryboardSegueType: RawRepresentable { } - -extension NSWindowController { - func performSegue(segue: S, sender: AnyObject? = nil) { - performSegueWithIdentifier(segue.rawValue, sender: sender) - } -} - -extension NSViewController { - func performSegue(segue: S, sender: AnyObject? = nil) { - performSegueWithIdentifier(segue.rawValue, sender: sender) - } -} - -{# This is where the generation begins, this code depends on what you have in your Storyboards #} -// swiftlint:disable explicit_type_interface identifier_name line_length type_body_length type_name -{% set sceneEnumName %}{{param.sceneEnumName|default:"StoryboardScene"}}{% endset %} -enum {{sceneEnumName}} { - {% for storyboard in storyboards %} - {% set storyboardName %}{{storyboard.name|swiftIdentifier|escapeReservedKeywords}}{% endset %} - {% if storyboard.scenes %} - enum {{storyboardName}}: String, StoryboardSceneType { - static let storyboardName = "{{storyboard.name}}" - {% for scene in storyboard.scenes %} - {% set sceneID %}{{scene.identifier|swiftIdentifier}}{% endset %} - - case {{sceneID}}Scene = "{{scene.identifier}}" - {% set sceneClass %}{% call className scene %}{% endset %} - static func instantiate{{sceneID|snakeToCamelCase}}() -> {{sceneClass}} { - guard let vc = {{sceneEnumName}}.{{storyboardName}}.{{sceneID}}Scene.controller() as? {{sceneClass}} - else { - fatalError("ViewController '{{scene.identifier}}' is not of the expected class {{sceneClass}}.") - } - return vc - } - {% endfor %} - } - {% else %} - enum {{storyboardName}}: StoryboardSceneType { - static let storyboardName = "{{storyboard.name}}" - } - {% endif %} - {% endfor %} -} - -enum {{param.segueEnumName|default:"StoryboardSegue"}} { - {% for storyboard in storyboards where storyboard.segues %} - enum {{storyboard.name|swiftIdentifier|escapeReservedKeywords}}: String, StoryboardSegueType { - {% for segue in storyboard.segues %} - {% set segueID %}{{segue.identifier|swiftIdentifier}}{% endset %} - case {{segueID|escapeReservedKeywords}}{% if segueID != segue.identifier %} = "{{segue.identifier}}"{% endif %} - {% endfor %} - } - {% endfor %} -} -// swiftlint:enable explicit_type_interface identifier_name line_length type_body_length type_name - -private final class BundleToken {} -{% else %} -// No storyboard found -{% endif %} diff --git a/templates/storyboards/macOS-swift3.stencil b/templates/storyboards/macOS-swift3.stencil deleted file mode 100644 index 9f1ccd6..0000000 --- a/templates/storyboards/macOS-swift3.stencil +++ /dev/null @@ -1,109 +0,0 @@ -// Generated using SwiftGen, by O.Halligon — https://github.com/SwiftGen/SwiftGen - -{% if storyboards %} -// swiftlint:disable sorted_imports -{% macro className scene %}{% filter removeNewlines %} - {% if scene.customClass %} - {% if scene.customModule %}{{scene.customModule}}.{% endif %} - {{scene.customClass}} - {% else %} - NS{{scene.baseType}} - {% endif %} -{% endfilter %}{% endmacro %} -import Cocoa -import Foundation -{% for module in modules where module != env.PRODUCT_MODULE_NAME and module != param.module %} -import {{module}} -{% endfor %} - -// swiftlint:disable file_length - -{# This first part of the code is static, same every time whatever Storyboard you have #} -protocol StoryboardSceneType { - static var storyboardName: String { get } -} - -extension StoryboardSceneType { - static func storyboard() -> NSStoryboard { - return NSStoryboard(name: self.storyboardName, bundle: Bundle(for: BundleToken.self)) - } - - static func initialController() -> Any { - guard let controller = storyboard().instantiateInitialController() - else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") - } - return controller - } -} - -extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == String { - func controller() -> Any { - return Self.storyboard().instantiateController(withIdentifier: self.rawValue) - } - static func controller(identifier: Self) -> Any { - return identifier.controller() - } -} - -protocol StoryboardSegueType: RawRepresentable { } - -extension NSWindowController { - func performSegue(segue: S, sender: Any? = nil) where S.RawValue == String { - performSegue(withIdentifier: segue.rawValue, sender: sender) - } -} - -extension NSViewController { - func performSegue(segue: S, sender: Any? = nil) where S.RawValue == String { - performSegue(withIdentifier: segue.rawValue, sender: sender) - } -} - -{# This is where the generation begins, this code depends on what you have in your Storyboards #} -// swiftlint:disable explicit_type_interface identifier_name line_length type_body_length type_name -{% set sceneEnumName %}{{param.sceneEnumName|default:"StoryboardScene"}}{% endset %} -enum {{sceneEnumName}} { - {% for storyboard in storyboards %} - {% set storyboardName %}{{storyboard.name|swiftIdentifier|escapeReservedKeywords}}{% endset %} - {% if storyboard.scenes %} - enum {{storyboardName}}: String, StoryboardSceneType { - static let storyboardName = "{{storyboard.name}}" - {% for scene in storyboard.scenes %} - {% set sceneID %}{{scene.identifier|swiftIdentifier|snakeToCamelCase|lowerFirstWord}}{% endset %} - - case {{sceneID}}Scene = "{{scene.identifier}}" - {% set sceneClass %}{% call className scene %}{% endset %} - static func instantiate{{sceneID||snakeToCamelCase}}() -> {{sceneClass}} { - guard let vc = {{sceneEnumName}}.{{storyboardName}}.{{sceneID}}Scene.controller() as? {{sceneClass}} - else { - fatalError("ViewController '{{scene.identifier}}' is not of the expected class {{sceneClass}}.") - } - return vc - } - {% endfor %} - } - {% else %} - enum {{storyboardName}}: StoryboardSceneType { - static let storyboardName = "{{storyboard.name}}" - } - {% endif %} - {% endfor %} -} - -enum {{param.segueEnumName|default:"StoryboardSegue"}} { - {% for storyboard in storyboards where storyboard.segues %} - enum {{storyboard.name|swiftIdentifier|escapeReservedKeywords}}: String, StoryboardSegueType { - {% for segue in storyboard.segues %} - {% set segueID %}{{segue.identifier|swiftIdentifier|snakeToCamelCase|lowerFirstWord}}{% endset %} - case {{segueID|escapeReservedKeywords}}{% if segueID != segue.identifier %} = "{{segue.identifier}}"{% endif %} - {% endfor %} - } - {% endfor %} -} -// swiftlint:enable explicit_type_interface identifier_name line_length type_body_length type_name - -private final class BundleToken {} -{% else %} -// No storyboard found -{% endif %} diff --git a/templates/storyboards/swift2.stencil b/templates/storyboards/swift2.stencil index 8c877e5..a96875a 100644 --- a/templates/storyboards/swift2.stencil +++ b/templates/storyboards/swift2.stencil @@ -1,17 +1,13 @@ // Generated using SwiftGen, by O.Halligon — https://github.com/SwiftGen/SwiftGen {% if storyboards %} +{% set isAppKit %}{% if platform == "macOS" %}true{% endif %}{% endset %} +{% set prefix %}{% if isAppKit %}NS{% else %}UI{% endif %}{% endset %} +{% set controller %}{% if isAppKit %}Controller{% else %}ViewController{% endif %}{% endset %} +{% set baseType %}{% if isAppKit %}AnyObject{% else %}UIViewController{% endif %}{% endset %} // swiftlint:disable sorted_imports -{% macro className scene %}{% filter removeNewlines %} - {% if scene.customClass %} - {% if scene.customModule %}{{scene.customModule}}.{% endif %} - {{scene.customClass}} - {% else %} - UI{{scene.baseType}} - {% endif %} -{% endfilter %}{% endmacro %} import Foundation -import UIKit +import {% if isAppKit %}Cocoa{% else %}UIKit{% endif %} {% for module in modules where module != env.PRODUCT_MODULE_NAME and module != param.module %} import {{module}} {% endfor %} @@ -24,89 +20,80 @@ protocol StoryboardSceneType { } extension StoryboardSceneType { - static func storyboard() -> UIStoryboard { - return UIStoryboard(name: self.storyboardName, bundle: NSBundle(forClass: BundleToken.self)) + static func storyboard() -> {{prefix}}Storyboard { + return {{prefix}}Storyboard(name: self.storyboardName, bundle: NSBundle(forClass: BundleToken.self)) } - static func initialViewController() -> UIViewController { - guard let vc = storyboard().instantiateInitialViewController() else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") + static func initial{{controller}}() -> {{baseType}} { + guard let controller = storyboard().instantiateInitial{{controller}}() else { + fatalError("Failed to instantiate initial{{controller}} for \(self.storyboardName)") } - return vc + return controller } } extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == String { - func viewController() -> UIViewController { - return Self.storyboard().instantiateViewControllerWithIdentifier(self.rawValue) + func {{controller|lowerFirstWord}}() -> {{baseType}} { + return Self.storyboard().instantiate{{controller}}WithIdentifier(self.rawValue) } - static func viewController(identifier: Self) -> UIViewController { - return identifier.viewController() + static func {{controller|lowerFirstWord}}(identifier: Self) -> {{baseType}} { + return identifier.{{controller|lowerFirstWord}}() } } protocol StoryboardSegueType: RawRepresentable { } -extension UIViewController { +extension {% if isAppKit %}NSSeguePerforming{% else %}{{baseType}}{% endif %} { func performSegue(segue: S, sender: AnyObject? = nil) { - performSegueWithIdentifier(segue.rawValue, sender: sender) + performSegueWithIdentifier{% if isAppKit %}?{% endif %}(segue.rawValue, sender: sender) } } {# This is where the generation begins, this code depends on what you have in your Storyboards #} // swiftlint:disable explicit_type_interface identifier_name line_length type_body_length type_name {% set sceneEnumName %}{{param.sceneEnumName|default:"StoryboardScene"}}{% endset %} +{% macro className scene %}{% filter removeNewlines %} + {% if scene.customClass %} + {% if scene.customModule %}{{scene.customModule}}.{% endif %} + {{scene.customClass}} + {% else %} + {{prefix}}{{scene.baseType}} + {% endif %} +{% endfilter %}{% endmacro %} enum {{sceneEnumName}} { {% for storyboard in storyboards %} {% set storyboardName %}{{storyboard.name|swiftIdentifier|escapeReservedKeywords}}{% endset %} - {% if storyboard.scenes %} - enum {{storyboardName}}: String, StoryboardSceneType { + enum {{storyboardName}}: {% if storyboard.scenes %}String, {% endif %}StoryboardSceneType { static let storyboardName = "{{storyboard.name}}" - {% if storyboard.initialScene and storyboard.initialScene.baseType != "ViewController" %} + {% if storyboard.initialScene %}{% if isAppKit or storyboard.initialScene.baseType != "ViewController" %} {% set initialSceneClass %}{% call className storyboard.initialScene %}{% endset %} static func initialViewController() -> {{initialSceneClass}} { - guard let vc = storyboard().instantiateInitialViewController() as? {{initialSceneClass}} else { + guard let controller = storyboard().instantiateInitialViewController() as? {{initialSceneClass}} else { fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") } - return vc + return controller } - {% endif %} + {% endif %}{% endif %} + {% if storyboard.scenes %} {% for scene in storyboard.scenes %} {% set sceneID %}{{scene.identifier|swiftIdentifier}}{% endset %} case {{sceneID}}Scene = "{{scene.identifier}}" - {% if scene.baseType != "ViewController" %} {% set sceneClass %}{% call className scene %}{% endset %} static func instantiate{{sceneID|snakeToCamelCase}}() -> {{sceneClass}} { - guard let vc = {{sceneEnumName}}.{{storyboardName}}.{{sceneID}}Scene.viewController() as? {{sceneClass}} - else { - fatalError("ViewController '{{scene.identifier}}' is not of the expected class {{sceneClass}}.") + {% if isAppKit or scene.baseType != "ViewController" %} + guard let controller = {{sceneEnumName}}.{{storyboardName}}.{{sceneID}}Scene.{{controller|lowerFirstWord}}() as? {{sceneClass}} else { + fatalError("{{controller}} '{{scene.identifier}}' is not of the expected class {{sceneClass}}.") } - return vc - } - {% else %} - static func instantiate{{sceneID|snakeToCamelCase}}() -> UIViewController { - return {{sceneEnumName}}.{{storyboardName}}.{{sceneID}}Scene.viewController() + return controller + {% else %} + return {{sceneEnumName}}.{{storyboardName}}.{{sceneID}}Scene.{{controller|lowerFirstWord}}() + {% endif %} } - {% endif %} {% endfor %} - } - {% else %} - enum {{storyboardName}}: StoryboardSceneType { - static let storyboardName = "{{storyboard.name}}" - {% if storyboard.initialScene and storyboard.initialScene.baseType != "ViewController" %} - {% set initialSceneClass %}{% call className storyboard.initialScene %}{% endset %} - - static func initialViewController() -> {{initialSceneClass}} { - guard let vc = storyboard().instantiateInitialViewController() as? {{initialSceneClass}} else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") - } - return vc - } {% endif %} } - {% endif %} {% endfor %} } diff --git a/templates/storyboards/swift3.stencil b/templates/storyboards/swift3.stencil index 9abb104..a6ce9e3 100644 --- a/templates/storyboards/swift3.stencil +++ b/templates/storyboards/swift3.stencil @@ -1,17 +1,13 @@ // Generated using SwiftGen, by O.Halligon — https://github.com/SwiftGen/SwiftGen {% if storyboards %} +{% set isAppKit %}{% if platform == "macOS" %}true{% endif %}{% endset %} +{% set prefix %}{% if isAppKit %}NS{% else %}UI{% endif %}{% endset %} +{% set controller %}{% if isAppKit %}Controller{% else %}ViewController{% endif %}{% endset %} +{% set baseType %}{% if isAppKit %}Any{% else %}UIViewController{% endif %}{% endset %} // swiftlint:disable sorted_imports -{% macro className scene %}{% filter removeNewlines %} - {% if scene.customClass %} - {% if scene.customModule %}{{scene.customModule}}.{% endif %} - {{scene.customClass}} - {% else %} - UI{{scene.baseType}} - {% endif %} -{% endfilter %}{% endmacro %} import Foundation -import UIKit +import {% if isAppKit %}Cocoa{% else %}UIKit{% endif %} {% for module in modules where module != env.PRODUCT_MODULE_NAME and module != param.module %} import {{module}} {% endfor %} @@ -24,89 +20,80 @@ protocol StoryboardSceneType { } extension StoryboardSceneType { - static func storyboard() -> UIStoryboard { - return UIStoryboard(name: self.storyboardName, bundle: Bundle(for: BundleToken.self)) + static func storyboard() -> {{prefix}}Storyboard { + return {{prefix}}Storyboard(name: self.storyboardName, bundle: Bundle(for: BundleToken.self)) } - static func initialViewController() -> UIViewController { - guard let vc = storyboard().instantiateInitialViewController() else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") + static func initial{{controller}}() -> {{baseType}} { + guard let controller = storyboard().instantiateInitial{{controller}}() else { + fatalError("Failed to instantiate initial{{controller}} for \(self.storyboardName)") } - return vc + return controller } } extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == String { - func viewController() -> UIViewController { - return Self.storyboard().instantiateViewController(withIdentifier: self.rawValue) + func {{controller|lowerFirstWord}}() -> {{baseType}} { + return Self.storyboard().instantiate{{controller}}(withIdentifier: self.rawValue) } - static func viewController(identifier: Self) -> UIViewController { - return identifier.viewController() + static func {{controller|lowerFirstWord}}(identifier: Self) -> {{baseType}} { + return identifier.{{controller|lowerFirstWord}}() } } protocol StoryboardSegueType: RawRepresentable { } -extension UIViewController { +extension {% if isAppKit %}NSSeguePerforming{% else %}{{baseType}}{% endif %} { func perform(segue: S, sender: Any? = nil) where S.RawValue == String { - performSegue(withIdentifier: segue.rawValue, sender: sender) + performSegue{% if isAppKit %}?{% endif %}(withIdentifier: segue.rawValue, sender: sender) } } {# This is where the generation begins, this code depends on what you have in your Storyboards #} // swiftlint:disable explicit_type_interface identifier_name line_length type_body_length type_name {% set sceneEnumName %}{{param.sceneEnumName|default:"StoryboardScene"}}{% endset %} +{% macro className scene %}{% filter removeNewlines %} + {% if scene.customClass %} + {% if scene.customModule %}{{scene.customModule}}.{% endif %} + {{scene.customClass}} + {% else %} + {{prefix}}{{scene.baseType}} + {% endif %} +{% endfilter %}{% endmacro %} enum {{sceneEnumName}} { {% for storyboard in storyboards %} {% set storyboardName %}{{storyboard.name|swiftIdentifier|escapeReservedKeywords}}{% endset %} - {% if storyboard.scenes %} - enum {{storyboardName}}: String, StoryboardSceneType { + enum {{storyboardName}}: {% if storyboard.scenes %}String, {% endif %}StoryboardSceneType { static let storyboardName = "{{storyboard.name}}" - {% if storyboard.initialScene and storyboard.initialScene.baseType != "ViewController" %} + {% if storyboard.initialScene %}{% if isAppKit or storyboard.initialScene.baseType != "ViewController" %} {% set initialSceneClass %}{% call className storyboard.initialScene %}{% endset %} static func initialViewController() -> {{initialSceneClass}} { - guard let vc = storyboard().instantiateInitialViewController() as? {{initialSceneClass}} else { + guard let controller = storyboard().instantiateInitialViewController() as? {{initialSceneClass}} else { fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") } - return vc + return controller } - {% endif %} + {% endif %}{% endif %} + {% if storyboard.scenes %} {% for scene in storyboard.scenes %} {% set sceneID %}{{scene.identifier|swiftIdentifier|snakeToCamelCase|lowerFirstWord}}{% endset %} case {{sceneID}}Scene = "{{scene.identifier}}" - {% if scene.baseType != "ViewController" %} {% set sceneClass %}{% call className scene %}{% endset %} static func instantiate{{sceneID|snakeToCamelCase}}() -> {{sceneClass}} { - guard let vc = {{sceneEnumName}}.{{storyboardName}}.{{sceneID}}Scene.viewController() as? {{sceneClass}} - else { - fatalError("ViewController '{{scene.identifier}}' is not of the expected class {{sceneClass}}.") + {% if isAppKit or scene.baseType != "ViewController" %} + guard let controller = {{sceneEnumName}}.{{storyboardName}}.{{sceneID}}Scene.{{controller|lowerFirstWord}}() as? {{sceneClass}} else { + fatalError("{{controller}} '{{scene.identifier}}' is not of the expected class {{sceneClass}}.") } - return vc - } - {% else %} - static func instantiate{{sceneID|snakeToCamelCase}}() -> UIViewController { - return {{sceneEnumName}}.{{storyboardName}}.{{sceneID}}Scene.viewController() + return controller + {% else %} + return {{sceneEnumName}}.{{storyboardName}}.{{sceneID}}Scene.{{controller|lowerFirstWord}}() + {% endif %} } - {% endif %} {% endfor %} - } - {% else %} - enum {{storyboardName}}: StoryboardSceneType { - static let storyboardName = "{{storyboard.name}}" - {% if storyboard.initialScene and storyboard.initialScene.baseType != "ViewController" %} - {% set initialSceneClass %}{% call className storyboard.initialScene %}{% endset %} - - static func initialViewController() -> {{initialSceneClass}} { - guard let vc = storyboard().instantiateInitialViewController() as? {{initialSceneClass}} else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") - } - return vc - } {% endif %} } - {% endif %} {% endfor %} } From fdcc97988e925f21b2325360f5ca3eac82a03a51 Mon Sep 17 00:00:00 2001 From: David Jennes Date: Wed, 31 May 2017 20:47:50 +0200 Subject: [PATCH 2/5] Remove default initialController implementation, it is almost always overloaded --- .../swift2-context-all-customname.swift | 14 ++++++------- .../swift2-context-all-ignore-module.swift | 14 ++++++------- .../Storyboards-iOS/swift2-context-all.swift | 14 ++++++------- .../swift3-context-all-customname.swift | 14 ++++++------- .../swift3-context-all-ignore-module.swift | 14 ++++++------- .../Storyboards-iOS/swift3-context-all.swift | 14 ++++++------- .../swift2-context-all-customname.swift | 7 ------- .../swift2-context-all-ignore-module.swift | 7 ------- .../swift2-context-all.swift | 7 ------- .../swift3-context-all-customname.swift | 7 ------- .../swift3-context-all-ignore-module.swift | 7 ------- .../swift3-context-all.swift | 7 ------- templates/storyboards/swift2.stencil | 18 ++++++----------- templates/storyboards/swift3.stencil | 20 +++++++------------ 14 files changed, 55 insertions(+), 109 deletions(-) diff --git a/Tests/Expected/Storyboards-iOS/swift2-context-all-customname.swift b/Tests/Expected/Storyboards-iOS/swift2-context-all-customname.swift index df8826d..59c456d 100644 --- a/Tests/Expected/Storyboards-iOS/swift2-context-all-customname.swift +++ b/Tests/Expected/Storyboards-iOS/swift2-context-all-customname.swift @@ -17,13 +17,6 @@ extension StoryboardSceneType { static func storyboard() -> UIStoryboard { return UIStoryboard(name: self.storyboardName, bundle: NSBundle(forClass: BundleToken.self)) } - - static func initialViewController() -> UIViewController { - guard let controller = storyboard().instantiateInitialViewController() else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") - } - return controller - } } extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == String { @@ -84,6 +77,13 @@ enum XCTStoryboardsScene { enum Message: String, StoryboardSceneType { static let storyboardName = "Message" + static func initialViewController() -> UIViewController { + guard let controller = storyboard().instantiateInitialViewController() else { + fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") + } + return controller + } + case ComposerScene = "Composer" static func instantiateComposer() -> UIViewController { return XCTStoryboardsScene.Message.ComposerScene.viewController() diff --git a/Tests/Expected/Storyboards-iOS/swift2-context-all-ignore-module.swift b/Tests/Expected/Storyboards-iOS/swift2-context-all-ignore-module.swift index d64d3b4..6901952 100644 --- a/Tests/Expected/Storyboards-iOS/swift2-context-all-ignore-module.swift +++ b/Tests/Expected/Storyboards-iOS/swift2-context-all-ignore-module.swift @@ -16,13 +16,6 @@ extension StoryboardSceneType { static func storyboard() -> UIStoryboard { return UIStoryboard(name: self.storyboardName, bundle: NSBundle(forClass: BundleToken.self)) } - - static func initialViewController() -> UIViewController { - guard let controller = storyboard().instantiateInitialViewController() else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") - } - return controller - } } extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == String { @@ -83,6 +76,13 @@ enum StoryboardScene { enum Message: String, StoryboardSceneType { static let storyboardName = "Message" + static func initialViewController() -> UIViewController { + guard let controller = storyboard().instantiateInitialViewController() else { + fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") + } + return controller + } + case ComposerScene = "Composer" static func instantiateComposer() -> UIViewController { return StoryboardScene.Message.ComposerScene.viewController() diff --git a/Tests/Expected/Storyboards-iOS/swift2-context-all.swift b/Tests/Expected/Storyboards-iOS/swift2-context-all.swift index 02c2626..e3c9f1a 100644 --- a/Tests/Expected/Storyboards-iOS/swift2-context-all.swift +++ b/Tests/Expected/Storyboards-iOS/swift2-context-all.swift @@ -17,13 +17,6 @@ extension StoryboardSceneType { static func storyboard() -> UIStoryboard { return UIStoryboard(name: self.storyboardName, bundle: NSBundle(forClass: BundleToken.self)) } - - static func initialViewController() -> UIViewController { - guard let controller = storyboard().instantiateInitialViewController() else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") - } - return controller - } } extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == String { @@ -84,6 +77,13 @@ enum StoryboardScene { enum Message: String, StoryboardSceneType { static let storyboardName = "Message" + static func initialViewController() -> UIViewController { + guard let controller = storyboard().instantiateInitialViewController() else { + fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") + } + return controller + } + case ComposerScene = "Composer" static func instantiateComposer() -> UIViewController { return StoryboardScene.Message.ComposerScene.viewController() diff --git a/Tests/Expected/Storyboards-iOS/swift3-context-all-customname.swift b/Tests/Expected/Storyboards-iOS/swift3-context-all-customname.swift index 345efc8..14374f9 100644 --- a/Tests/Expected/Storyboards-iOS/swift3-context-all-customname.swift +++ b/Tests/Expected/Storyboards-iOS/swift3-context-all-customname.swift @@ -17,13 +17,6 @@ extension StoryboardSceneType { static func storyboard() -> UIStoryboard { return UIStoryboard(name: self.storyboardName, bundle: Bundle(for: BundleToken.self)) } - - static func initialViewController() -> UIViewController { - guard let controller = storyboard().instantiateInitialViewController() else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") - } - return controller - } } extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == String { @@ -84,6 +77,13 @@ enum XCTStoryboardsScene { enum Message: String, StoryboardSceneType { static let storyboardName = "Message" + static func initialViewController() -> UIViewController { + guard let controller = storyboard().instantiateInitialViewController() else { + fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") + } + return controller + } + case composerScene = "Composer" static func instantiateComposer() -> UIViewController { return XCTStoryboardsScene.Message.composerScene.viewController() diff --git a/Tests/Expected/Storyboards-iOS/swift3-context-all-ignore-module.swift b/Tests/Expected/Storyboards-iOS/swift3-context-all-ignore-module.swift index c43f51a..e5a8ee0 100644 --- a/Tests/Expected/Storyboards-iOS/swift3-context-all-ignore-module.swift +++ b/Tests/Expected/Storyboards-iOS/swift3-context-all-ignore-module.swift @@ -16,13 +16,6 @@ extension StoryboardSceneType { static func storyboard() -> UIStoryboard { return UIStoryboard(name: self.storyboardName, bundle: Bundle(for: BundleToken.self)) } - - static func initialViewController() -> UIViewController { - guard let controller = storyboard().instantiateInitialViewController() else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") - } - return controller - } } extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == String { @@ -83,6 +76,13 @@ enum StoryboardScene { enum Message: String, StoryboardSceneType { static let storyboardName = "Message" + static func initialViewController() -> UIViewController { + guard let controller = storyboard().instantiateInitialViewController() else { + fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") + } + return controller + } + case composerScene = "Composer" static func instantiateComposer() -> UIViewController { return StoryboardScene.Message.composerScene.viewController() diff --git a/Tests/Expected/Storyboards-iOS/swift3-context-all.swift b/Tests/Expected/Storyboards-iOS/swift3-context-all.swift index be69ed9..f39dcf5 100644 --- a/Tests/Expected/Storyboards-iOS/swift3-context-all.swift +++ b/Tests/Expected/Storyboards-iOS/swift3-context-all.swift @@ -17,13 +17,6 @@ extension StoryboardSceneType { static func storyboard() -> UIStoryboard { return UIStoryboard(name: self.storyboardName, bundle: Bundle(for: BundleToken.self)) } - - static func initialViewController() -> UIViewController { - guard let controller = storyboard().instantiateInitialViewController() else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") - } - return controller - } } extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == String { @@ -84,6 +77,13 @@ enum StoryboardScene { enum Message: String, StoryboardSceneType { static let storyboardName = "Message" + static func initialViewController() -> UIViewController { + guard let controller = storyboard().instantiateInitialViewController() else { + fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") + } + return controller + } + case composerScene = "Composer" static func instantiateComposer() -> UIViewController { return StoryboardScene.Message.composerScene.viewController() diff --git a/Tests/Expected/Storyboards-macOS/swift2-context-all-customname.swift b/Tests/Expected/Storyboards-macOS/swift2-context-all-customname.swift index c1ad608..f6e28db 100644 --- a/Tests/Expected/Storyboards-macOS/swift2-context-all-customname.swift +++ b/Tests/Expected/Storyboards-macOS/swift2-context-all-customname.swift @@ -16,13 +16,6 @@ extension StoryboardSceneType { static func storyboard() -> NSStoryboard { return NSStoryboard(name: self.storyboardName, bundle: NSBundle(forClass: BundleToken.self)) } - - static func initialController() -> AnyObject { - guard let controller = storyboard().instantiateInitialController() else { - fatalError("Failed to instantiate initialController for \(self.storyboardName)") - } - return controller - } } extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == String { diff --git a/Tests/Expected/Storyboards-macOS/swift2-context-all-ignore-module.swift b/Tests/Expected/Storyboards-macOS/swift2-context-all-ignore-module.swift index 299d8d5..202b3a6 100644 --- a/Tests/Expected/Storyboards-macOS/swift2-context-all-ignore-module.swift +++ b/Tests/Expected/Storyboards-macOS/swift2-context-all-ignore-module.swift @@ -15,13 +15,6 @@ extension StoryboardSceneType { static func storyboard() -> NSStoryboard { return NSStoryboard(name: self.storyboardName, bundle: NSBundle(forClass: BundleToken.self)) } - - static func initialController() -> AnyObject { - guard let controller = storyboard().instantiateInitialController() else { - fatalError("Failed to instantiate initialController for \(self.storyboardName)") - } - return controller - } } extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == String { diff --git a/Tests/Expected/Storyboards-macOS/swift2-context-all.swift b/Tests/Expected/Storyboards-macOS/swift2-context-all.swift index 4125ab3..4775089 100644 --- a/Tests/Expected/Storyboards-macOS/swift2-context-all.swift +++ b/Tests/Expected/Storyboards-macOS/swift2-context-all.swift @@ -16,13 +16,6 @@ extension StoryboardSceneType { static func storyboard() -> NSStoryboard { return NSStoryboard(name: self.storyboardName, bundle: NSBundle(forClass: BundleToken.self)) } - - static func initialController() -> AnyObject { - guard let controller = storyboard().instantiateInitialController() else { - fatalError("Failed to instantiate initialController for \(self.storyboardName)") - } - return controller - } } extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == String { diff --git a/Tests/Expected/Storyboards-macOS/swift3-context-all-customname.swift b/Tests/Expected/Storyboards-macOS/swift3-context-all-customname.swift index bf0633d..9a85707 100644 --- a/Tests/Expected/Storyboards-macOS/swift3-context-all-customname.swift +++ b/Tests/Expected/Storyboards-macOS/swift3-context-all-customname.swift @@ -16,13 +16,6 @@ extension StoryboardSceneType { static func storyboard() -> NSStoryboard { return NSStoryboard(name: self.storyboardName, bundle: Bundle(for: BundleToken.self)) } - - static func initialController() -> Any { - guard let controller = storyboard().instantiateInitialController() else { - fatalError("Failed to instantiate initialController for \(self.storyboardName)") - } - return controller - } } extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == String { diff --git a/Tests/Expected/Storyboards-macOS/swift3-context-all-ignore-module.swift b/Tests/Expected/Storyboards-macOS/swift3-context-all-ignore-module.swift index 02bb395..a3d0143 100644 --- a/Tests/Expected/Storyboards-macOS/swift3-context-all-ignore-module.swift +++ b/Tests/Expected/Storyboards-macOS/swift3-context-all-ignore-module.swift @@ -15,13 +15,6 @@ extension StoryboardSceneType { static func storyboard() -> NSStoryboard { return NSStoryboard(name: self.storyboardName, bundle: Bundle(for: BundleToken.self)) } - - static func initialController() -> Any { - guard let controller = storyboard().instantiateInitialController() else { - fatalError("Failed to instantiate initialController for \(self.storyboardName)") - } - return controller - } } extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == String { diff --git a/Tests/Expected/Storyboards-macOS/swift3-context-all.swift b/Tests/Expected/Storyboards-macOS/swift3-context-all.swift index 09daed5..9adefb0 100644 --- a/Tests/Expected/Storyboards-macOS/swift3-context-all.swift +++ b/Tests/Expected/Storyboards-macOS/swift3-context-all.swift @@ -16,13 +16,6 @@ extension StoryboardSceneType { static func storyboard() -> NSStoryboard { return NSStoryboard(name: self.storyboardName, bundle: Bundle(for: BundleToken.self)) } - - static func initialController() -> Any { - guard let controller = storyboard().instantiateInitialController() else { - fatalError("Failed to instantiate initialController for \(self.storyboardName)") - } - return controller - } } extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == String { diff --git a/templates/storyboards/swift2.stencil b/templates/storyboards/swift2.stencil index a96875a..1971339 100644 --- a/templates/storyboards/swift2.stencil +++ b/templates/storyboards/swift2.stencil @@ -23,13 +23,6 @@ extension StoryboardSceneType { static func storyboard() -> {{prefix}}Storyboard { return {{prefix}}Storyboard(name: self.storyboardName, bundle: NSBundle(forClass: BundleToken.self)) } - - static func initial{{controller}}() -> {{baseType}} { - guard let controller = storyboard().instantiateInitial{{controller}}() else { - fatalError("Failed to instantiate initial{{controller}} for \(self.storyboardName)") - } - return controller - } } extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == String { @@ -65,16 +58,17 @@ enum {{sceneEnumName}} { {% set storyboardName %}{{storyboard.name|swiftIdentifier|escapeReservedKeywords}}{% endset %} enum {{storyboardName}}: {% if storyboard.scenes %}String, {% endif %}StoryboardSceneType { static let storyboardName = "{{storyboard.name}}" - {% if storyboard.initialScene %}{% if isAppKit or storyboard.initialScene.baseType != "ViewController" %} - {% set initialSceneClass %}{% call className storyboard.initialScene %}{% endset %} + {% if storyboard.initialScene %} - static func initialViewController() -> {{initialSceneClass}} { - guard let controller = storyboard().instantiateInitialViewController() as? {{initialSceneClass}} else { + {% set sceneClass %}{% call className storyboard.initialScene %}{% endset %} + {% set castAsClass %}{% if isAppKit or storyboard.initialScene.baseType != "ViewController" %} as? {{sceneClass}}{% endif %}{% endset %} + static func initialViewController() -> {{sceneClass}} { + guard let controller = storyboard().instantiateInitialViewController(){{castAsClass}} else { fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") } return controller } - {% endif %}{% endif %} + {% endif %} {% if storyboard.scenes %} {% for scene in storyboard.scenes %} {% set sceneID %}{{scene.identifier|swiftIdentifier}}{% endset %} diff --git a/templates/storyboards/swift3.stencil b/templates/storyboards/swift3.stencil index a6ce9e3..6dddfc8 100644 --- a/templates/storyboards/swift3.stencil +++ b/templates/storyboards/swift3.stencil @@ -23,13 +23,6 @@ extension StoryboardSceneType { static func storyboard() -> {{prefix}}Storyboard { return {{prefix}}Storyboard(name: self.storyboardName, bundle: Bundle(for: BundleToken.self)) } - - static func initial{{controller}}() -> {{baseType}} { - guard let controller = storyboard().instantiateInitial{{controller}}() else { - fatalError("Failed to instantiate initial{{controller}} for \(self.storyboardName)") - } - return controller - } } extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == String { @@ -65,16 +58,17 @@ enum {{sceneEnumName}} { {% set storyboardName %}{{storyboard.name|swiftIdentifier|escapeReservedKeywords}}{% endset %} enum {{storyboardName}}: {% if storyboard.scenes %}String, {% endif %}StoryboardSceneType { static let storyboardName = "{{storyboard.name}}" - {% if storyboard.initialScene %}{% if isAppKit or storyboard.initialScene.baseType != "ViewController" %} - {% set initialSceneClass %}{% call className storyboard.initialScene %}{% endset %} + {% if storyboard.initialScene %} - static func initialViewController() -> {{initialSceneClass}} { - guard let controller = storyboard().instantiateInitialViewController() as? {{initialSceneClass}} else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") + {% set sceneClass %}{% call className storyboard.initialScene %}{% endset %} + {% set castAsClass %}{% if isAppKit or storyboard.initialScene.baseType != "ViewController" %} as? {{sceneClass}}{% endif %}{% endset %} + static func initialViewController() -> {{sceneClass}} { + guard let controller = storyboard().instantiateInitial{{controller}}(){{castAsClass}} else { + fatalError("Failed to instantiate initial{{controller}} for \(self.storyboardName)") } return controller } - {% endif %}{% endif %} + {% endif %} {% if storyboard.scenes %} {% for scene in storyboard.scenes %} {% set sceneID %}{{scene.identifier|swiftIdentifier|snakeToCamelCase|lowerFirstWord}}{% endset %} From 61a1e17d390b30d6d14fc3ded6cae2422768ea86 Mon Sep 17 00:00:00 2001 From: David Jennes Date: Mon, 5 Jun 2017 22:21:18 +0200 Subject: [PATCH 3/5] Refactor scene identifiers into a struct --- .../swift2-context-all-customname.swift | 156 ++++++------------ .../swift2-context-all-ignore-module.swift | 156 ++++++------------ .../Storyboards-iOS/swift2-context-all.swift | 156 ++++++------------ .../swift3-context-all-customname.swift | 156 ++++++------------ .../swift3-context-all-ignore-module.swift | 156 ++++++------------ .../Storyboards-iOS/swift3-context-all.swift | 156 ++++++------------ .../swift2-context-all-customname.swift | 126 +++++--------- .../swift2-context-all-ignore-module.swift | 126 +++++--------- .../swift2-context-all.swift | 126 +++++--------- .../swift3-context-all-customname.swift | 126 +++++--------- .../swift3-context-all-ignore-module.swift | 126 +++++--------- .../swift3-context-all.swift | 126 +++++--------- templates/storyboards/swift2.stencil | 65 ++++---- templates/storyboards/swift3.stencil | 65 ++++---- 14 files changed, 588 insertions(+), 1234 deletions(-) diff --git a/Tests/Expected/Storyboards-iOS/swift2-context-all-customname.swift b/Tests/Expected/Storyboards-iOS/swift2-context-all-customname.swift index 59c456d..69e7bf2 100644 --- a/Tests/Expected/Storyboards-iOS/swift2-context-all-customname.swift +++ b/Tests/Expected/Storyboards-iOS/swift2-context-all-customname.swift @@ -9,170 +9,110 @@ import SlackTextViewController // swiftlint:disable file_length -protocol StoryboardSceneType { +protocol StoryboardType { static var storyboardName: String { get } } -extension StoryboardSceneType { - static func storyboard() -> UIStoryboard { +extension StoryboardType { + static var storyboard: UIStoryboard { return UIStoryboard(name: self.storyboardName, bundle: NSBundle(forClass: BundleToken.self)) } } -extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == String { - func viewController() -> UIViewController { - return Self.storyboard().instantiateViewControllerWithIdentifier(self.rawValue) +struct SceneType { + let storyboard: StoryboardType.Type + let identifier: String + + var controller: T { + guard let controller = storyboard.storyboard.instantiateViewControllerWithIdentifier(identifier) as? T else { + fatalError("Controller '\(identifier)' is not of the expected class \(T.self).") + } + return controller } - static func viewController(identifier: Self) -> UIViewController { - return identifier.viewController() +} + +struct InitialSceneType { + let storyboard: StoryboardType.Type + + var controller: T { + guard let controller = storyboard.storyboard.instantiateInitialViewController() as? T else { + fatalError("Controller is not of the expected class \(T.self).") + } + return controller } } -protocol StoryboardSegueType: RawRepresentable { } +protocol SegueType: RawRepresentable { } extension UIViewController { - func performSegue(segue: S, sender: AnyObject? = nil) { + func performSegue(segue: S, sender: AnyObject? = nil) { performSegueWithIdentifier(segue.rawValue, sender: sender) } } // swiftlint:disable explicit_type_interface identifier_name line_length type_body_length type_name enum XCTStoryboardsScene { - enum AdditionalImport: String, StoryboardSceneType { + enum AdditionalImport: StoryboardType { static let storyboardName = "AdditionalImport" - static func initialViewController() -> LocationPicker.LocationPickerViewController { - guard let controller = storyboard().instantiateInitialViewController() as? LocationPicker.LocationPickerViewController else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") - } - return controller - } + static let initialScene = InitialSceneType(AdditionalImport.self) - case PublicScene = "public" - static func instantiatePublic() -> SlackTextViewController.SLKTextViewController { - guard let controller = XCTStoryboardsScene.AdditionalImport.PublicScene.viewController() as? SlackTextViewController.SLKTextViewController else { - fatalError("ViewController 'public' is not of the expected class SlackTextViewController.SLKTextViewController.") - } - return controller - } + static let Public = SceneType(AdditionalImport.self, identifier: "public") } - enum Anonymous: StoryboardSceneType { + enum Anonymous: StoryboardType { static let storyboardName = "Anonymous" - static func initialViewController() -> UINavigationController { - guard let controller = storyboard().instantiateInitialViewController() as? UINavigationController else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") - } - return controller - } + static let initialScene = InitialSceneType(Anonymous.self) } - enum Dependency: String, StoryboardSceneType { + enum Dependency: StoryboardType { static let storyboardName = "Dependency" - case DependentScene = "Dependent" - static func instantiateDependent() -> UIViewController { - return XCTStoryboardsScene.Dependency.DependentScene.viewController() - } + static let Dependent = SceneType(Dependency.self, identifier: "Dependent") } - enum Message: String, StoryboardSceneType { + enum Message: StoryboardType { static let storyboardName = "Message" - static func initialViewController() -> UIViewController { - guard let controller = storyboard().instantiateInitialViewController() else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") - } - return controller - } + static let initialScene = InitialSceneType(Message.self) - case ComposerScene = "Composer" - static func instantiateComposer() -> UIViewController { - return XCTStoryboardsScene.Message.ComposerScene.viewController() - } + static let Composer = SceneType(Message.self, identifier: "Composer") - case MessagesListScene = "MessagesList" - static func instantiateMessagesList() -> UITableViewController { - guard let controller = XCTStoryboardsScene.Message.MessagesListScene.viewController() as? UITableViewController else { - fatalError("ViewController 'MessagesList' is not of the expected class UITableViewController.") - } - return controller - } + static let MessagesList = SceneType(Message.self, identifier: "MessagesList") - case NavCtrlScene = "NavCtrl" - static func instantiateNavCtrl() -> UINavigationController { - guard let controller = XCTStoryboardsScene.Message.NavCtrlScene.viewController() as? UINavigationController else { - fatalError("ViewController 'NavCtrl' is not of the expected class UINavigationController.") - } - return controller - } + static let NavCtrl = SceneType(Message.self, identifier: "NavCtrl") - case URLChooserScene = "URLChooser" - static func instantiateURLChooser() -> XXPickerViewController { - guard let controller = XCTStoryboardsScene.Message.URLChooserScene.viewController() as? XXPickerViewController else { - fatalError("ViewController 'URLChooser' is not of the expected class XXPickerViewController.") - } - return controller - } + static let URLChooser = SceneType(Message.self, identifier: "URLChooser") } - enum Placeholder: String, StoryboardSceneType { + enum Placeholder: StoryboardType { static let storyboardName = "Placeholder" - case NavigationScene = "Navigation" - static func instantiateNavigation() -> UINavigationController { - guard let controller = XCTStoryboardsScene.Placeholder.NavigationScene.viewController() as? UINavigationController else { - fatalError("ViewController 'Navigation' is not of the expected class UINavigationController.") - } - return controller - } + static let Navigation = SceneType(Placeholder.self, identifier: "Navigation") } - enum Wizard: String, StoryboardSceneType { + enum Wizard: StoryboardType { static let storyboardName = "Wizard" - static func initialViewController() -> CreateAccViewController { - guard let controller = storyboard().instantiateInitialViewController() as? CreateAccViewController else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") - } - return controller - } + static let initialScene = InitialSceneType(Wizard.self) - case Accept_CGUScene = "Accept-CGU" - static func instantiateAcceptCGU() -> UIViewController { - return XCTStoryboardsScene.Wizard.Accept_CGUScene.viewController() - } + static let Accept_CGU = SceneType(Wizard.self, identifier: "Accept-CGU") - case CreateAccountScene = "CreateAccount" - static func instantiateCreateAccount() -> CreateAccViewController { - guard let controller = XCTStoryboardsScene.Wizard.CreateAccountScene.viewController() as? CreateAccViewController else { - fatalError("ViewController 'CreateAccount' is not of the expected class CreateAccViewController.") - } - return controller - } + static let CreateAccount = SceneType(Wizard.self, identifier: "CreateAccount") - case PreferencesScene = "Preferences" - static func instantiatePreferences() -> UITableViewController { - guard let controller = XCTStoryboardsScene.Wizard.PreferencesScene.viewController() as? UITableViewController else { - fatalError("ViewController 'Preferences' is not of the expected class UITableViewController.") - } - return controller - } + static let Preferences = SceneType(Wizard.self, identifier: "Preferences") - case Validate_PasswordScene = "Validate_Password" - static func instantiateValidatePassword() -> UIViewController { - return XCTStoryboardsScene.Wizard.Validate_PasswordScene.viewController() - } + static let Validate_Password = SceneType(Wizard.self, identifier: "Validate_Password") } } enum XCTStoryboardsSegue { - enum AdditionalImport: String, StoryboardSegueType { + enum AdditionalImport: String, SegueType { case Private = "private" } - enum Message: String, StoryboardSegueType { + enum Message: String, SegueType { case CustomBack case Embed case NonCustom case Show_NavCtrl = "Show-NavCtrl" } - enum Wizard: String, StoryboardSegueType { + enum Wizard: String, SegueType { case ShowPassword } } diff --git a/Tests/Expected/Storyboards-iOS/swift2-context-all-ignore-module.swift b/Tests/Expected/Storyboards-iOS/swift2-context-all-ignore-module.swift index 6901952..408a5bb 100644 --- a/Tests/Expected/Storyboards-iOS/swift2-context-all-ignore-module.swift +++ b/Tests/Expected/Storyboards-iOS/swift2-context-all-ignore-module.swift @@ -8,170 +8,110 @@ import SlackTextViewController // swiftlint:disable file_length -protocol StoryboardSceneType { +protocol StoryboardType { static var storyboardName: String { get } } -extension StoryboardSceneType { - static func storyboard() -> UIStoryboard { +extension StoryboardType { + static var storyboard: UIStoryboard { return UIStoryboard(name: self.storyboardName, bundle: NSBundle(forClass: BundleToken.self)) } } -extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == String { - func viewController() -> UIViewController { - return Self.storyboard().instantiateViewControllerWithIdentifier(self.rawValue) +struct SceneType { + let storyboard: StoryboardType.Type + let identifier: String + + var controller: T { + guard let controller = storyboard.storyboard.instantiateViewControllerWithIdentifier(identifier) as? T else { + fatalError("Controller '\(identifier)' is not of the expected class \(T.self).") + } + return controller } - static func viewController(identifier: Self) -> UIViewController { - return identifier.viewController() +} + +struct InitialSceneType { + let storyboard: StoryboardType.Type + + var controller: T { + guard let controller = storyboard.storyboard.instantiateInitialViewController() as? T else { + fatalError("Controller is not of the expected class \(T.self).") + } + return controller } } -protocol StoryboardSegueType: RawRepresentable { } +protocol SegueType: RawRepresentable { } extension UIViewController { - func performSegue(segue: S, sender: AnyObject? = nil) { + func performSegue(segue: S, sender: AnyObject? = nil) { performSegueWithIdentifier(segue.rawValue, sender: sender) } } // swiftlint:disable explicit_type_interface identifier_name line_length type_body_length type_name enum StoryboardScene { - enum AdditionalImport: String, StoryboardSceneType { + enum AdditionalImport: StoryboardType { static let storyboardName = "AdditionalImport" - static func initialViewController() -> LocationPicker.LocationPickerViewController { - guard let controller = storyboard().instantiateInitialViewController() as? LocationPicker.LocationPickerViewController else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") - } - return controller - } + static let initialScene = InitialSceneType(AdditionalImport.self) - case PublicScene = "public" - static func instantiatePublic() -> SlackTextViewController.SLKTextViewController { - guard let controller = StoryboardScene.AdditionalImport.PublicScene.viewController() as? SlackTextViewController.SLKTextViewController else { - fatalError("ViewController 'public' is not of the expected class SlackTextViewController.SLKTextViewController.") - } - return controller - } + static let Public = SceneType(AdditionalImport.self, identifier: "public") } - enum Anonymous: StoryboardSceneType { + enum Anonymous: StoryboardType { static let storyboardName = "Anonymous" - static func initialViewController() -> UINavigationController { - guard let controller = storyboard().instantiateInitialViewController() as? UINavigationController else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") - } - return controller - } + static let initialScene = InitialSceneType(Anonymous.self) } - enum Dependency: String, StoryboardSceneType { + enum Dependency: StoryboardType { static let storyboardName = "Dependency" - case DependentScene = "Dependent" - static func instantiateDependent() -> UIViewController { - return StoryboardScene.Dependency.DependentScene.viewController() - } + static let Dependent = SceneType(Dependency.self, identifier: "Dependent") } - enum Message: String, StoryboardSceneType { + enum Message: StoryboardType { static let storyboardName = "Message" - static func initialViewController() -> UIViewController { - guard let controller = storyboard().instantiateInitialViewController() else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") - } - return controller - } + static let initialScene = InitialSceneType(Message.self) - case ComposerScene = "Composer" - static func instantiateComposer() -> UIViewController { - return StoryboardScene.Message.ComposerScene.viewController() - } + static let Composer = SceneType(Message.self, identifier: "Composer") - case MessagesListScene = "MessagesList" - static func instantiateMessagesList() -> UITableViewController { - guard let controller = StoryboardScene.Message.MessagesListScene.viewController() as? UITableViewController else { - fatalError("ViewController 'MessagesList' is not of the expected class UITableViewController.") - } - return controller - } + static let MessagesList = SceneType(Message.self, identifier: "MessagesList") - case NavCtrlScene = "NavCtrl" - static func instantiateNavCtrl() -> UINavigationController { - guard let controller = StoryboardScene.Message.NavCtrlScene.viewController() as? UINavigationController else { - fatalError("ViewController 'NavCtrl' is not of the expected class UINavigationController.") - } - return controller - } + static let NavCtrl = SceneType(Message.self, identifier: "NavCtrl") - case URLChooserScene = "URLChooser" - static func instantiateURLChooser() -> XXPickerViewController { - guard let controller = StoryboardScene.Message.URLChooserScene.viewController() as? XXPickerViewController else { - fatalError("ViewController 'URLChooser' is not of the expected class XXPickerViewController.") - } - return controller - } + static let URLChooser = SceneType(Message.self, identifier: "URLChooser") } - enum Placeholder: String, StoryboardSceneType { + enum Placeholder: StoryboardType { static let storyboardName = "Placeholder" - case NavigationScene = "Navigation" - static func instantiateNavigation() -> UINavigationController { - guard let controller = StoryboardScene.Placeholder.NavigationScene.viewController() as? UINavigationController else { - fatalError("ViewController 'Navigation' is not of the expected class UINavigationController.") - } - return controller - } + static let Navigation = SceneType(Placeholder.self, identifier: "Navigation") } - enum Wizard: String, StoryboardSceneType { + enum Wizard: StoryboardType { static let storyboardName = "Wizard" - static func initialViewController() -> CreateAccViewController { - guard let controller = storyboard().instantiateInitialViewController() as? CreateAccViewController else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") - } - return controller - } + static let initialScene = InitialSceneType(Wizard.self) - case Accept_CGUScene = "Accept-CGU" - static func instantiateAcceptCGU() -> UIViewController { - return StoryboardScene.Wizard.Accept_CGUScene.viewController() - } + static let Accept_CGU = SceneType(Wizard.self, identifier: "Accept-CGU") - case CreateAccountScene = "CreateAccount" - static func instantiateCreateAccount() -> CreateAccViewController { - guard let controller = StoryboardScene.Wizard.CreateAccountScene.viewController() as? CreateAccViewController else { - fatalError("ViewController 'CreateAccount' is not of the expected class CreateAccViewController.") - } - return controller - } + static let CreateAccount = SceneType(Wizard.self, identifier: "CreateAccount") - case PreferencesScene = "Preferences" - static func instantiatePreferences() -> UITableViewController { - guard let controller = StoryboardScene.Wizard.PreferencesScene.viewController() as? UITableViewController else { - fatalError("ViewController 'Preferences' is not of the expected class UITableViewController.") - } - return controller - } + static let Preferences = SceneType(Wizard.self, identifier: "Preferences") - case Validate_PasswordScene = "Validate_Password" - static func instantiateValidatePassword() -> UIViewController { - return StoryboardScene.Wizard.Validate_PasswordScene.viewController() - } + static let Validate_Password = SceneType(Wizard.self, identifier: "Validate_Password") } } enum StoryboardSegue { - enum AdditionalImport: String, StoryboardSegueType { + enum AdditionalImport: String, SegueType { case Private = "private" } - enum Message: String, StoryboardSegueType { + enum Message: String, SegueType { case CustomBack case Embed case NonCustom case Show_NavCtrl = "Show-NavCtrl" } - enum Wizard: String, StoryboardSegueType { + enum Wizard: String, SegueType { case ShowPassword } } diff --git a/Tests/Expected/Storyboards-iOS/swift2-context-all.swift b/Tests/Expected/Storyboards-iOS/swift2-context-all.swift index e3c9f1a..b8f27a1 100644 --- a/Tests/Expected/Storyboards-iOS/swift2-context-all.swift +++ b/Tests/Expected/Storyboards-iOS/swift2-context-all.swift @@ -9,170 +9,110 @@ import SlackTextViewController // swiftlint:disable file_length -protocol StoryboardSceneType { +protocol StoryboardType { static var storyboardName: String { get } } -extension StoryboardSceneType { - static func storyboard() -> UIStoryboard { +extension StoryboardType { + static var storyboard: UIStoryboard { return UIStoryboard(name: self.storyboardName, bundle: NSBundle(forClass: BundleToken.self)) } } -extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == String { - func viewController() -> UIViewController { - return Self.storyboard().instantiateViewControllerWithIdentifier(self.rawValue) +struct SceneType { + let storyboard: StoryboardType.Type + let identifier: String + + var controller: T { + guard let controller = storyboard.storyboard.instantiateViewControllerWithIdentifier(identifier) as? T else { + fatalError("Controller '\(identifier)' is not of the expected class \(T.self).") + } + return controller } - static func viewController(identifier: Self) -> UIViewController { - return identifier.viewController() +} + +struct InitialSceneType { + let storyboard: StoryboardType.Type + + var controller: T { + guard let controller = storyboard.storyboard.instantiateInitialViewController() as? T else { + fatalError("Controller is not of the expected class \(T.self).") + } + return controller } } -protocol StoryboardSegueType: RawRepresentable { } +protocol SegueType: RawRepresentable { } extension UIViewController { - func performSegue(segue: S, sender: AnyObject? = nil) { + func performSegue(segue: S, sender: AnyObject? = nil) { performSegueWithIdentifier(segue.rawValue, sender: sender) } } // swiftlint:disable explicit_type_interface identifier_name line_length type_body_length type_name enum StoryboardScene { - enum AdditionalImport: String, StoryboardSceneType { + enum AdditionalImport: StoryboardType { static let storyboardName = "AdditionalImport" - static func initialViewController() -> LocationPicker.LocationPickerViewController { - guard let controller = storyboard().instantiateInitialViewController() as? LocationPicker.LocationPickerViewController else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") - } - return controller - } + static let initialScene = InitialSceneType(AdditionalImport.self) - case PublicScene = "public" - static func instantiatePublic() -> SlackTextViewController.SLKTextViewController { - guard let controller = StoryboardScene.AdditionalImport.PublicScene.viewController() as? SlackTextViewController.SLKTextViewController else { - fatalError("ViewController 'public' is not of the expected class SlackTextViewController.SLKTextViewController.") - } - return controller - } + static let Public = SceneType(AdditionalImport.self, identifier: "public") } - enum Anonymous: StoryboardSceneType { + enum Anonymous: StoryboardType { static let storyboardName = "Anonymous" - static func initialViewController() -> UINavigationController { - guard let controller = storyboard().instantiateInitialViewController() as? UINavigationController else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") - } - return controller - } + static let initialScene = InitialSceneType(Anonymous.self) } - enum Dependency: String, StoryboardSceneType { + enum Dependency: StoryboardType { static let storyboardName = "Dependency" - case DependentScene = "Dependent" - static func instantiateDependent() -> UIViewController { - return StoryboardScene.Dependency.DependentScene.viewController() - } + static let Dependent = SceneType(Dependency.self, identifier: "Dependent") } - enum Message: String, StoryboardSceneType { + enum Message: StoryboardType { static let storyboardName = "Message" - static func initialViewController() -> UIViewController { - guard let controller = storyboard().instantiateInitialViewController() else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") - } - return controller - } + static let initialScene = InitialSceneType(Message.self) - case ComposerScene = "Composer" - static func instantiateComposer() -> UIViewController { - return StoryboardScene.Message.ComposerScene.viewController() - } + static let Composer = SceneType(Message.self, identifier: "Composer") - case MessagesListScene = "MessagesList" - static func instantiateMessagesList() -> UITableViewController { - guard let controller = StoryboardScene.Message.MessagesListScene.viewController() as? UITableViewController else { - fatalError("ViewController 'MessagesList' is not of the expected class UITableViewController.") - } - return controller - } + static let MessagesList = SceneType(Message.self, identifier: "MessagesList") - case NavCtrlScene = "NavCtrl" - static func instantiateNavCtrl() -> UINavigationController { - guard let controller = StoryboardScene.Message.NavCtrlScene.viewController() as? UINavigationController else { - fatalError("ViewController 'NavCtrl' is not of the expected class UINavigationController.") - } - return controller - } + static let NavCtrl = SceneType(Message.self, identifier: "NavCtrl") - case URLChooserScene = "URLChooser" - static func instantiateURLChooser() -> XXPickerViewController { - guard let controller = StoryboardScene.Message.URLChooserScene.viewController() as? XXPickerViewController else { - fatalError("ViewController 'URLChooser' is not of the expected class XXPickerViewController.") - } - return controller - } + static let URLChooser = SceneType(Message.self, identifier: "URLChooser") } - enum Placeholder: String, StoryboardSceneType { + enum Placeholder: StoryboardType { static let storyboardName = "Placeholder" - case NavigationScene = "Navigation" - static func instantiateNavigation() -> UINavigationController { - guard let controller = StoryboardScene.Placeholder.NavigationScene.viewController() as? UINavigationController else { - fatalError("ViewController 'Navigation' is not of the expected class UINavigationController.") - } - return controller - } + static let Navigation = SceneType(Placeholder.self, identifier: "Navigation") } - enum Wizard: String, StoryboardSceneType { + enum Wizard: StoryboardType { static let storyboardName = "Wizard" - static func initialViewController() -> CreateAccViewController { - guard let controller = storyboard().instantiateInitialViewController() as? CreateAccViewController else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") - } - return controller - } + static let initialScene = InitialSceneType(Wizard.self) - case Accept_CGUScene = "Accept-CGU" - static func instantiateAcceptCGU() -> UIViewController { - return StoryboardScene.Wizard.Accept_CGUScene.viewController() - } + static let Accept_CGU = SceneType(Wizard.self, identifier: "Accept-CGU") - case CreateAccountScene = "CreateAccount" - static func instantiateCreateAccount() -> CreateAccViewController { - guard let controller = StoryboardScene.Wizard.CreateAccountScene.viewController() as? CreateAccViewController else { - fatalError("ViewController 'CreateAccount' is not of the expected class CreateAccViewController.") - } - return controller - } + static let CreateAccount = SceneType(Wizard.self, identifier: "CreateAccount") - case PreferencesScene = "Preferences" - static func instantiatePreferences() -> UITableViewController { - guard let controller = StoryboardScene.Wizard.PreferencesScene.viewController() as? UITableViewController else { - fatalError("ViewController 'Preferences' is not of the expected class UITableViewController.") - } - return controller - } + static let Preferences = SceneType(Wizard.self, identifier: "Preferences") - case Validate_PasswordScene = "Validate_Password" - static func instantiateValidatePassword() -> UIViewController { - return StoryboardScene.Wizard.Validate_PasswordScene.viewController() - } + static let Validate_Password = SceneType(Wizard.self, identifier: "Validate_Password") } } enum StoryboardSegue { - enum AdditionalImport: String, StoryboardSegueType { + enum AdditionalImport: String, SegueType { case Private = "private" } - enum Message: String, StoryboardSegueType { + enum Message: String, SegueType { case CustomBack case Embed case NonCustom case Show_NavCtrl = "Show-NavCtrl" } - enum Wizard: String, StoryboardSegueType { + enum Wizard: String, SegueType { case ShowPassword } } diff --git a/Tests/Expected/Storyboards-iOS/swift3-context-all-customname.swift b/Tests/Expected/Storyboards-iOS/swift3-context-all-customname.swift index 14374f9..b403ecf 100644 --- a/Tests/Expected/Storyboards-iOS/swift3-context-all-customname.swift +++ b/Tests/Expected/Storyboards-iOS/swift3-context-all-customname.swift @@ -9,170 +9,110 @@ import SlackTextViewController // swiftlint:disable file_length -protocol StoryboardSceneType { +protocol StoryboardType { static var storyboardName: String { get } } -extension StoryboardSceneType { - static func storyboard() -> UIStoryboard { +extension StoryboardType { + static var storyboard: UIStoryboard { return UIStoryboard(name: self.storyboardName, bundle: Bundle(for: BundleToken.self)) } } -extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == String { - func viewController() -> UIViewController { - return Self.storyboard().instantiateViewController(withIdentifier: self.rawValue) +struct SceneType { + let storyboard: StoryboardType.Type + let identifier: String + + var controller: T { + guard let controller = storyboard.storyboard.instantiateViewController(withIdentifier: identifier) as? T else { + fatalError("Controller '\(identifier)' is not of the expected class \(T.self).") + } + return controller } - static func viewController(identifier: Self) -> UIViewController { - return identifier.viewController() +} + +struct InitialSceneType { + let storyboard: StoryboardType.Type + + var controller: T { + guard let controller = storyboard.storyboard.instantiateInitialViewController() as? T else { + fatalError("Controller is not of the expected class \(T.self).") + } + return controller } } -protocol StoryboardSegueType: RawRepresentable { } +protocol SegueType: RawRepresentable { } extension UIViewController { - func perform(segue: S, sender: Any? = nil) where S.RawValue == String { + func perform(segue: S, sender: Any? = nil) where S.RawValue == String { performSegue(withIdentifier: segue.rawValue, sender: sender) } } // swiftlint:disable explicit_type_interface identifier_name line_length type_body_length type_name enum XCTStoryboardsScene { - enum AdditionalImport: String, StoryboardSceneType { + enum AdditionalImport: StoryboardType { static let storyboardName = "AdditionalImport" - static func initialViewController() -> LocationPicker.LocationPickerViewController { - guard let controller = storyboard().instantiateInitialViewController() as? LocationPicker.LocationPickerViewController else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") - } - return controller - } + static let initialScene = InitialSceneType(storyboard: AdditionalImport.self) - case publicScene = "public" - static func instantiatePublic() -> SlackTextViewController.SLKTextViewController { - guard let controller = XCTStoryboardsScene.AdditionalImport.publicScene.viewController() as? SlackTextViewController.SLKTextViewController else { - fatalError("ViewController 'public' is not of the expected class SlackTextViewController.SLKTextViewController.") - } - return controller - } + static let `public` = SceneType(storyboard: AdditionalImport.self, identifier: "public") } - enum Anonymous: StoryboardSceneType { + enum Anonymous: StoryboardType { static let storyboardName = "Anonymous" - static func initialViewController() -> UINavigationController { - guard let controller = storyboard().instantiateInitialViewController() as? UINavigationController else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") - } - return controller - } + static let initialScene = InitialSceneType(storyboard: Anonymous.self) } - enum Dependency: String, StoryboardSceneType { + enum Dependency: StoryboardType { static let storyboardName = "Dependency" - case dependentScene = "Dependent" - static func instantiateDependent() -> UIViewController { - return XCTStoryboardsScene.Dependency.dependentScene.viewController() - } + static let dependent = SceneType(storyboard: Dependency.self, identifier: "Dependent") } - enum Message: String, StoryboardSceneType { + enum Message: StoryboardType { static let storyboardName = "Message" - static func initialViewController() -> UIViewController { - guard let controller = storyboard().instantiateInitialViewController() else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") - } - return controller - } + static let initialScene = InitialSceneType(storyboard: Message.self) - case composerScene = "Composer" - static func instantiateComposer() -> UIViewController { - return XCTStoryboardsScene.Message.composerScene.viewController() - } + static let composer = SceneType(storyboard: Message.self, identifier: "Composer") - case messagesListScene = "MessagesList" - static func instantiateMessagesList() -> UITableViewController { - guard let controller = XCTStoryboardsScene.Message.messagesListScene.viewController() as? UITableViewController else { - fatalError("ViewController 'MessagesList' is not of the expected class UITableViewController.") - } - return controller - } + static let messagesList = SceneType(storyboard: Message.self, identifier: "MessagesList") - case navCtrlScene = "NavCtrl" - static func instantiateNavCtrl() -> UINavigationController { - guard let controller = XCTStoryboardsScene.Message.navCtrlScene.viewController() as? UINavigationController else { - fatalError("ViewController 'NavCtrl' is not of the expected class UINavigationController.") - } - return controller - } + static let navCtrl = SceneType(storyboard: Message.self, identifier: "NavCtrl") - case urlChooserScene = "URLChooser" - static func instantiateUrlChooser() -> XXPickerViewController { - guard let controller = XCTStoryboardsScene.Message.urlChooserScene.viewController() as? XXPickerViewController else { - fatalError("ViewController 'URLChooser' is not of the expected class XXPickerViewController.") - } - return controller - } + static let urlChooser = SceneType(storyboard: Message.self, identifier: "URLChooser") } - enum Placeholder: String, StoryboardSceneType { + enum Placeholder: StoryboardType { static let storyboardName = "Placeholder" - case navigationScene = "Navigation" - static func instantiateNavigation() -> UINavigationController { - guard let controller = XCTStoryboardsScene.Placeholder.navigationScene.viewController() as? UINavigationController else { - fatalError("ViewController 'Navigation' is not of the expected class UINavigationController.") - } - return controller - } + static let navigation = SceneType(storyboard: Placeholder.self, identifier: "Navigation") } - enum Wizard: String, StoryboardSceneType { + enum Wizard: StoryboardType { static let storyboardName = "Wizard" - static func initialViewController() -> CreateAccViewController { - guard let controller = storyboard().instantiateInitialViewController() as? CreateAccViewController else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") - } - return controller - } + static let initialScene = InitialSceneType(storyboard: Wizard.self) - case acceptCGUScene = "Accept-CGU" - static func instantiateAcceptCGU() -> UIViewController { - return XCTStoryboardsScene.Wizard.acceptCGUScene.viewController() - } + static let acceptCGU = SceneType(storyboard: Wizard.self, identifier: "Accept-CGU") - case createAccountScene = "CreateAccount" - static func instantiateCreateAccount() -> CreateAccViewController { - guard let controller = XCTStoryboardsScene.Wizard.createAccountScene.viewController() as? CreateAccViewController else { - fatalError("ViewController 'CreateAccount' is not of the expected class CreateAccViewController.") - } - return controller - } + static let createAccount = SceneType(storyboard: Wizard.self, identifier: "CreateAccount") - case preferencesScene = "Preferences" - static func instantiatePreferences() -> UITableViewController { - guard let controller = XCTStoryboardsScene.Wizard.preferencesScene.viewController() as? UITableViewController else { - fatalError("ViewController 'Preferences' is not of the expected class UITableViewController.") - } - return controller - } + static let preferences = SceneType(storyboard: Wizard.self, identifier: "Preferences") - case validatePasswordScene = "Validate_Password" - static func instantiateValidatePassword() -> UIViewController { - return XCTStoryboardsScene.Wizard.validatePasswordScene.viewController() - } + static let validatePassword = SceneType(storyboard: Wizard.self, identifier: "Validate_Password") } } enum XCTStoryboardsSegue { - enum AdditionalImport: String, StoryboardSegueType { + enum AdditionalImport: String, SegueType { case `private` } - enum Message: String, StoryboardSegueType { + enum Message: String, SegueType { case customBack = "CustomBack" case embed = "Embed" case nonCustom = "NonCustom" case showNavCtrl = "Show-NavCtrl" } - enum Wizard: String, StoryboardSegueType { + enum Wizard: String, SegueType { case showPassword = "ShowPassword" } } diff --git a/Tests/Expected/Storyboards-iOS/swift3-context-all-ignore-module.swift b/Tests/Expected/Storyboards-iOS/swift3-context-all-ignore-module.swift index e5a8ee0..132a3ab 100644 --- a/Tests/Expected/Storyboards-iOS/swift3-context-all-ignore-module.swift +++ b/Tests/Expected/Storyboards-iOS/swift3-context-all-ignore-module.swift @@ -8,170 +8,110 @@ import SlackTextViewController // swiftlint:disable file_length -protocol StoryboardSceneType { +protocol StoryboardType { static var storyboardName: String { get } } -extension StoryboardSceneType { - static func storyboard() -> UIStoryboard { +extension StoryboardType { + static var storyboard: UIStoryboard { return UIStoryboard(name: self.storyboardName, bundle: Bundle(for: BundleToken.self)) } } -extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == String { - func viewController() -> UIViewController { - return Self.storyboard().instantiateViewController(withIdentifier: self.rawValue) +struct SceneType { + let storyboard: StoryboardType.Type + let identifier: String + + var controller: T { + guard let controller = storyboard.storyboard.instantiateViewController(withIdentifier: identifier) as? T else { + fatalError("Controller '\(identifier)' is not of the expected class \(T.self).") + } + return controller } - static func viewController(identifier: Self) -> UIViewController { - return identifier.viewController() +} + +struct InitialSceneType { + let storyboard: StoryboardType.Type + + var controller: T { + guard let controller = storyboard.storyboard.instantiateInitialViewController() as? T else { + fatalError("Controller is not of the expected class \(T.self).") + } + return controller } } -protocol StoryboardSegueType: RawRepresentable { } +protocol SegueType: RawRepresentable { } extension UIViewController { - func perform(segue: S, sender: Any? = nil) where S.RawValue == String { + func perform(segue: S, sender: Any? = nil) where S.RawValue == String { performSegue(withIdentifier: segue.rawValue, sender: sender) } } // swiftlint:disable explicit_type_interface identifier_name line_length type_body_length type_name enum StoryboardScene { - enum AdditionalImport: String, StoryboardSceneType { + enum AdditionalImport: StoryboardType { static let storyboardName = "AdditionalImport" - static func initialViewController() -> LocationPicker.LocationPickerViewController { - guard let controller = storyboard().instantiateInitialViewController() as? LocationPicker.LocationPickerViewController else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") - } - return controller - } + static let initialScene = InitialSceneType(storyboard: AdditionalImport.self) - case publicScene = "public" - static func instantiatePublic() -> SlackTextViewController.SLKTextViewController { - guard let controller = StoryboardScene.AdditionalImport.publicScene.viewController() as? SlackTextViewController.SLKTextViewController else { - fatalError("ViewController 'public' is not of the expected class SlackTextViewController.SLKTextViewController.") - } - return controller - } + static let `public` = SceneType(storyboard: AdditionalImport.self, identifier: "public") } - enum Anonymous: StoryboardSceneType { + enum Anonymous: StoryboardType { static let storyboardName = "Anonymous" - static func initialViewController() -> UINavigationController { - guard let controller = storyboard().instantiateInitialViewController() as? UINavigationController else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") - } - return controller - } + static let initialScene = InitialSceneType(storyboard: Anonymous.self) } - enum Dependency: String, StoryboardSceneType { + enum Dependency: StoryboardType { static let storyboardName = "Dependency" - case dependentScene = "Dependent" - static func instantiateDependent() -> UIViewController { - return StoryboardScene.Dependency.dependentScene.viewController() - } + static let dependent = SceneType(storyboard: Dependency.self, identifier: "Dependent") } - enum Message: String, StoryboardSceneType { + enum Message: StoryboardType { static let storyboardName = "Message" - static func initialViewController() -> UIViewController { - guard let controller = storyboard().instantiateInitialViewController() else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") - } - return controller - } + static let initialScene = InitialSceneType(storyboard: Message.self) - case composerScene = "Composer" - static func instantiateComposer() -> UIViewController { - return StoryboardScene.Message.composerScene.viewController() - } + static let composer = SceneType(storyboard: Message.self, identifier: "Composer") - case messagesListScene = "MessagesList" - static func instantiateMessagesList() -> UITableViewController { - guard let controller = StoryboardScene.Message.messagesListScene.viewController() as? UITableViewController else { - fatalError("ViewController 'MessagesList' is not of the expected class UITableViewController.") - } - return controller - } + static let messagesList = SceneType(storyboard: Message.self, identifier: "MessagesList") - case navCtrlScene = "NavCtrl" - static func instantiateNavCtrl() -> UINavigationController { - guard let controller = StoryboardScene.Message.navCtrlScene.viewController() as? UINavigationController else { - fatalError("ViewController 'NavCtrl' is not of the expected class UINavigationController.") - } - return controller - } + static let navCtrl = SceneType(storyboard: Message.self, identifier: "NavCtrl") - case urlChooserScene = "URLChooser" - static func instantiateUrlChooser() -> XXPickerViewController { - guard let controller = StoryboardScene.Message.urlChooserScene.viewController() as? XXPickerViewController else { - fatalError("ViewController 'URLChooser' is not of the expected class XXPickerViewController.") - } - return controller - } + static let urlChooser = SceneType(storyboard: Message.self, identifier: "URLChooser") } - enum Placeholder: String, StoryboardSceneType { + enum Placeholder: StoryboardType { static let storyboardName = "Placeholder" - case navigationScene = "Navigation" - static func instantiateNavigation() -> UINavigationController { - guard let controller = StoryboardScene.Placeholder.navigationScene.viewController() as? UINavigationController else { - fatalError("ViewController 'Navigation' is not of the expected class UINavigationController.") - } - return controller - } + static let navigation = SceneType(storyboard: Placeholder.self, identifier: "Navigation") } - enum Wizard: String, StoryboardSceneType { + enum Wizard: StoryboardType { static let storyboardName = "Wizard" - static func initialViewController() -> CreateAccViewController { - guard let controller = storyboard().instantiateInitialViewController() as? CreateAccViewController else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") - } - return controller - } + static let initialScene = InitialSceneType(storyboard: Wizard.self) - case acceptCGUScene = "Accept-CGU" - static func instantiateAcceptCGU() -> UIViewController { - return StoryboardScene.Wizard.acceptCGUScene.viewController() - } + static let acceptCGU = SceneType(storyboard: Wizard.self, identifier: "Accept-CGU") - case createAccountScene = "CreateAccount" - static func instantiateCreateAccount() -> CreateAccViewController { - guard let controller = StoryboardScene.Wizard.createAccountScene.viewController() as? CreateAccViewController else { - fatalError("ViewController 'CreateAccount' is not of the expected class CreateAccViewController.") - } - return controller - } + static let createAccount = SceneType(storyboard: Wizard.self, identifier: "CreateAccount") - case preferencesScene = "Preferences" - static func instantiatePreferences() -> UITableViewController { - guard let controller = StoryboardScene.Wizard.preferencesScene.viewController() as? UITableViewController else { - fatalError("ViewController 'Preferences' is not of the expected class UITableViewController.") - } - return controller - } + static let preferences = SceneType(storyboard: Wizard.self, identifier: "Preferences") - case validatePasswordScene = "Validate_Password" - static func instantiateValidatePassword() -> UIViewController { - return StoryboardScene.Wizard.validatePasswordScene.viewController() - } + static let validatePassword = SceneType(storyboard: Wizard.self, identifier: "Validate_Password") } } enum StoryboardSegue { - enum AdditionalImport: String, StoryboardSegueType { + enum AdditionalImport: String, SegueType { case `private` } - enum Message: String, StoryboardSegueType { + enum Message: String, SegueType { case customBack = "CustomBack" case embed = "Embed" case nonCustom = "NonCustom" case showNavCtrl = "Show-NavCtrl" } - enum Wizard: String, StoryboardSegueType { + enum Wizard: String, SegueType { case showPassword = "ShowPassword" } } diff --git a/Tests/Expected/Storyboards-iOS/swift3-context-all.swift b/Tests/Expected/Storyboards-iOS/swift3-context-all.swift index f39dcf5..c5d74b1 100644 --- a/Tests/Expected/Storyboards-iOS/swift3-context-all.swift +++ b/Tests/Expected/Storyboards-iOS/swift3-context-all.swift @@ -9,170 +9,110 @@ import SlackTextViewController // swiftlint:disable file_length -protocol StoryboardSceneType { +protocol StoryboardType { static var storyboardName: String { get } } -extension StoryboardSceneType { - static func storyboard() -> UIStoryboard { +extension StoryboardType { + static var storyboard: UIStoryboard { return UIStoryboard(name: self.storyboardName, bundle: Bundle(for: BundleToken.self)) } } -extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == String { - func viewController() -> UIViewController { - return Self.storyboard().instantiateViewController(withIdentifier: self.rawValue) +struct SceneType { + let storyboard: StoryboardType.Type + let identifier: String + + var controller: T { + guard let controller = storyboard.storyboard.instantiateViewController(withIdentifier: identifier) as? T else { + fatalError("Controller '\(identifier)' is not of the expected class \(T.self).") + } + return controller } - static func viewController(identifier: Self) -> UIViewController { - return identifier.viewController() +} + +struct InitialSceneType { + let storyboard: StoryboardType.Type + + var controller: T { + guard let controller = storyboard.storyboard.instantiateInitialViewController() as? T else { + fatalError("Controller is not of the expected class \(T.self).") + } + return controller } } -protocol StoryboardSegueType: RawRepresentable { } +protocol SegueType: RawRepresentable { } extension UIViewController { - func perform(segue: S, sender: Any? = nil) where S.RawValue == String { + func perform(segue: S, sender: Any? = nil) where S.RawValue == String { performSegue(withIdentifier: segue.rawValue, sender: sender) } } // swiftlint:disable explicit_type_interface identifier_name line_length type_body_length type_name enum StoryboardScene { - enum AdditionalImport: String, StoryboardSceneType { + enum AdditionalImport: StoryboardType { static let storyboardName = "AdditionalImport" - static func initialViewController() -> LocationPicker.LocationPickerViewController { - guard let controller = storyboard().instantiateInitialViewController() as? LocationPicker.LocationPickerViewController else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") - } - return controller - } + static let initialScene = InitialSceneType(storyboard: AdditionalImport.self) - case publicScene = "public" - static func instantiatePublic() -> SlackTextViewController.SLKTextViewController { - guard let controller = StoryboardScene.AdditionalImport.publicScene.viewController() as? SlackTextViewController.SLKTextViewController else { - fatalError("ViewController 'public' is not of the expected class SlackTextViewController.SLKTextViewController.") - } - return controller - } + static let `public` = SceneType(storyboard: AdditionalImport.self, identifier: "public") } - enum Anonymous: StoryboardSceneType { + enum Anonymous: StoryboardType { static let storyboardName = "Anonymous" - static func initialViewController() -> UINavigationController { - guard let controller = storyboard().instantiateInitialViewController() as? UINavigationController else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") - } - return controller - } + static let initialScene = InitialSceneType(storyboard: Anonymous.self) } - enum Dependency: String, StoryboardSceneType { + enum Dependency: StoryboardType { static let storyboardName = "Dependency" - case dependentScene = "Dependent" - static func instantiateDependent() -> UIViewController { - return StoryboardScene.Dependency.dependentScene.viewController() - } + static let dependent = SceneType(storyboard: Dependency.self, identifier: "Dependent") } - enum Message: String, StoryboardSceneType { + enum Message: StoryboardType { static let storyboardName = "Message" - static func initialViewController() -> UIViewController { - guard let controller = storyboard().instantiateInitialViewController() else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") - } - return controller - } + static let initialScene = InitialSceneType(storyboard: Message.self) - case composerScene = "Composer" - static func instantiateComposer() -> UIViewController { - return StoryboardScene.Message.composerScene.viewController() - } + static let composer = SceneType(storyboard: Message.self, identifier: "Composer") - case messagesListScene = "MessagesList" - static func instantiateMessagesList() -> UITableViewController { - guard let controller = StoryboardScene.Message.messagesListScene.viewController() as? UITableViewController else { - fatalError("ViewController 'MessagesList' is not of the expected class UITableViewController.") - } - return controller - } + static let messagesList = SceneType(storyboard: Message.self, identifier: "MessagesList") - case navCtrlScene = "NavCtrl" - static func instantiateNavCtrl() -> UINavigationController { - guard let controller = StoryboardScene.Message.navCtrlScene.viewController() as? UINavigationController else { - fatalError("ViewController 'NavCtrl' is not of the expected class UINavigationController.") - } - return controller - } + static let navCtrl = SceneType(storyboard: Message.self, identifier: "NavCtrl") - case urlChooserScene = "URLChooser" - static func instantiateUrlChooser() -> XXPickerViewController { - guard let controller = StoryboardScene.Message.urlChooserScene.viewController() as? XXPickerViewController else { - fatalError("ViewController 'URLChooser' is not of the expected class XXPickerViewController.") - } - return controller - } + static let urlChooser = SceneType(storyboard: Message.self, identifier: "URLChooser") } - enum Placeholder: String, StoryboardSceneType { + enum Placeholder: StoryboardType { static let storyboardName = "Placeholder" - case navigationScene = "Navigation" - static func instantiateNavigation() -> UINavigationController { - guard let controller = StoryboardScene.Placeholder.navigationScene.viewController() as? UINavigationController else { - fatalError("ViewController 'Navigation' is not of the expected class UINavigationController.") - } - return controller - } + static let navigation = SceneType(storyboard: Placeholder.self, identifier: "Navigation") } - enum Wizard: String, StoryboardSceneType { + enum Wizard: StoryboardType { static let storyboardName = "Wizard" - static func initialViewController() -> CreateAccViewController { - guard let controller = storyboard().instantiateInitialViewController() as? CreateAccViewController else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") - } - return controller - } + static let initialScene = InitialSceneType(storyboard: Wizard.self) - case acceptCGUScene = "Accept-CGU" - static func instantiateAcceptCGU() -> UIViewController { - return StoryboardScene.Wizard.acceptCGUScene.viewController() - } + static let acceptCGU = SceneType(storyboard: Wizard.self, identifier: "Accept-CGU") - case createAccountScene = "CreateAccount" - static func instantiateCreateAccount() -> CreateAccViewController { - guard let controller = StoryboardScene.Wizard.createAccountScene.viewController() as? CreateAccViewController else { - fatalError("ViewController 'CreateAccount' is not of the expected class CreateAccViewController.") - } - return controller - } + static let createAccount = SceneType(storyboard: Wizard.self, identifier: "CreateAccount") - case preferencesScene = "Preferences" - static func instantiatePreferences() -> UITableViewController { - guard let controller = StoryboardScene.Wizard.preferencesScene.viewController() as? UITableViewController else { - fatalError("ViewController 'Preferences' is not of the expected class UITableViewController.") - } - return controller - } + static let preferences = SceneType(storyboard: Wizard.self, identifier: "Preferences") - case validatePasswordScene = "Validate_Password" - static func instantiateValidatePassword() -> UIViewController { - return StoryboardScene.Wizard.validatePasswordScene.viewController() - } + static let validatePassword = SceneType(storyboard: Wizard.self, identifier: "Validate_Password") } } enum StoryboardSegue { - enum AdditionalImport: String, StoryboardSegueType { + enum AdditionalImport: String, SegueType { case `private` } - enum Message: String, StoryboardSegueType { + enum Message: String, SegueType { case customBack = "CustomBack" case embed = "Embed" case nonCustom = "NonCustom" case showNavCtrl = "Show-NavCtrl" } - enum Wizard: String, StoryboardSegueType { + enum Wizard: String, SegueType { case showPassword = "ShowPassword" } } diff --git a/Tests/Expected/Storyboards-macOS/swift2-context-all-customname.swift b/Tests/Expected/Storyboards-macOS/swift2-context-all-customname.swift index f6e28db..1bfd508 100644 --- a/Tests/Expected/Storyboards-macOS/swift2-context-all-customname.swift +++ b/Tests/Expected/Storyboards-macOS/swift2-context-all-customname.swift @@ -8,134 +8,88 @@ import PrefsWindowController // swiftlint:disable file_length -protocol StoryboardSceneType { +protocol StoryboardType { static var storyboardName: String { get } } -extension StoryboardSceneType { - static func storyboard() -> NSStoryboard { +extension StoryboardType { + static var storyboard: NSStoryboard { return NSStoryboard(name: self.storyboardName, bundle: NSBundle(forClass: BundleToken.self)) } } -extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == String { - func controller() -> AnyObject { - return Self.storyboard().instantiateControllerWithIdentifier(self.rawValue) +struct SceneType { + let storyboard: StoryboardType.Type + let identifier: String + + var controller: T { + guard let controller = storyboard.storyboard.instantiateControllerWithIdentifier(identifier) as? T else { + fatalError("Controller '\(identifier)' is not of the expected class \(T.self).") + } + return controller } - static func controller(identifier: Self) -> AnyObject { - return identifier.controller() +} + +struct InitialSceneType { + let storyboard: StoryboardType.Type + + var controller: T { + guard let controller = storyboard.storyboard.instantiateInitialController() as? T else { + fatalError("Controller is not of the expected class \(T.self).") + } + return controller } } -protocol StoryboardSegueType: RawRepresentable { } +protocol SegueType: RawRepresentable { } extension NSSeguePerforming { - func performSegue(segue: S, sender: AnyObject? = nil) { + func performSegue(segue: S, sender: AnyObject? = nil) { performSegueWithIdentifier?(segue.rawValue, sender: sender) } } // swiftlint:disable explicit_type_interface identifier_name line_length type_body_length type_name enum XCTStoryboardsScene { - enum AdditionalImport: String, StoryboardSceneType { + enum AdditionalImport: StoryboardType { static let storyboardName = "AdditionalImport" - case PrivateScene = "private" - static func instantiatePrivate() -> PrefsWindowController.DBPrefsWindowController { - guard let controller = XCTStoryboardsScene.AdditionalImport.PrivateScene.controller() as? PrefsWindowController.DBPrefsWindowController else { - fatalError("Controller 'private' is not of the expected class PrefsWindowController.DBPrefsWindowController.") - } - return controller - } + static let Private = SceneType(AdditionalImport.self, identifier: "private") } - enum Anonymous: StoryboardSceneType { + enum Anonymous: StoryboardType { static let storyboardName = "Anonymous" } - enum Dependency: String, StoryboardSceneType { + enum Dependency: StoryboardType { static let storyboardName = "Dependency" - case DependentScene = "Dependent" - static func instantiateDependent() -> NSViewController { - guard let controller = XCTStoryboardsScene.Dependency.DependentScene.controller() as? NSViewController else { - fatalError("Controller 'Dependent' is not of the expected class NSViewController.") - } - return controller - } + static let Dependent = SceneType(Dependency.self, identifier: "Dependent") } - enum Message: String, StoryboardSceneType { + enum Message: StoryboardType { static let storyboardName = "Message" - case MessageDetailsScene = "MessageDetails" - static func instantiateMessageDetails() -> NSViewController { - guard let controller = XCTStoryboardsScene.Message.MessageDetailsScene.controller() as? NSViewController else { - fatalError("Controller 'MessageDetails' is not of the expected class NSViewController.") - } - return controller - } + static let MessageDetails = SceneType(Message.self, identifier: "MessageDetails") - case MessageListScene = "MessageList" - static func instantiateMessageList() -> NSViewController { - guard let controller = XCTStoryboardsScene.Message.MessageListScene.controller() as? NSViewController else { - fatalError("Controller 'MessageList' is not of the expected class NSViewController.") - } - return controller - } + static let MessageList = SceneType(Message.self, identifier: "MessageList") - case MessageListFooterScene = "MessageListFooter" - static func instantiateMessageListFooter() -> NSViewController { - guard let controller = XCTStoryboardsScene.Message.MessageListFooterScene.controller() as? NSViewController else { - fatalError("Controller 'MessageListFooter' is not of the expected class NSViewController.") - } - return controller - } + static let MessageListFooter = SceneType(Message.self, identifier: "MessageListFooter") - case MessagesTabScene = "MessagesTab" - static func instantiateMessagesTab() -> CustomTabViewController { - guard let controller = XCTStoryboardsScene.Message.MessagesTabScene.controller() as? CustomTabViewController else { - fatalError("Controller 'MessagesTab' is not of the expected class CustomTabViewController.") - } - return controller - } + static let MessagesTab = SceneType(Message.self, identifier: "MessagesTab") - case SplitMessagesScene = "SplitMessages" - static func instantiateSplitMessages() -> NSSplitViewController { - guard let controller = XCTStoryboardsScene.Message.SplitMessagesScene.controller() as? NSSplitViewController else { - fatalError("Controller 'SplitMessages' is not of the expected class NSSplitViewController.") - } - return controller - } + static let SplitMessages = SceneType(Message.self, identifier: "SplitMessages") - case WindowCtrlScene = "WindowCtrl" - static func instantiateWindowCtrl() -> NSWindowController { - guard let controller = XCTStoryboardsScene.Message.WindowCtrlScene.controller() as? NSWindowController else { - fatalError("Controller 'WindowCtrl' is not of the expected class NSWindowController.") - } - return controller - } + static let WindowCtrl = SceneType(Message.self, identifier: "WindowCtrl") } - enum Placeholder: String, StoryboardSceneType { + enum Placeholder: StoryboardType { static let storyboardName = "Placeholder" - case DependentScene = "Dependent" - static func instantiateDependent() -> NSControllerPlaceholder { - guard let controller = XCTStoryboardsScene.Placeholder.DependentScene.controller() as? NSControllerPlaceholder else { - fatalError("Controller 'Dependent' is not of the expected class NSControllerPlaceholder.") - } - return controller - } + static let Dependent = SceneType(Placeholder.self, identifier: "Dependent") - case WindowScene = "Window" - static func instantiateWindow() -> NSWindowController { - guard let controller = XCTStoryboardsScene.Placeholder.WindowScene.controller() as? NSWindowController else { - fatalError("Controller 'Window' is not of the expected class NSWindowController.") - } - return controller - } + static let Window = SceneType(Placeholder.self, identifier: "Window") } } enum XCTStoryboardsSegue { - enum Message: String, StoryboardSegueType { + enum Message: String, SegueType { case Embed case Modal case Popover diff --git a/Tests/Expected/Storyboards-macOS/swift2-context-all-ignore-module.swift b/Tests/Expected/Storyboards-macOS/swift2-context-all-ignore-module.swift index 202b3a6..ca0d367 100644 --- a/Tests/Expected/Storyboards-macOS/swift2-context-all-ignore-module.swift +++ b/Tests/Expected/Storyboards-macOS/swift2-context-all-ignore-module.swift @@ -7,134 +7,88 @@ import PrefsWindowController // swiftlint:disable file_length -protocol StoryboardSceneType { +protocol StoryboardType { static var storyboardName: String { get } } -extension StoryboardSceneType { - static func storyboard() -> NSStoryboard { +extension StoryboardType { + static var storyboard: NSStoryboard { return NSStoryboard(name: self.storyboardName, bundle: NSBundle(forClass: BundleToken.self)) } } -extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == String { - func controller() -> AnyObject { - return Self.storyboard().instantiateControllerWithIdentifier(self.rawValue) +struct SceneType { + let storyboard: StoryboardType.Type + let identifier: String + + var controller: T { + guard let controller = storyboard.storyboard.instantiateControllerWithIdentifier(identifier) as? T else { + fatalError("Controller '\(identifier)' is not of the expected class \(T.self).") + } + return controller } - static func controller(identifier: Self) -> AnyObject { - return identifier.controller() +} + +struct InitialSceneType { + let storyboard: StoryboardType.Type + + var controller: T { + guard let controller = storyboard.storyboard.instantiateInitialController() as? T else { + fatalError("Controller is not of the expected class \(T.self).") + } + return controller } } -protocol StoryboardSegueType: RawRepresentable { } +protocol SegueType: RawRepresentable { } extension NSSeguePerforming { - func performSegue(segue: S, sender: AnyObject? = nil) { + func performSegue(segue: S, sender: AnyObject? = nil) { performSegueWithIdentifier?(segue.rawValue, sender: sender) } } // swiftlint:disable explicit_type_interface identifier_name line_length type_body_length type_name enum StoryboardScene { - enum AdditionalImport: String, StoryboardSceneType { + enum AdditionalImport: StoryboardType { static let storyboardName = "AdditionalImport" - case PrivateScene = "private" - static func instantiatePrivate() -> PrefsWindowController.DBPrefsWindowController { - guard let controller = StoryboardScene.AdditionalImport.PrivateScene.controller() as? PrefsWindowController.DBPrefsWindowController else { - fatalError("Controller 'private' is not of the expected class PrefsWindowController.DBPrefsWindowController.") - } - return controller - } + static let Private = SceneType(AdditionalImport.self, identifier: "private") } - enum Anonymous: StoryboardSceneType { + enum Anonymous: StoryboardType { static let storyboardName = "Anonymous" } - enum Dependency: String, StoryboardSceneType { + enum Dependency: StoryboardType { static let storyboardName = "Dependency" - case DependentScene = "Dependent" - static func instantiateDependent() -> NSViewController { - guard let controller = StoryboardScene.Dependency.DependentScene.controller() as? NSViewController else { - fatalError("Controller 'Dependent' is not of the expected class NSViewController.") - } - return controller - } + static let Dependent = SceneType(Dependency.self, identifier: "Dependent") } - enum Message: String, StoryboardSceneType { + enum Message: StoryboardType { static let storyboardName = "Message" - case MessageDetailsScene = "MessageDetails" - static func instantiateMessageDetails() -> NSViewController { - guard let controller = StoryboardScene.Message.MessageDetailsScene.controller() as? NSViewController else { - fatalError("Controller 'MessageDetails' is not of the expected class NSViewController.") - } - return controller - } + static let MessageDetails = SceneType(Message.self, identifier: "MessageDetails") - case MessageListScene = "MessageList" - static func instantiateMessageList() -> NSViewController { - guard let controller = StoryboardScene.Message.MessageListScene.controller() as? NSViewController else { - fatalError("Controller 'MessageList' is not of the expected class NSViewController.") - } - return controller - } + static let MessageList = SceneType(Message.self, identifier: "MessageList") - case MessageListFooterScene = "MessageListFooter" - static func instantiateMessageListFooter() -> NSViewController { - guard let controller = StoryboardScene.Message.MessageListFooterScene.controller() as? NSViewController else { - fatalError("Controller 'MessageListFooter' is not of the expected class NSViewController.") - } - return controller - } + static let MessageListFooter = SceneType(Message.self, identifier: "MessageListFooter") - case MessagesTabScene = "MessagesTab" - static func instantiateMessagesTab() -> CustomTabViewController { - guard let controller = StoryboardScene.Message.MessagesTabScene.controller() as? CustomTabViewController else { - fatalError("Controller 'MessagesTab' is not of the expected class CustomTabViewController.") - } - return controller - } + static let MessagesTab = SceneType(Message.self, identifier: "MessagesTab") - case SplitMessagesScene = "SplitMessages" - static func instantiateSplitMessages() -> NSSplitViewController { - guard let controller = StoryboardScene.Message.SplitMessagesScene.controller() as? NSSplitViewController else { - fatalError("Controller 'SplitMessages' is not of the expected class NSSplitViewController.") - } - return controller - } + static let SplitMessages = SceneType(Message.self, identifier: "SplitMessages") - case WindowCtrlScene = "WindowCtrl" - static func instantiateWindowCtrl() -> NSWindowController { - guard let controller = StoryboardScene.Message.WindowCtrlScene.controller() as? NSWindowController else { - fatalError("Controller 'WindowCtrl' is not of the expected class NSWindowController.") - } - return controller - } + static let WindowCtrl = SceneType(Message.self, identifier: "WindowCtrl") } - enum Placeholder: String, StoryboardSceneType { + enum Placeholder: StoryboardType { static let storyboardName = "Placeholder" - case DependentScene = "Dependent" - static func instantiateDependent() -> NSControllerPlaceholder { - guard let controller = StoryboardScene.Placeholder.DependentScene.controller() as? NSControllerPlaceholder else { - fatalError("Controller 'Dependent' is not of the expected class NSControllerPlaceholder.") - } - return controller - } + static let Dependent = SceneType(Placeholder.self, identifier: "Dependent") - case WindowScene = "Window" - static func instantiateWindow() -> NSWindowController { - guard let controller = StoryboardScene.Placeholder.WindowScene.controller() as? NSWindowController else { - fatalError("Controller 'Window' is not of the expected class NSWindowController.") - } - return controller - } + static let Window = SceneType(Placeholder.self, identifier: "Window") } } enum StoryboardSegue { - enum Message: String, StoryboardSegueType { + enum Message: String, SegueType { case Embed case Modal case Popover diff --git a/Tests/Expected/Storyboards-macOS/swift2-context-all.swift b/Tests/Expected/Storyboards-macOS/swift2-context-all.swift index 4775089..2e32043 100644 --- a/Tests/Expected/Storyboards-macOS/swift2-context-all.swift +++ b/Tests/Expected/Storyboards-macOS/swift2-context-all.swift @@ -8,134 +8,88 @@ import PrefsWindowController // swiftlint:disable file_length -protocol StoryboardSceneType { +protocol StoryboardType { static var storyboardName: String { get } } -extension StoryboardSceneType { - static func storyboard() -> NSStoryboard { +extension StoryboardType { + static var storyboard: NSStoryboard { return NSStoryboard(name: self.storyboardName, bundle: NSBundle(forClass: BundleToken.self)) } } -extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == String { - func controller() -> AnyObject { - return Self.storyboard().instantiateControllerWithIdentifier(self.rawValue) +struct SceneType { + let storyboard: StoryboardType.Type + let identifier: String + + var controller: T { + guard let controller = storyboard.storyboard.instantiateControllerWithIdentifier(identifier) as? T else { + fatalError("Controller '\(identifier)' is not of the expected class \(T.self).") + } + return controller } - static func controller(identifier: Self) -> AnyObject { - return identifier.controller() +} + +struct InitialSceneType { + let storyboard: StoryboardType.Type + + var controller: T { + guard let controller = storyboard.storyboard.instantiateInitialController() as? T else { + fatalError("Controller is not of the expected class \(T.self).") + } + return controller } } -protocol StoryboardSegueType: RawRepresentable { } +protocol SegueType: RawRepresentable { } extension NSSeguePerforming { - func performSegue(segue: S, sender: AnyObject? = nil) { + func performSegue(segue: S, sender: AnyObject? = nil) { performSegueWithIdentifier?(segue.rawValue, sender: sender) } } // swiftlint:disable explicit_type_interface identifier_name line_length type_body_length type_name enum StoryboardScene { - enum AdditionalImport: String, StoryboardSceneType { + enum AdditionalImport: StoryboardType { static let storyboardName = "AdditionalImport" - case PrivateScene = "private" - static func instantiatePrivate() -> PrefsWindowController.DBPrefsWindowController { - guard let controller = StoryboardScene.AdditionalImport.PrivateScene.controller() as? PrefsWindowController.DBPrefsWindowController else { - fatalError("Controller 'private' is not of the expected class PrefsWindowController.DBPrefsWindowController.") - } - return controller - } + static let Private = SceneType(AdditionalImport.self, identifier: "private") } - enum Anonymous: StoryboardSceneType { + enum Anonymous: StoryboardType { static let storyboardName = "Anonymous" } - enum Dependency: String, StoryboardSceneType { + enum Dependency: StoryboardType { static let storyboardName = "Dependency" - case DependentScene = "Dependent" - static func instantiateDependent() -> NSViewController { - guard let controller = StoryboardScene.Dependency.DependentScene.controller() as? NSViewController else { - fatalError("Controller 'Dependent' is not of the expected class NSViewController.") - } - return controller - } + static let Dependent = SceneType(Dependency.self, identifier: "Dependent") } - enum Message: String, StoryboardSceneType { + enum Message: StoryboardType { static let storyboardName = "Message" - case MessageDetailsScene = "MessageDetails" - static func instantiateMessageDetails() -> NSViewController { - guard let controller = StoryboardScene.Message.MessageDetailsScene.controller() as? NSViewController else { - fatalError("Controller 'MessageDetails' is not of the expected class NSViewController.") - } - return controller - } + static let MessageDetails = SceneType(Message.self, identifier: "MessageDetails") - case MessageListScene = "MessageList" - static func instantiateMessageList() -> NSViewController { - guard let controller = StoryboardScene.Message.MessageListScene.controller() as? NSViewController else { - fatalError("Controller 'MessageList' is not of the expected class NSViewController.") - } - return controller - } + static let MessageList = SceneType(Message.self, identifier: "MessageList") - case MessageListFooterScene = "MessageListFooter" - static func instantiateMessageListFooter() -> NSViewController { - guard let controller = StoryboardScene.Message.MessageListFooterScene.controller() as? NSViewController else { - fatalError("Controller 'MessageListFooter' is not of the expected class NSViewController.") - } - return controller - } + static let MessageListFooter = SceneType(Message.self, identifier: "MessageListFooter") - case MessagesTabScene = "MessagesTab" - static func instantiateMessagesTab() -> CustomTabViewController { - guard let controller = StoryboardScene.Message.MessagesTabScene.controller() as? CustomTabViewController else { - fatalError("Controller 'MessagesTab' is not of the expected class CustomTabViewController.") - } - return controller - } + static let MessagesTab = SceneType(Message.self, identifier: "MessagesTab") - case SplitMessagesScene = "SplitMessages" - static func instantiateSplitMessages() -> NSSplitViewController { - guard let controller = StoryboardScene.Message.SplitMessagesScene.controller() as? NSSplitViewController else { - fatalError("Controller 'SplitMessages' is not of the expected class NSSplitViewController.") - } - return controller - } + static let SplitMessages = SceneType(Message.self, identifier: "SplitMessages") - case WindowCtrlScene = "WindowCtrl" - static func instantiateWindowCtrl() -> NSWindowController { - guard let controller = StoryboardScene.Message.WindowCtrlScene.controller() as? NSWindowController else { - fatalError("Controller 'WindowCtrl' is not of the expected class NSWindowController.") - } - return controller - } + static let WindowCtrl = SceneType(Message.self, identifier: "WindowCtrl") } - enum Placeholder: String, StoryboardSceneType { + enum Placeholder: StoryboardType { static let storyboardName = "Placeholder" - case DependentScene = "Dependent" - static func instantiateDependent() -> NSControllerPlaceholder { - guard let controller = StoryboardScene.Placeholder.DependentScene.controller() as? NSControllerPlaceholder else { - fatalError("Controller 'Dependent' is not of the expected class NSControllerPlaceholder.") - } - return controller - } + static let Dependent = SceneType(Placeholder.self, identifier: "Dependent") - case WindowScene = "Window" - static func instantiateWindow() -> NSWindowController { - guard let controller = StoryboardScene.Placeholder.WindowScene.controller() as? NSWindowController else { - fatalError("Controller 'Window' is not of the expected class NSWindowController.") - } - return controller - } + static let Window = SceneType(Placeholder.self, identifier: "Window") } } enum StoryboardSegue { - enum Message: String, StoryboardSegueType { + enum Message: String, SegueType { case Embed case Modal case Popover diff --git a/Tests/Expected/Storyboards-macOS/swift3-context-all-customname.swift b/Tests/Expected/Storyboards-macOS/swift3-context-all-customname.swift index 9a85707..446e1cf 100644 --- a/Tests/Expected/Storyboards-macOS/swift3-context-all-customname.swift +++ b/Tests/Expected/Storyboards-macOS/swift3-context-all-customname.swift @@ -8,134 +8,88 @@ import PrefsWindowController // swiftlint:disable file_length -protocol StoryboardSceneType { +protocol StoryboardType { static var storyboardName: String { get } } -extension StoryboardSceneType { - static func storyboard() -> NSStoryboard { +extension StoryboardType { + static var storyboard: NSStoryboard { return NSStoryboard(name: self.storyboardName, bundle: Bundle(for: BundleToken.self)) } } -extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == String { - func controller() -> Any { - return Self.storyboard().instantiateController(withIdentifier: self.rawValue) +struct SceneType { + let storyboard: StoryboardType.Type + let identifier: String + + var controller: T { + guard let controller = storyboard.storyboard.instantiateController(withIdentifier: identifier) as? T else { + fatalError("Controller '\(identifier)' is not of the expected class \(T.self).") + } + return controller } - static func controller(identifier: Self) -> Any { - return identifier.controller() +} + +struct InitialSceneType { + let storyboard: StoryboardType.Type + + var controller: T { + guard let controller = storyboard.storyboard.instantiateInitialController() as? T else { + fatalError("Controller is not of the expected class \(T.self).") + } + return controller } } -protocol StoryboardSegueType: RawRepresentable { } +protocol SegueType: RawRepresentable { } extension NSSeguePerforming { - func perform(segue: S, sender: Any? = nil) where S.RawValue == String { + func perform(segue: S, sender: Any? = nil) where S.RawValue == String { performSegue?(withIdentifier: segue.rawValue, sender: sender) } } // swiftlint:disable explicit_type_interface identifier_name line_length type_body_length type_name enum XCTStoryboardsScene { - enum AdditionalImport: String, StoryboardSceneType { + enum AdditionalImport: StoryboardType { static let storyboardName = "AdditionalImport" - case privateScene = "private" - static func instantiatePrivate() -> PrefsWindowController.DBPrefsWindowController { - guard let controller = XCTStoryboardsScene.AdditionalImport.privateScene.controller() as? PrefsWindowController.DBPrefsWindowController else { - fatalError("Controller 'private' is not of the expected class PrefsWindowController.DBPrefsWindowController.") - } - return controller - } + static let `private` = SceneType(storyboard: AdditionalImport.self, identifier: "private") } - enum Anonymous: StoryboardSceneType { + enum Anonymous: StoryboardType { static let storyboardName = "Anonymous" } - enum Dependency: String, StoryboardSceneType { + enum Dependency: StoryboardType { static let storyboardName = "Dependency" - case dependentScene = "Dependent" - static func instantiateDependent() -> NSViewController { - guard let controller = XCTStoryboardsScene.Dependency.dependentScene.controller() as? NSViewController else { - fatalError("Controller 'Dependent' is not of the expected class NSViewController.") - } - return controller - } + static let dependent = SceneType(storyboard: Dependency.self, identifier: "Dependent") } - enum Message: String, StoryboardSceneType { + enum Message: StoryboardType { static let storyboardName = "Message" - case messageDetailsScene = "MessageDetails" - static func instantiateMessageDetails() -> NSViewController { - guard let controller = XCTStoryboardsScene.Message.messageDetailsScene.controller() as? NSViewController else { - fatalError("Controller 'MessageDetails' is not of the expected class NSViewController.") - } - return controller - } + static let messageDetails = SceneType(storyboard: Message.self, identifier: "MessageDetails") - case messageListScene = "MessageList" - static func instantiateMessageList() -> NSViewController { - guard let controller = XCTStoryboardsScene.Message.messageListScene.controller() as? NSViewController else { - fatalError("Controller 'MessageList' is not of the expected class NSViewController.") - } - return controller - } + static let messageList = SceneType(storyboard: Message.self, identifier: "MessageList") - case messageListFooterScene = "MessageListFooter" - static func instantiateMessageListFooter() -> NSViewController { - guard let controller = XCTStoryboardsScene.Message.messageListFooterScene.controller() as? NSViewController else { - fatalError("Controller 'MessageListFooter' is not of the expected class NSViewController.") - } - return controller - } + static let messageListFooter = SceneType(storyboard: Message.self, identifier: "MessageListFooter") - case messagesTabScene = "MessagesTab" - static func instantiateMessagesTab() -> CustomTabViewController { - guard let controller = XCTStoryboardsScene.Message.messagesTabScene.controller() as? CustomTabViewController else { - fatalError("Controller 'MessagesTab' is not of the expected class CustomTabViewController.") - } - return controller - } + static let messagesTab = SceneType(storyboard: Message.self, identifier: "MessagesTab") - case splitMessagesScene = "SplitMessages" - static func instantiateSplitMessages() -> NSSplitViewController { - guard let controller = XCTStoryboardsScene.Message.splitMessagesScene.controller() as? NSSplitViewController else { - fatalError("Controller 'SplitMessages' is not of the expected class NSSplitViewController.") - } - return controller - } + static let splitMessages = SceneType(storyboard: Message.self, identifier: "SplitMessages") - case windowCtrlScene = "WindowCtrl" - static func instantiateWindowCtrl() -> NSWindowController { - guard let controller = XCTStoryboardsScene.Message.windowCtrlScene.controller() as? NSWindowController else { - fatalError("Controller 'WindowCtrl' is not of the expected class NSWindowController.") - } - return controller - } + static let windowCtrl = SceneType(storyboard: Message.self, identifier: "WindowCtrl") } - enum Placeholder: String, StoryboardSceneType { + enum Placeholder: StoryboardType { static let storyboardName = "Placeholder" - case dependentScene = "Dependent" - static func instantiateDependent() -> NSControllerPlaceholder { - guard let controller = XCTStoryboardsScene.Placeholder.dependentScene.controller() as? NSControllerPlaceholder else { - fatalError("Controller 'Dependent' is not of the expected class NSControllerPlaceholder.") - } - return controller - } + static let dependent = SceneType(storyboard: Placeholder.self, identifier: "Dependent") - case windowScene = "Window" - static func instantiateWindow() -> NSWindowController { - guard let controller = XCTStoryboardsScene.Placeholder.windowScene.controller() as? NSWindowController else { - fatalError("Controller 'Window' is not of the expected class NSWindowController.") - } - return controller - } + static let window = SceneType(storyboard: Placeholder.self, identifier: "Window") } } enum XCTStoryboardsSegue { - enum Message: String, StoryboardSegueType { + enum Message: String, SegueType { case embed = "Embed" case modal = "Modal" case popover = "Popover" diff --git a/Tests/Expected/Storyboards-macOS/swift3-context-all-ignore-module.swift b/Tests/Expected/Storyboards-macOS/swift3-context-all-ignore-module.swift index a3d0143..9931444 100644 --- a/Tests/Expected/Storyboards-macOS/swift3-context-all-ignore-module.swift +++ b/Tests/Expected/Storyboards-macOS/swift3-context-all-ignore-module.swift @@ -7,134 +7,88 @@ import PrefsWindowController // swiftlint:disable file_length -protocol StoryboardSceneType { +protocol StoryboardType { static var storyboardName: String { get } } -extension StoryboardSceneType { - static func storyboard() -> NSStoryboard { +extension StoryboardType { + static var storyboard: NSStoryboard { return NSStoryboard(name: self.storyboardName, bundle: Bundle(for: BundleToken.self)) } } -extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == String { - func controller() -> Any { - return Self.storyboard().instantiateController(withIdentifier: self.rawValue) +struct SceneType { + let storyboard: StoryboardType.Type + let identifier: String + + var controller: T { + guard let controller = storyboard.storyboard.instantiateController(withIdentifier: identifier) as? T else { + fatalError("Controller '\(identifier)' is not of the expected class \(T.self).") + } + return controller } - static func controller(identifier: Self) -> Any { - return identifier.controller() +} + +struct InitialSceneType { + let storyboard: StoryboardType.Type + + var controller: T { + guard let controller = storyboard.storyboard.instantiateInitialController() as? T else { + fatalError("Controller is not of the expected class \(T.self).") + } + return controller } } -protocol StoryboardSegueType: RawRepresentable { } +protocol SegueType: RawRepresentable { } extension NSSeguePerforming { - func perform(segue: S, sender: Any? = nil) where S.RawValue == String { + func perform(segue: S, sender: Any? = nil) where S.RawValue == String { performSegue?(withIdentifier: segue.rawValue, sender: sender) } } // swiftlint:disable explicit_type_interface identifier_name line_length type_body_length type_name enum StoryboardScene { - enum AdditionalImport: String, StoryboardSceneType { + enum AdditionalImport: StoryboardType { static let storyboardName = "AdditionalImport" - case privateScene = "private" - static func instantiatePrivate() -> PrefsWindowController.DBPrefsWindowController { - guard let controller = StoryboardScene.AdditionalImport.privateScene.controller() as? PrefsWindowController.DBPrefsWindowController else { - fatalError("Controller 'private' is not of the expected class PrefsWindowController.DBPrefsWindowController.") - } - return controller - } + static let `private` = SceneType(storyboard: AdditionalImport.self, identifier: "private") } - enum Anonymous: StoryboardSceneType { + enum Anonymous: StoryboardType { static let storyboardName = "Anonymous" } - enum Dependency: String, StoryboardSceneType { + enum Dependency: StoryboardType { static let storyboardName = "Dependency" - case dependentScene = "Dependent" - static func instantiateDependent() -> NSViewController { - guard let controller = StoryboardScene.Dependency.dependentScene.controller() as? NSViewController else { - fatalError("Controller 'Dependent' is not of the expected class NSViewController.") - } - return controller - } + static let dependent = SceneType(storyboard: Dependency.self, identifier: "Dependent") } - enum Message: String, StoryboardSceneType { + enum Message: StoryboardType { static let storyboardName = "Message" - case messageDetailsScene = "MessageDetails" - static func instantiateMessageDetails() -> NSViewController { - guard let controller = StoryboardScene.Message.messageDetailsScene.controller() as? NSViewController else { - fatalError("Controller 'MessageDetails' is not of the expected class NSViewController.") - } - return controller - } + static let messageDetails = SceneType(storyboard: Message.self, identifier: "MessageDetails") - case messageListScene = "MessageList" - static func instantiateMessageList() -> NSViewController { - guard let controller = StoryboardScene.Message.messageListScene.controller() as? NSViewController else { - fatalError("Controller 'MessageList' is not of the expected class NSViewController.") - } - return controller - } + static let messageList = SceneType(storyboard: Message.self, identifier: "MessageList") - case messageListFooterScene = "MessageListFooter" - static func instantiateMessageListFooter() -> NSViewController { - guard let controller = StoryboardScene.Message.messageListFooterScene.controller() as? NSViewController else { - fatalError("Controller 'MessageListFooter' is not of the expected class NSViewController.") - } - return controller - } + static let messageListFooter = SceneType(storyboard: Message.self, identifier: "MessageListFooter") - case messagesTabScene = "MessagesTab" - static func instantiateMessagesTab() -> CustomTabViewController { - guard let controller = StoryboardScene.Message.messagesTabScene.controller() as? CustomTabViewController else { - fatalError("Controller 'MessagesTab' is not of the expected class CustomTabViewController.") - } - return controller - } + static let messagesTab = SceneType(storyboard: Message.self, identifier: "MessagesTab") - case splitMessagesScene = "SplitMessages" - static func instantiateSplitMessages() -> NSSplitViewController { - guard let controller = StoryboardScene.Message.splitMessagesScene.controller() as? NSSplitViewController else { - fatalError("Controller 'SplitMessages' is not of the expected class NSSplitViewController.") - } - return controller - } + static let splitMessages = SceneType(storyboard: Message.self, identifier: "SplitMessages") - case windowCtrlScene = "WindowCtrl" - static func instantiateWindowCtrl() -> NSWindowController { - guard let controller = StoryboardScene.Message.windowCtrlScene.controller() as? NSWindowController else { - fatalError("Controller 'WindowCtrl' is not of the expected class NSWindowController.") - } - return controller - } + static let windowCtrl = SceneType(storyboard: Message.self, identifier: "WindowCtrl") } - enum Placeholder: String, StoryboardSceneType { + enum Placeholder: StoryboardType { static let storyboardName = "Placeholder" - case dependentScene = "Dependent" - static func instantiateDependent() -> NSControllerPlaceholder { - guard let controller = StoryboardScene.Placeholder.dependentScene.controller() as? NSControllerPlaceholder else { - fatalError("Controller 'Dependent' is not of the expected class NSControllerPlaceholder.") - } - return controller - } + static let dependent = SceneType(storyboard: Placeholder.self, identifier: "Dependent") - case windowScene = "Window" - static func instantiateWindow() -> NSWindowController { - guard let controller = StoryboardScene.Placeholder.windowScene.controller() as? NSWindowController else { - fatalError("Controller 'Window' is not of the expected class NSWindowController.") - } - return controller - } + static let window = SceneType(storyboard: Placeholder.self, identifier: "Window") } } enum StoryboardSegue { - enum Message: String, StoryboardSegueType { + enum Message: String, SegueType { case embed = "Embed" case modal = "Modal" case popover = "Popover" diff --git a/Tests/Expected/Storyboards-macOS/swift3-context-all.swift b/Tests/Expected/Storyboards-macOS/swift3-context-all.swift index 9adefb0..77b82a9 100644 --- a/Tests/Expected/Storyboards-macOS/swift3-context-all.swift +++ b/Tests/Expected/Storyboards-macOS/swift3-context-all.swift @@ -8,134 +8,88 @@ import PrefsWindowController // swiftlint:disable file_length -protocol StoryboardSceneType { +protocol StoryboardType { static var storyboardName: String { get } } -extension StoryboardSceneType { - static func storyboard() -> NSStoryboard { +extension StoryboardType { + static var storyboard: NSStoryboard { return NSStoryboard(name: self.storyboardName, bundle: Bundle(for: BundleToken.self)) } } -extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == String { - func controller() -> Any { - return Self.storyboard().instantiateController(withIdentifier: self.rawValue) +struct SceneType { + let storyboard: StoryboardType.Type + let identifier: String + + var controller: T { + guard let controller = storyboard.storyboard.instantiateController(withIdentifier: identifier) as? T else { + fatalError("Controller '\(identifier)' is not of the expected class \(T.self).") + } + return controller } - static func controller(identifier: Self) -> Any { - return identifier.controller() +} + +struct InitialSceneType { + let storyboard: StoryboardType.Type + + var controller: T { + guard let controller = storyboard.storyboard.instantiateInitialController() as? T else { + fatalError("Controller is not of the expected class \(T.self).") + } + return controller } } -protocol StoryboardSegueType: RawRepresentable { } +protocol SegueType: RawRepresentable { } extension NSSeguePerforming { - func perform(segue: S, sender: Any? = nil) where S.RawValue == String { + func perform(segue: S, sender: Any? = nil) where S.RawValue == String { performSegue?(withIdentifier: segue.rawValue, sender: sender) } } // swiftlint:disable explicit_type_interface identifier_name line_length type_body_length type_name enum StoryboardScene { - enum AdditionalImport: String, StoryboardSceneType { + enum AdditionalImport: StoryboardType { static let storyboardName = "AdditionalImport" - case privateScene = "private" - static func instantiatePrivate() -> PrefsWindowController.DBPrefsWindowController { - guard let controller = StoryboardScene.AdditionalImport.privateScene.controller() as? PrefsWindowController.DBPrefsWindowController else { - fatalError("Controller 'private' is not of the expected class PrefsWindowController.DBPrefsWindowController.") - } - return controller - } + static let `private` = SceneType(storyboard: AdditionalImport.self, identifier: "private") } - enum Anonymous: StoryboardSceneType { + enum Anonymous: StoryboardType { static let storyboardName = "Anonymous" } - enum Dependency: String, StoryboardSceneType { + enum Dependency: StoryboardType { static let storyboardName = "Dependency" - case dependentScene = "Dependent" - static func instantiateDependent() -> NSViewController { - guard let controller = StoryboardScene.Dependency.dependentScene.controller() as? NSViewController else { - fatalError("Controller 'Dependent' is not of the expected class NSViewController.") - } - return controller - } + static let dependent = SceneType(storyboard: Dependency.self, identifier: "Dependent") } - enum Message: String, StoryboardSceneType { + enum Message: StoryboardType { static let storyboardName = "Message" - case messageDetailsScene = "MessageDetails" - static func instantiateMessageDetails() -> NSViewController { - guard let controller = StoryboardScene.Message.messageDetailsScene.controller() as? NSViewController else { - fatalError("Controller 'MessageDetails' is not of the expected class NSViewController.") - } - return controller - } + static let messageDetails = SceneType(storyboard: Message.self, identifier: "MessageDetails") - case messageListScene = "MessageList" - static func instantiateMessageList() -> NSViewController { - guard let controller = StoryboardScene.Message.messageListScene.controller() as? NSViewController else { - fatalError("Controller 'MessageList' is not of the expected class NSViewController.") - } - return controller - } + static let messageList = SceneType(storyboard: Message.self, identifier: "MessageList") - case messageListFooterScene = "MessageListFooter" - static func instantiateMessageListFooter() -> NSViewController { - guard let controller = StoryboardScene.Message.messageListFooterScene.controller() as? NSViewController else { - fatalError("Controller 'MessageListFooter' is not of the expected class NSViewController.") - } - return controller - } + static let messageListFooter = SceneType(storyboard: Message.self, identifier: "MessageListFooter") - case messagesTabScene = "MessagesTab" - static func instantiateMessagesTab() -> CustomTabViewController { - guard let controller = StoryboardScene.Message.messagesTabScene.controller() as? CustomTabViewController else { - fatalError("Controller 'MessagesTab' is not of the expected class CustomTabViewController.") - } - return controller - } + static let messagesTab = SceneType(storyboard: Message.self, identifier: "MessagesTab") - case splitMessagesScene = "SplitMessages" - static func instantiateSplitMessages() -> NSSplitViewController { - guard let controller = StoryboardScene.Message.splitMessagesScene.controller() as? NSSplitViewController else { - fatalError("Controller 'SplitMessages' is not of the expected class NSSplitViewController.") - } - return controller - } + static let splitMessages = SceneType(storyboard: Message.self, identifier: "SplitMessages") - case windowCtrlScene = "WindowCtrl" - static func instantiateWindowCtrl() -> NSWindowController { - guard let controller = StoryboardScene.Message.windowCtrlScene.controller() as? NSWindowController else { - fatalError("Controller 'WindowCtrl' is not of the expected class NSWindowController.") - } - return controller - } + static let windowCtrl = SceneType(storyboard: Message.self, identifier: "WindowCtrl") } - enum Placeholder: String, StoryboardSceneType { + enum Placeholder: StoryboardType { static let storyboardName = "Placeholder" - case dependentScene = "Dependent" - static func instantiateDependent() -> NSControllerPlaceholder { - guard let controller = StoryboardScene.Placeholder.dependentScene.controller() as? NSControllerPlaceholder else { - fatalError("Controller 'Dependent' is not of the expected class NSControllerPlaceholder.") - } - return controller - } + static let dependent = SceneType(storyboard: Placeholder.self, identifier: "Dependent") - case windowScene = "Window" - static func instantiateWindow() -> NSWindowController { - guard let controller = StoryboardScene.Placeholder.windowScene.controller() as? NSWindowController else { - fatalError("Controller 'Window' is not of the expected class NSWindowController.") - } - return controller - } + static let window = SceneType(storyboard: Placeholder.self, identifier: "Window") } } enum StoryboardSegue { - enum Message: String, StoryboardSegueType { + enum Message: String, SegueType { case embed = "Embed" case modal = "Modal" case popover = "Popover" diff --git a/templates/storyboards/swift2.stencil b/templates/storyboards/swift2.stencil index 1971339..1813735 100644 --- a/templates/storyboards/swift2.stencil +++ b/templates/storyboards/swift2.stencil @@ -4,7 +4,6 @@ {% set isAppKit %}{% if platform == "macOS" %}true{% endif %}{% endset %} {% set prefix %}{% if isAppKit %}NS{% else %}UI{% endif %}{% endset %} {% set controller %}{% if isAppKit %}Controller{% else %}ViewController{% endif %}{% endset %} -{% set baseType %}{% if isAppKit %}AnyObject{% else %}UIViewController{% endif %}{% endset %} // swiftlint:disable sorted_imports import Foundation import {% if isAppKit %}Cocoa{% else %}UIKit{% endif %} @@ -15,29 +14,43 @@ import {{module}} // swiftlint:disable file_length {# This first part of the code is static, same every time whatever Storyboard you have #} -protocol StoryboardSceneType { +protocol StoryboardType { static var storyboardName: String { get } } -extension StoryboardSceneType { - static func storyboard() -> {{prefix}}Storyboard { +extension StoryboardType { + static var storyboard: {{prefix}}Storyboard { return {{prefix}}Storyboard(name: self.storyboardName, bundle: NSBundle(forClass: BundleToken.self)) } } -extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == String { - func {{controller|lowerFirstWord}}() -> {{baseType}} { - return Self.storyboard().instantiate{{controller}}WithIdentifier(self.rawValue) +struct SceneType { + let storyboard: StoryboardType.Type + let identifier: String + + var controller: T { + guard let controller = storyboard.storyboard.instantiate{{controller}}WithIdentifier(identifier) as? T else { + fatalError("Controller '\(identifier)' is not of the expected class \(T.self).") + } + return controller } - static func {{controller|lowerFirstWord}}(identifier: Self) -> {{baseType}} { - return identifier.{{controller|lowerFirstWord}}() +} + +struct InitialSceneType { + let storyboard: StoryboardType.Type + + var controller: T { + guard let controller = storyboard.storyboard.instantiateInitial{{controller}}() as? T else { + fatalError("Controller is not of the expected class \(T.self).") + } + return controller } } -protocol StoryboardSegueType: RawRepresentable { } +protocol SegueType: RawRepresentable { } -extension {% if isAppKit %}NSSeguePerforming{% else %}{{baseType}}{% endif %} { - func performSegue(segue: S, sender: AnyObject? = nil) { +extension {% if isAppKit %}NSSeguePerforming{% else %}UIViewController{% endif %} { + func performSegue(segue: S, sender: AnyObject? = nil) { performSegueWithIdentifier{% if isAppKit %}?{% endif %}(segue.rawValue, sender: sender) } } @@ -56,44 +69,26 @@ extension {% if isAppKit %}NSSeguePerforming{% else %}{{baseType}}{% endif %} { enum {{sceneEnumName}} { {% for storyboard in storyboards %} {% set storyboardName %}{{storyboard.name|swiftIdentifier|escapeReservedKeywords}}{% endset %} - enum {{storyboardName}}: {% if storyboard.scenes %}String, {% endif %}StoryboardSceneType { + enum {{storyboardName}}: StoryboardType { static let storyboardName = "{{storyboard.name}}" {% if storyboard.initialScene %} {% set sceneClass %}{% call className storyboard.initialScene %}{% endset %} - {% set castAsClass %}{% if isAppKit or storyboard.initialScene.baseType != "ViewController" %} as? {{sceneClass}}{% endif %}{% endset %} - static func initialViewController() -> {{sceneClass}} { - guard let controller = storyboard().instantiateInitialViewController(){{castAsClass}} else { - fatalError("Failed to instantiate initialViewController for \(self.storyboardName)") - } - return controller - } + static let initialScene = InitialSceneType<{{sceneClass}}>({{storyboardName}}.self) {% endif %} - {% if storyboard.scenes %} {% for scene in storyboard.scenes %} - {% set sceneID %}{{scene.identifier|swiftIdentifier}}{% endset %} - case {{sceneID}}Scene = "{{scene.identifier}}" + {% set sceneID %}{{scene.identifier|swiftIdentifier|escapeReservedKeywords}}{% endset %} {% set sceneClass %}{% call className scene %}{% endset %} - static func instantiate{{sceneID|snakeToCamelCase}}() -> {{sceneClass}} { - {% if isAppKit or scene.baseType != "ViewController" %} - guard let controller = {{sceneEnumName}}.{{storyboardName}}.{{sceneID}}Scene.{{controller|lowerFirstWord}}() as? {{sceneClass}} else { - fatalError("{{controller}} '{{scene.identifier}}' is not of the expected class {{sceneClass}}.") - } - return controller - {% else %} - return {{sceneEnumName}}.{{storyboardName}}.{{sceneID}}Scene.{{controller|lowerFirstWord}}() - {% endif %} - } + static let {{sceneID}} = SceneType<{{sceneClass}}>({{storyboardName}}.self, identifier: "{{scene.identifier}}") {% endfor %} - {% endif %} } {% endfor %} } enum {{param.segueEnumName|default:"StoryboardSegue"}} { {% for storyboard in storyboards where storyboard.segues %} - enum {{storyboard.name|swiftIdentifier|escapeReservedKeywords}}: String, StoryboardSegueType { + enum {{storyboard.name|swiftIdentifier|escapeReservedKeywords}}: String, SegueType { {% for segue in storyboard.segues %} {% set segueID %}{{segue.identifier|swiftIdentifier}}{% endset %} case {{segueID|escapeReservedKeywords}}{% if segueID != segue.identifier %} = "{{segue.identifier}}"{% endif %} diff --git a/templates/storyboards/swift3.stencil b/templates/storyboards/swift3.stencil index 6dddfc8..b8e2bbb 100644 --- a/templates/storyboards/swift3.stencil +++ b/templates/storyboards/swift3.stencil @@ -4,7 +4,6 @@ {% set isAppKit %}{% if platform == "macOS" %}true{% endif %}{% endset %} {% set prefix %}{% if isAppKit %}NS{% else %}UI{% endif %}{% endset %} {% set controller %}{% if isAppKit %}Controller{% else %}ViewController{% endif %}{% endset %} -{% set baseType %}{% if isAppKit %}Any{% else %}UIViewController{% endif %}{% endset %} // swiftlint:disable sorted_imports import Foundation import {% if isAppKit %}Cocoa{% else %}UIKit{% endif %} @@ -15,29 +14,43 @@ import {{module}} // swiftlint:disable file_length {# This first part of the code is static, same every time whatever Storyboard you have #} -protocol StoryboardSceneType { +protocol StoryboardType { static var storyboardName: String { get } } -extension StoryboardSceneType { - static func storyboard() -> {{prefix}}Storyboard { +extension StoryboardType { + static var storyboard: {{prefix}}Storyboard { return {{prefix}}Storyboard(name: self.storyboardName, bundle: Bundle(for: BundleToken.self)) } } -extension StoryboardSceneType where Self: RawRepresentable, Self.RawValue == String { - func {{controller|lowerFirstWord}}() -> {{baseType}} { - return Self.storyboard().instantiate{{controller}}(withIdentifier: self.rawValue) +struct SceneType { + let storyboard: StoryboardType.Type + let identifier: String + + var controller: T { + guard let controller = storyboard.storyboard.instantiate{{controller}}(withIdentifier: identifier) as? T else { + fatalError("Controller '\(identifier)' is not of the expected class \(T.self).") + } + return controller } - static func {{controller|lowerFirstWord}}(identifier: Self) -> {{baseType}} { - return identifier.{{controller|lowerFirstWord}}() +} + +struct InitialSceneType { + let storyboard: StoryboardType.Type + + var controller: T { + guard let controller = storyboard.storyboard.instantiateInitial{{controller}}() as? T else { + fatalError("Controller is not of the expected class \(T.self).") + } + return controller } } -protocol StoryboardSegueType: RawRepresentable { } +protocol SegueType: RawRepresentable { } -extension {% if isAppKit %}NSSeguePerforming{% else %}{{baseType}}{% endif %} { - func perform(segue: S, sender: Any? = nil) where S.RawValue == String { +extension {% if isAppKit %}NSSeguePerforming{% else %}UIViewController{% endif %} { + func perform(segue: S, sender: Any? = nil) where S.RawValue == String { performSegue{% if isAppKit %}?{% endif %}(withIdentifier: segue.rawValue, sender: sender) } } @@ -56,44 +69,26 @@ extension {% if isAppKit %}NSSeguePerforming{% else %}{{baseType}}{% endif %} { enum {{sceneEnumName}} { {% for storyboard in storyboards %} {% set storyboardName %}{{storyboard.name|swiftIdentifier|escapeReservedKeywords}}{% endset %} - enum {{storyboardName}}: {% if storyboard.scenes %}String, {% endif %}StoryboardSceneType { + enum {{storyboardName}}: StoryboardType { static let storyboardName = "{{storyboard.name}}" {% if storyboard.initialScene %} {% set sceneClass %}{% call className storyboard.initialScene %}{% endset %} - {% set castAsClass %}{% if isAppKit or storyboard.initialScene.baseType != "ViewController" %} as? {{sceneClass}}{% endif %}{% endset %} - static func initialViewController() -> {{sceneClass}} { - guard let controller = storyboard().instantiateInitial{{controller}}(){{castAsClass}} else { - fatalError("Failed to instantiate initial{{controller}} for \(self.storyboardName)") - } - return controller - } + static let initialScene = InitialSceneType<{{sceneClass}}>(storyboard: {{storyboardName}}.self) {% endif %} - {% if storyboard.scenes %} {% for scene in storyboard.scenes %} - {% set sceneID %}{{scene.identifier|swiftIdentifier|snakeToCamelCase|lowerFirstWord}}{% endset %} - case {{sceneID}}Scene = "{{scene.identifier}}" + {% set sceneID %}{{scene.identifier|swiftIdentifier|snakeToCamelCase|lowerFirstWord|escapeReservedKeywords}}{% endset %} {% set sceneClass %}{% call className scene %}{% endset %} - static func instantiate{{sceneID|snakeToCamelCase}}() -> {{sceneClass}} { - {% if isAppKit or scene.baseType != "ViewController" %} - guard let controller = {{sceneEnumName}}.{{storyboardName}}.{{sceneID}}Scene.{{controller|lowerFirstWord}}() as? {{sceneClass}} else { - fatalError("{{controller}} '{{scene.identifier}}' is not of the expected class {{sceneClass}}.") - } - return controller - {% else %} - return {{sceneEnumName}}.{{storyboardName}}.{{sceneID}}Scene.{{controller|lowerFirstWord}}() - {% endif %} - } + static let {{sceneID}} = SceneType<{{sceneClass}}>(storyboard: {{storyboardName}}.self, identifier: "{{scene.identifier}}") {% endfor %} - {% endif %} } {% endfor %} } enum {{param.segueEnumName|default:"StoryboardSegue"}} { {% for storyboard in storyboards where storyboard.segues %} - enum {{storyboard.name|swiftIdentifier|escapeReservedKeywords}}: String, StoryboardSegueType { + enum {{storyboard.name|swiftIdentifier|escapeReservedKeywords}}: String, SegueType { {% for segue in storyboard.segues %} {% set segueID %}{{segue.identifier|swiftIdentifier|snakeToCamelCase|lowerFirstWord}}{% endset %} case {{segueID|escapeReservedKeywords}}{% if segueID != segue.identifier %} = "{{segue.identifier}}"{% endif %} From bfbf5e65fea064553539a6fd6cdebadef2e62844 Mon Sep 17 00:00:00 2001 From: David Jennes Date: Tue, 6 Jun 2017 03:46:45 +0200 Subject: [PATCH 4/5] Documentation changes + changelog --- CHANGELOG.md | 3 +++ Documentation/MigrationGuide.md | 4 ++-- Documentation/storyboards/swift2.md | 27 +++++++-------------------- Documentation/storyboards/swift3.md | 27 +++++++-------------------- templates/storyboards/swift2.stencil | 4 +++- templates/storyboards/swift3.stencil | 4 +++- 6 files changed, 25 insertions(+), 44 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f162755..03b8878 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,9 @@ * Since Swift 2 is no longer actively supported, we now consider those templates as "legacy" and cannot guarantee that there won't be issues with the generated code. [David Jennes](https://github.com/djbe) [#53](https://github.com/SwiftGen/templates/issues/53) +* The iOS and macOS storyboard templates have been unified into one. The generated code also no longer uses enum cases for scenes but instead uses a generic struct. See the documentation for some examples. + [David Jennes](https://github.com/djbe) + [#57](https://github.com/SwiftGen/templates/issues/57) ### New Features diff --git a/Documentation/MigrationGuide.md b/Documentation/MigrationGuide.md index 9a41f20..0a69592 100644 --- a/Documentation/MigrationGuide.md +++ b/Documentation/MigrationGuide.md @@ -36,9 +36,9 @@ Below is a list of renamed and removed templates, grouped by subcommand. If your | --- | --- | ------ | | default | swift2 | | | lowercase | **deleted** | No longer needed since we prefix classes with their module | -| osx-default | macOS-swift2 | | +| osx-default | **deleted** | Unified with the iOS template, just use `swift2` | | osx-lowercase | **deleted** | No longer needed since we prefix classes with their module | -| osx-swift3 | macOS-swift3 | | +| osx-swift3 | **deleted** | Unified with the iOS template, just use `swift3` | | uppercase | **deleted** | No longer needed since we prefix classes with their module | ### Strings ### diff --git a/Documentation/storyboards/swift2.md b/Documentation/storyboards/swift2.md index 1546244..768e96a 100644 --- a/Documentation/storyboards/swift2.md +++ b/Documentation/storyboards/swift2.md @@ -29,29 +29,19 @@ Note: the generated code may look differently depending on the platform the stor ```swift enum StoryboardScene { - enum Dependency: String, StoryboardSceneType { + enum Dependency: StoryboardType { static let storyboardName = "Dependency" - case DependentScene = "Dependent" - static func instantiateDependent() -> UIViewController { - return StoryboardScene.Dependency.DependentScene.viewController() - } + static let Dependent = SceneType(Dependency.self, identifier: "Dependent") } - enum Message: String, StoryboardSceneType { + enum Message: StoryboardType { static let storyboardName = "Message" - case MessagesListScene = "MessagesList" - static func instantiateMessagesList() -> UITableViewController { - guard let vc = StoryboardScene.Message.MessagesListScene.viewController() as? UITableViewController - else { - fatalError("ViewController 'MessagesList' is not of the expected class UITableViewController.") - } - return vc - } + static let MessagesList = SceneType(Message.self, identifier: "MessagesList") } } enum StoryboardSegue { - enum Message: String, StoryboardSegueType { + enum Message: String, SegueType { case Embed case NonCustom } @@ -63,11 +53,8 @@ enum StoryboardSegue { ## Usage example ```swift -// You can instantiate scenes using the generic `viewController()` method: -let vc = StoryboardScene.Dependency.DependentScene.viewController() - -// or the `instantiate...()` method (which will cast to the correct type): -let vc2 = StoryboardScene.Message.instantiateMessagesList() +// You can instantiate scenes using the `controller` property: +let vc = StoryboardScene.Dependency.Dependent.controller // You can perform segues using: vc.performSegue(StoryboardSegue.Message.Embed) diff --git a/Documentation/storyboards/swift3.md b/Documentation/storyboards/swift3.md index a99a940..fa60ace 100644 --- a/Documentation/storyboards/swift3.md +++ b/Documentation/storyboards/swift3.md @@ -28,29 +28,19 @@ Note: the generated code may look differently depending on the platform the stor ```swift enum StoryboardScene { - enum Dependency: String, StoryboardSceneType { + enum Dependency: StoryboardType { static let storyboardName = "Dependency" - case dependentScene = "Dependent" - static func instantiateDependent() -> UIViewController { - return StoryboardScene.Dependency.dependentScene.viewController() - } + static let dependent = SceneType(storyboard: Dependency.self, identifier: "Dependent") } - enum Message: String, StoryboardSceneType { + enum Message: StoryboardType { static let storyboardName = "Message" - case messagesListScene = "MessagesList" - static func instantiateMessagesList() -> UITableViewController { - guard let vc = StoryboardScene.Message.messagesListScene.viewController() as? UITableViewController - else { - fatalError("ViewController 'MessagesList' is not of the expected class UITableViewController.") - } - return vc - } + static let messagesList = SceneType(storyboard: Message.self, identifier: "MessagesList") } } enum StoryboardSegue { - enum Message: String, StoryboardSegueType { + enum Message: String, SegueType { case embed case nonCustom } @@ -62,11 +52,8 @@ enum StoryboardSegue { ## Usage example ```swift -// You can instantiate scenes using the generic `viewController()` method: -let vc = StoryboardScene.Dependency.dependentScene.viewController() - -// or the `instantiate...()` method (which will cast to the correct type): -let vc2 = StoryboardScene.Message.instantiateMessagesList() +// You can instantiate scenes using the `controller` property: +let vc = StoryboardScene.Dependency.dependent.controller // You can perform segues using: vc.perform(segue: StoryboardSegue.Message.embed) diff --git a/templates/storyboards/swift2.stencil b/templates/storyboards/swift2.stencil index 1813735..328ce8f 100644 --- a/templates/storyboards/swift2.stencil +++ b/templates/storyboards/swift2.stencil @@ -1,6 +1,6 @@ // Generated using SwiftGen, by O.Halligon — https://github.com/SwiftGen/SwiftGen -{% if storyboards %} +{% if platform and storyboards %} {% set isAppKit %}{% if platform == "macOS" %}true{% endif %}{% endset %} {% set prefix %}{% if isAppKit %}NS{% else %}UI{% endif %}{% endset %} {% set controller %}{% if isAppKit %}Controller{% else %}ViewController{% endif %}{% endset %} @@ -99,6 +99,8 @@ enum {{param.segueEnumName|default:"StoryboardSegue"}} { // swiftlint:enable explicit_type_interface identifier_name line_length type_body_length type_name private final class BundleToken {} +{% elif storyboards %} +// Mixed AppKit and UIKit storyboard files found, please invoke swiftgen with these separately {% else %} // No storyboard found {% endif %} diff --git a/templates/storyboards/swift3.stencil b/templates/storyboards/swift3.stencil index b8e2bbb..6288d7f 100644 --- a/templates/storyboards/swift3.stencil +++ b/templates/storyboards/swift3.stencil @@ -1,6 +1,6 @@ // Generated using SwiftGen, by O.Halligon — https://github.com/SwiftGen/SwiftGen -{% if storyboards %} +{% if platform and storyboards %} {% set isAppKit %}{% if platform == "macOS" %}true{% endif %}{% endset %} {% set prefix %}{% if isAppKit %}NS{% else %}UI{% endif %}{% endset %} {% set controller %}{% if isAppKit %}Controller{% else %}ViewController{% endif %}{% endset %} @@ -99,6 +99,8 @@ enum {{param.segueEnumName|default:"StoryboardSegue"}} { // swiftlint:enable explicit_type_interface identifier_name line_length type_body_length type_name private final class BundleToken {} +{% elif storyboards %} +// Mixed AppKit and UIKit storyboard files found, please invoke swiftgen with these separately {% else %} // No storyboard found {% endif %} From 6b55ededd7d4b7b71bafa6be55ae44c6885c1823 Mon Sep 17 00:00:00 2001 From: Olivier Halligon Date: Fri, 7 Jul 2017 19:35:45 +0200 Subject: [PATCH 5/5] Nitpickings in storyboards template docs --- Documentation/storyboards/swift2.md | 3 ++- Documentation/storyboards/swift3.md | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Documentation/storyboards/swift2.md b/Documentation/storyboards/swift2.md index 768e96a..4df9258 100644 --- a/Documentation/storyboards/swift2.md +++ b/Documentation/storyboards/swift2.md @@ -10,7 +10,8 @@ ## When to use it - When you need to generate *Swift 2* code -- **Warning**: Swift 2 is no longer actively supported, so we cannot guarantee that there won't be issues with the generated code. +- The generated code supports both UIKit platforms (iOS, tvOS and watchOS) and AppKit platform (macOS) +- **Warning**: Swift 2 is no longer actively supported, so we won't maintain this template and don't unit-test the generated code for it anymore. ## Customization diff --git a/Documentation/storyboards/swift3.md b/Documentation/storyboards/swift3.md index fa60ace..fd3a27a 100644 --- a/Documentation/storyboards/swift3.md +++ b/Documentation/storyboards/swift3.md @@ -10,6 +10,7 @@ ## When to use it - When you need to generate *Swift 3* code +- The generated code supports both UIKit platforms (iOS, tvOS and watchOS) and AppKit platform (macOS) ## Customization