Swift 4 conversion via Xcode 9.2. PiperOrigin-RevId: 185923433
diff --git a/src/Tulsi.xcodeproj/project.pbxproj b/src/Tulsi.xcodeproj/project.pbxproj index b020758..669d5c7 100644 --- a/src/Tulsi.xcodeproj/project.pbxproj +++ b/src/Tulsi.xcodeproj/project.pbxproj
@@ -787,11 +787,11 @@ TargetAttributes = { 3D9926621C29F0A20094E098 = { CreatedOnToolsVersion = 7.2; - LastSwiftMigration = 0820; + LastSwiftMigration = 0920; }; 3D99266B1C29F0A20094E098 = { CreatedOnToolsVersion = 7.2; - LastSwiftMigration = 0820; + LastSwiftMigration = 0920; }; 3DAEE4621C85EB6100BA1C67 = { CreatedOnToolsVersion = 7.2.1; @@ -799,7 +799,7 @@ }; 8B8F55961BE3ECDC0095AF7F = { CreatedOnToolsVersion = 7.1; - LastSwiftMigration = 0820; + LastSwiftMigration = 0920; }; }; }; @@ -1196,6 +1196,8 @@ PRODUCT_BUNDLE_IDENTIFIER = "com.google.devinfra.${PRODUCT_NAME}"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 4.0; VERSIONING_SYSTEM = ""; }; name = Debug; @@ -1213,6 +1215,8 @@ PRODUCT_BUNDLE_IDENTIFIER = "com.google.devinfra.${PRODUCT_NAME}"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 4.0; VERSIONING_SYSTEM = ""; }; name = Release; @@ -1225,6 +1229,8 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.google.devinfra.${PRODUCT_NAME}"; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 4.0; }; name = Debug; }; @@ -1236,6 +1242,8 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.google.devinfra.${PRODUCT_NAME}"; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 4.0; }; name = Release; }; @@ -1249,6 +1257,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.google.Tulsi.TulsiGeneratorIntegrationTests; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SWIFT3_OBJC_INFERENCE = On; }; name = Debug; }; @@ -1262,6 +1271,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.google.Tulsi.TulsiGeneratorIntegrationTests; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SWIFT3_OBJC_INFERENCE = On; }; name = Release; }; @@ -1387,6 +1397,8 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.google.${PRODUCT_NAME}"; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 4.0; }; name = Debug; }; @@ -1399,6 +1411,8 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.google.${PRODUCT_NAME}"; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 4.0; }; name = Release; };
diff --git a/src/Tulsi/BazelSelectionPanel.swift b/src/Tulsi/BazelSelectionPanel.swift index 731a8a9..e188bc4 100644 --- a/src/Tulsi/BazelSelectionPanel.swift +++ b/src/Tulsi/BazelSelectionPanel.swift
@@ -34,28 +34,30 @@ panel.prompt = NSLocalizedString("ProjectEditor_SelectBazelPathPrompt", comment: "Label for the button used to confirm the selected Bazel file in the Bazel selector sheet.") - var views: NSArray = [] - Bundle.main.loadNibNamed("BazelOpenSheetAccessoryView", + var views: NSArray? + Bundle.main.loadNibNamed(NSNib.Name(rawValue: "BazelOpenSheetAccessoryView"), owner: panel, topLevelObjects: &views) // Note: topLevelObjects will contain the accessory view and an NSApplication object in a // non-deterministic order. - views = views.filter() { $0 is NSView } as NSArray - if let accessoryView = views.firstObject as? NSView { - panel.accessoryView = accessoryView - if #available(OSX 10.11, *) { - panel.isAccessoryViewDisclosed = true + if let views = views { + let viewsFound = views.filter() { $0 is NSView } as NSArray + if let accessoryView = viewsFound.firstObject as? NSView { + panel.accessoryView = accessoryView + if #available(OSX 10.11, *) { + panel.isAccessoryViewDisclosed = true + } + } else { + assertionFailure("Failed to load accessory view for Bazel open sheet.") } - } else { - assertionFailure("Failed to load accessory view for Bazel open sheet.") } panel.canChooseDirectories = false panel.canChooseFiles = true panel.directoryURL = document.bazelURL?.deletingLastPathComponent() panel.beginSheetModal(for: window) { value in - if value == NSFileHandlingPanelOKButton { + if value.rawValue == NSFileHandlingPanelOKButton { document.bazelURL = panel.url - if panel.bazelSelectorUseAsDefaultCheckbox.state == NSOnState { + if panel.bazelSelectorUseAsDefaultCheckbox.state == NSControl.StateValue.on { UserDefaults.standard.set(document.bazelURL!, forKey: BazelLocator.DefaultBazelURLKey) } } @@ -64,7 +66,7 @@ // spawns new sheet modals. panel.orderOut(panel) if let completionHandler = completionHandler { - completionHandler(value == NSFileHandlingPanelOKButton ? panel.url : nil) + completionHandler(value.rawValue == NSFileHandlingPanelOKButton ? panel.url : nil) } } return panel
diff --git a/src/Tulsi/ConfigEditorBuildTargetSelectorViewController.swift b/src/Tulsi/ConfigEditorBuildTargetSelectorViewController.swift index d63f196..840e2d7 100644 --- a/src/Tulsi/ConfigEditorBuildTargetSelectorViewController.swift +++ b/src/Tulsi/ConfigEditorBuildTargetSelectorViewController.swift
@@ -46,7 +46,7 @@ @IBOutlet weak var buildTargetTable: NSTableView! - dynamic let typeFilter: NSPredicate? = NSPredicate.init(format: "(SELF.type IN %@) OR (SELF.selected == TRUE)", + @objc dynamic let typeFilter: NSPredicate? = NSPredicate.init(format: "(SELF.type IN %@) OR (SELF.selected == TRUE)", argumentArray: [filteredFileTypes]) var selectedRuleInfoCount: Int = 0 { @@ -57,9 +57,9 @@ override var representedObject: Any? { didSet { - unbind("selectedRuleInfoCount") + NSObject.unbind(NSBindingName(rawValue: "selectedRuleInfoCount")) guard let document = representedObject as? TulsiGeneratorConfigDocument else { return } - bind("selectedRuleInfoCount", + bind(NSBindingName(rawValue: "selectedRuleInfoCount"), to: document, withKeyPath: "selectedRuleInfoCount", options: nil) @@ -67,14 +67,14 @@ } deinit { - unbind("selectedRuleInfoCount") + NSObject.unbind(NSBindingName(rawValue: "selectedRuleInfoCount")) } override func loadView() { super.loadView() - let typeColumn = buildTargetTable.tableColumn(withIdentifier: "Type")! - let labelColumn = buildTargetTable.tableColumn(withIdentifier: "Label")! + let typeColumn = buildTargetTable.tableColumn(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "Type"))! + let labelColumn = buildTargetTable.tableColumn(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "Label"))! buildTargetTable.sortDescriptors = [typeColumn.sortDescriptorPrototype!, labelColumn.sortDescriptorPrototype!] } @@ -88,6 +88,6 @@ } func wizardSubviewDidDeactivate() { - unbind("selectedRuleInfoCount") + NSObject.unbind(NSBindingName(rawValue: "selectedRuleInfoCount")) } }
diff --git a/src/Tulsi/ConfigEditorSourceFilterViewController.swift b/src/Tulsi/ConfigEditorSourceFilterViewController.swift index 03cef03..447e5a3 100644 --- a/src/Tulsi/ConfigEditorSourceFilterViewController.swift +++ b/src/Tulsi/ConfigEditorSourceFilterViewController.swift
@@ -20,30 +20,30 @@ /// Whether or not this specific node is set as recursive-enabled (rather than some child marking /// it as mixed state). - dynamic var explicitlyRecursive: Bool { - return recursive == NSOnState + @objc dynamic var explicitlyRecursive: Bool { + return recursive == NSControl.StateValue.on.rawValue } /// This node's recursive UI state (NSOnState/NSOffState/NSMixedState). - dynamic var recursive: Int { + @objc dynamic var recursive: Int { get { - guard let entry = entry as? UISourcePath else { return NSOffState } - if entry.recursive { return NSOnState } + guard let entry = entry as? UISourcePath else { return NSControl.StateValue.off.rawValue } + if entry.recursive { return NSControl.StateValue.on.rawValue } for child in children as! [SourcePathNode] { - if child.recursive != NSOffState { - return NSMixedState + if child.recursive != NSControl.StateValue.off.rawValue { + return NSControl.StateValue.mixed.rawValue } } - return NSOffState + return NSControl.StateValue.off.rawValue } set { // No work needs to be done for mixed state, as it does not affect the underlying values. - if newValue == NSMixedState { return } + if newValue == NSControl.StateValue.mixed.rawValue { return } guard let entry = entry as? UISourcePath else { return } - let enabled = newValue == NSOnState + let enabled = newValue == NSControl.StateValue.on.rawValue willChangeValue(forKey: "explicitlyRecursive") entry.recursive = enabled didChangeValue(forKey: "explicitlyRecursive") @@ -62,11 +62,11 @@ } } - dynamic var hasRecursiveEnabledParent: Bool = false { + @objc dynamic var hasRecursiveEnabledParent: Bool = false { willSet { // If this node is recursive its children will still have a recursive parent and there's no // need to update them. - if recursive == NSOnState || newValue == hasRecursiveEnabledParent { return } + if recursive == NSControl.StateValue.on.rawValue || newValue == hasRecursiveEnabledParent { return } setChildrenHaveRecursiveParent(newValue) } } @@ -74,8 +74,8 @@ // TODO(abaire): Use a custom control to override nextState: such that it's never set to mixed via user interaction. func validateRecursive(_ ioValue: AutoreleasingUnsafeMutablePointer<AnyObject?>) throws { if let value = ioValue.pointee as? NSNumber { - if value.intValue == NSMixedState { - ioValue.pointee = NSNumber(value: NSOnState as Int) + if value.intValue == NSControl.StateValue.mixed.rawValue { + ioValue.pointee = NSNumber(value: NSControl.StateValue.on.rawValue as Int) } } } @@ -88,7 +88,7 @@ // Children of a recursive-enabled node may not be recursive themselves (it's redundant and // potentially confusing). if newValue { - child.recursive = NSOffState + child.recursive = NSControl.StateValue.off.rawValue } } } @@ -98,12 +98,12 @@ // Controller for the view allowing users to select a subset of the source files to include in the // generated Xcode project. final class ConfigEditorSourceFilterViewController: NSViewController, WizardSubviewProtocol { - dynamic var sourceFilterContentArray: [SourcePathNode] = [] + @objc dynamic var sourceFilterContentArray: [SourcePathNode] = [] @IBOutlet weak var sourceFilterOutlineView: NSOutlineView! override func viewDidLoad() { super.viewDidLoad() - let sourceTargetColumn = sourceFilterOutlineView.tableColumn(withIdentifier: "sourceTargets")! + let sourceTargetColumn = sourceFilterOutlineView.tableColumn(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "sourceTargets"))! sourceFilterOutlineView.sortDescriptors = [sourceTargetColumn.sortDescriptorPrototype!] } @@ -150,7 +150,7 @@ node = newNode } node.entry = sourcePaths[i] - if node.recursive == NSOnState { + if node.recursive == NSControl.StateValue.on.rawValue { recursiveNodes.append(node) } }
diff --git a/src/Tulsi/ConfigEditorWizardViewController.swift b/src/Tulsi/ConfigEditorWizardViewController.swift index 45cc2be..c970059 100644 --- a/src/Tulsi/ConfigEditorWizardViewController.swift +++ b/src/Tulsi/ConfigEditorWizardViewController.swift
@@ -37,7 +37,7 @@ } override func prepare(for segue: NSStoryboardSegue, sender: Any?) { - if segue.identifier == "Embed Wizard PageController" { + if segue.identifier!.rawValue == "Embed Wizard PageController" { pageViewController = (segue.destinationController as! NSPageController) pageViewController.arrangedObjects = ConfigEditorWizardViewController.wizardPageIdentifiers pageViewController.delegate = self @@ -113,16 +113,16 @@ // MARK: - NSPageControllerDelegate - func pageController(_ pageController: NSPageController, identifierFor object: Any) -> String { - return object as! String + func pageController(_ pageController: NSPageController, identifierFor object: Any) -> NSPageController.ObjectIdentifier { + return NSPageController.ObjectIdentifier(rawValue: object as! String) } - func pageController(_ pageController: NSPageController, viewControllerForIdentifier identifier: String) -> NSViewController { - let vc = storyboard!.instantiateController(withIdentifier: identifier) as! NSViewController + func pageController(_ pageController: NSPageController, viewControllerForIdentifier identifier: NSPageController.ObjectIdentifier) -> NSViewController { + let vc = storyboard!.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier(rawValue: identifier.rawValue)) as! NSViewController // NSPageController doesn't appear to support Autolayout properly, so fall back to // autoresizingMask. - vc.view.autoresizingMask = [.viewWidthSizable, .viewHeightSizable] + vc.view.autoresizingMask = [NSView.AutoresizingMask.width, NSView.AutoresizingMask.height] return vc }
diff --git a/src/Tulsi/HeadlessXcodeProjectGenerator.swift b/src/Tulsi/HeadlessXcodeProjectGenerator.swift index 99d5be6..a912099 100644 --- a/src/Tulsi/HeadlessXcodeProjectGenerator.swift +++ b/src/Tulsi/HeadlessXcodeProjectGenerator.swift
@@ -46,7 +46,7 @@ let (projectURL, configURL, defaultOutputFolderURL) = try resolveConfigPath(configPath) - let documentController = NSDocumentController.shared() + let documentController = NSDocumentController.shared let doc: NSDocument do { doc = try documentController.makeDocument(withContentsOf: projectURL, @@ -119,7 +119,7 @@ print("Generated project at \(url.path)") if arguments.openXcodeOnSuccess { print("Opening generated project in Xcode") - NSWorkspace.shared().open(url) + NSWorkspace.shared.open(url) } case .failure: throw HeadlessModeError.generationFailed
diff --git a/src/Tulsi/MessageViewController.swift b/src/Tulsi/MessageViewController.swift index e411fd9..f4a3bbb 100644 --- a/src/Tulsi/MessageViewController.swift +++ b/src/Tulsi/MessageViewController.swift
@@ -22,7 +22,7 @@ super.viewDidEndLiveResize() // Give the delegate a chance to handle the resize now that the live operation is completed. - NotificationCenter.default.post(name: NSNotification.Name.NSTableViewColumnDidResize, + NotificationCenter.default.post(name: NSTableView.columnDidResizeNotification, object: self) } } @@ -38,7 +38,7 @@ // Display heights of each row in the message table. var rowHeights = [Int: CGFloat]() - dynamic var messageCount: Int = 0 { + @objc dynamic var messageCount: Int = 0 { didSet { // Assume that a reduction in the message count means all cached heights are invalid. if messageCount < oldValue { @@ -52,7 +52,7 @@ ValueTransformer.setValueTransformer(MessageTypeToImageValueTransformer(), forName: NSValueTransformerName(rawValue: "MessageTypeToImageValueTransformer")) super.loadView() - bind("messageCount", to: messageArrayController, withKeyPath: "arrangedObjects.@count", options: nil) + bind(NSBindingName(rawValue: "messageCount"), to: messageArrayController, withKeyPath: "arrangedObjects.@count", options: nil) } @IBAction func copy(_ sender: AnyObject?) { @@ -60,7 +60,7 @@ return } - let pasteboard = NSPasteboard.general() + let pasteboard = NSPasteboard.general pasteboard.clearContents() pasteboard.writeObjects(selectedItems) } @@ -103,7 +103,7 @@ } // Disable animation. NSAnimationContext.beginGrouping() - NSAnimationContext.current().duration = 0 + NSAnimationContext.current.duration = 0 rowHeights.removeAll(keepingCapacity: true) let numRows = (messageArrayController.arrangedObjects as AnyObject).count! let allRowsIndex = IndexSet(integersIn: 0..<numRows) @@ -153,11 +153,11 @@ switch messageType { case .info, .debug, .syslog: - return NSImage(named: "message_info") + return NSImage(named: NSImage.Name(rawValue: "message_info")) case .warning: - return NSImage(named: "message_warning") + return NSImage(named: NSImage.Name(rawValue: "message_warning")) case .error: - return NSImage(named: "message_error") + return NSImage(named: NSImage.Name(rawValue: "message_error")) } } }
diff --git a/src/Tulsi/NewGeneratorConfigViewController.swift b/src/Tulsi/NewGeneratorConfigViewController.swift index 5423d3e..ca0ec9d 100644 --- a/src/Tulsi/NewGeneratorConfigViewController.swift +++ b/src/Tulsi/NewGeneratorConfigViewController.swift
@@ -32,7 +32,7 @@ weak var delegate: NewGeneratorConfigViewControllerDelegate? - dynamic var configName: String? = nil + @objc dynamic var configName: String? = nil @IBAction func didClickCancelButton(_ sender: NSButton) { delegate?.viewController(self, didCompleteWithReason: .cancel)
diff --git a/src/Tulsi/NewProjectViewController.swift b/src/Tulsi/NewProjectViewController.swift index e173637..b0a1cf1 100644 --- a/src/Tulsi/NewProjectViewController.swift +++ b/src/Tulsi/NewProjectViewController.swift
@@ -29,8 +29,8 @@ case cancel, create } - dynamic var projectName: String? = nil - dynamic var workspacePath: URL? = nil + @objc dynamic var projectName: String? = nil + @objc dynamic var workspacePath: URL? = nil weak var delegate: NewProjectViewControllerDelegate? @@ -66,7 +66,7 @@ panel.canChooseDirectories = false panel.canChooseFiles = true panel.beginSheetModal(for: self.view.window!) { value in - if value == NSFileHandlingPanelOKButton { + if value.rawValue == NSFileHandlingPanelOKButton { self.workspacePath = panel.url } }
diff --git a/src/Tulsi/OptionsEditorController.swift b/src/Tulsi/OptionsEditorController.swift index ba9ae83..9c477aa 100644 --- a/src/Tulsi/OptionsEditorController.swift +++ b/src/Tulsi/OptionsEditorController.swift
@@ -90,7 +90,7 @@ backgroundColor.setFill() } - NSRectFill(dirtyRect) + dirtyRect.fill() } super.draw(dirtyRect) } @@ -121,7 +121,7 @@ /// View controller for the multiline popup editor displayed when a user double clicks an option. final class OptionsEditorPopoverViewController: NSViewController, NSTextFieldDelegate { - dynamic var value: String? = nil + @objc dynamic var value: String? = nil enum CloseReason { case cancel, accept @@ -205,7 +205,7 @@ // The table column used to display build target-specific build options. let targetValueColumn: NSTableColumn - dynamic var nodes = [OptionsEditorNode]() + @objc dynamic var nodes = [OptionsEditorNode]() weak var model: OptionsEditorModelProtocol? = nil { didSet { guard let model = model else { return } @@ -221,9 +221,9 @@ init(view: NSOutlineView, storyboard: NSStoryboard) { self.view = view self.storyboard = storyboard - defaultValueColumn = view.tableColumn(withIdentifier: OptionsEditorController.defaultColumnIdentifier)! - projectValueColumn = view.tableColumn(withIdentifier: OptionsEditorController.projectColumnIdentifier)! - targetValueColumn = view.tableColumn(withIdentifier: OptionsEditorController.targetColumnIdentifier)! + defaultValueColumn = view.tableColumn(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: OptionsEditorController.defaultColumnIdentifier))! + projectValueColumn = view.tableColumn(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: OptionsEditorController.projectColumnIdentifier))! + targetValueColumn = view.tableColumn(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: OptionsEditorController.targetColumnIdentifier))! super.init() self.view.delegate = self } @@ -288,8 +288,8 @@ let clickedColumn = editor.tableColumns[editor.clickedColumn] let columnIdentifier = clickedColumn.identifier - guard let optionLevel = OptionsEditorNode.OptionLevel(rawValue: columnIdentifier) else { - assert(columnIdentifier == OptionsEditorController.settingColumnIdentifier, + guard let optionLevel = OptionsEditorNode.OptionLevel(rawValue: columnIdentifier.rawValue) else { + assert(columnIdentifier.rawValue == OptionsEditorController.settingColumnIdentifier, "Mismatch in storyboard column identifier and OptionLevel enum") return } @@ -297,7 +297,7 @@ let optionNode = optionNodeForItem(optionItem as AnyObject, outlineView: editor) // Verify that the column is editable. - if OptionsEditorController.bindingsControlledColumns.contains(columnIdentifier) || + if OptionsEditorController.bindingsControlledColumns.contains(columnIdentifier.rawValue) || !optionNode.editableForOptionLevel(optionLevel) { return } @@ -309,7 +309,7 @@ popoverEditor = NSPopover() if popoverViewController == nil { - popoverViewController = storyboard.instantiateController(withIdentifier: "OptionsEditorPopover") as? OptionsEditorPopoverViewController + popoverViewController = storyboard.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier(rawValue: "OptionsEditorPopover")) as? OptionsEditorPopoverViewController } popoverEditor.contentViewController = popoverViewController popoverViewController.optionItem = optionItem as AnyObject? @@ -339,12 +339,12 @@ if tableColumn == nil { return nil } let identifier = tableColumn!.identifier - if OptionsEditorController.bindingsControlledColumns.contains(identifier) { - return outlineView.make(withIdentifier: identifier, owner: self) + if OptionsEditorController.bindingsControlledColumns.contains(identifier.rawValue) { + return outlineView.makeView(withIdentifier: identifier, owner: self) } let optionNode = optionNodeForItem(item as AnyObject, outlineView: outlineView) - let optionLevel = OptionsEditorNode.OptionLevel(rawValue: identifier)! + let optionLevel = OptionsEditorNode.OptionLevel(rawValue: identifier.rawValue)! let (displayItem, inherited) = optionNode.displayItemForOptionLevel(optionLevel) let explicit = !inherited let highlighted = explicit && optionLevel == optionNode.mostSpecializedOptionLevel @@ -353,7 +353,7 @@ let view: NSView? switch optionNode.valueType { case .string: - view = outlineView.make(withIdentifier: OptionsEditorController.tableCellViewIdentifier, + view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: OptionsEditorController.tableCellViewIdentifier), owner: self) if let tableCellView = view as? TextTableCellView { prepareTableCellView(tableCellView, @@ -373,7 +373,7 @@ else { identifier = OptionsEditorController.popUpButtonCellViewIdentifier } - view = outlineView.make(withIdentifier: identifier, owner: self) + view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: identifier), owner: self) if let tableCellView = view as? PopUpButtonTableCellView { preparePopUpButtonTableCellView(tableCellView, withMenuItems: optionNode.multiSelectItems, @@ -406,7 +406,7 @@ // MARK: - NSPopoverDelegate func popoverDidClose(_ notification: Notification) { - if notification.userInfo?[NSPopoverCloseReasonKey] as? String != NSPopoverCloseReasonStandard { + if notification.userInfo?[NSPopover.closeReasonUserInfoKey] as? String != NSPopover.CloseReason.standard.rawValue { return } @@ -431,7 +431,7 @@ let node = optionNodeForItem(item! as AnyObject, outlineView: view) let columnIndex = view.column(for: control) let columnIdentifier = view.tableColumns[columnIndex].identifier - let level = OptionsEditorNode.OptionLevel(rawValue: columnIdentifier)! + let level = OptionsEditorNode.OptionLevel(rawValue: columnIdentifier.rawValue)! return (node, level) } @@ -452,7 +452,7 @@ } let attributedValue = NSMutableAttributedString(string: value) - attributedValue.setAttributes([NSFontAttributeName: fontForOption(explicit)], + attributedValue.setAttributes([NSAttributedStringKey.font: fontForOption(explicit)], range: NSRange(location: 0, length: attributedValue.length)) textField.attributedStringValue = attributedValue }
diff --git a/src/Tulsi/OptionsEditorModelProtocol.swift b/src/Tulsi/OptionsEditorModelProtocol.swift index 36773f2..6ef02b3 100644 --- a/src/Tulsi/OptionsEditorModelProtocol.swift +++ b/src/Tulsi/OptionsEditorModelProtocol.swift
@@ -39,7 +39,7 @@ func parentOptionForOptionKey(_ key: TulsiOptionKey) -> TulsiOption? /// Notifies the receiver that a change has been made to an option. - func updateChangeCount(_ change: NSDocumentChangeType) + func updateChangeCount(_ change: NSDocument.ChangeType) } extension OptionsEditorModelProtocol {
diff --git a/src/Tulsi/OptionsEditorNode.swift b/src/Tulsi/OptionsEditorNode.swift index 540633b..4b16d49 100644 --- a/src/Tulsi/OptionsEditorNode.swift +++ b/src/Tulsi/OptionsEditorNode.swift
@@ -62,7 +62,7 @@ } /// This node's children. - var children = [OptionsEditorNode]() + @objc var children = [OptionsEditorNode]() func editableForOptionLevel(_ level: OptionLevel) -> Bool { assertionFailure("Must be overridden by subclasses")
diff --git a/src/Tulsi/OptionsEditorViewController.swift b/src/Tulsi/OptionsEditorViewController.swift index 155d58f..9e863fd 100644 --- a/src/Tulsi/OptionsEditorViewController.swift +++ b/src/Tulsi/OptionsEditorViewController.swift
@@ -22,8 +22,8 @@ @IBOutlet weak var targetSelectorView: NSOutlineView! @IBOutlet weak var optionEditorView: NSOutlineView! - dynamic var targetSelectorController: OptionsTargetSelectorController? = nil - dynamic var editorController: OptionsEditorController? = nil + @objc dynamic var targetSelectorController: OptionsTargetSelectorController? = nil + @objc dynamic var editorController: OptionsEditorController? = nil override var representedObject: Any? { didSet {
diff --git a/src/Tulsi/OptionsTargetSelectorController.swift b/src/Tulsi/OptionsTargetSelectorController.swift index 13d3e26..4685d40 100644 --- a/src/Tulsi/OptionsTargetSelectorController.swift +++ b/src/Tulsi/OptionsTargetSelectorController.swift
@@ -20,9 +20,9 @@ class OptionsTargetNode: UISelectableOutlineViewNode { /// Tooltip to be displayed for this node. - var toolTip: String? = nil + @objc var toolTip: String? = nil - var boldFont: Bool { + @objc var boldFont: Bool { return !children.isEmpty } } @@ -44,7 +44,7 @@ comment: "Short header shown before the build targets in the options editor's target selector.") weak var view: NSOutlineView! - dynamic var nodes = [OptionsTargetNode]() + @objc dynamic var nodes = [OptionsTargetNode]() weak var delegate: OptionsTargetSelectorControllerDelegate? weak var model: OptionsEditorModelProtocol! = nil {
diff --git a/src/Tulsi/ProjectEditorConfigManagerViewController.swift b/src/Tulsi/ProjectEditorConfigManagerViewController.swift index 243fb9a..b6b8704 100644 --- a/src/Tulsi/ProjectEditorConfigManagerViewController.swift +++ b/src/Tulsi/ProjectEditorConfigManagerViewController.swift
@@ -33,7 +33,7 @@ @IBOutlet var configArrayController: NSArrayController! @IBOutlet weak var addRemoveSegmentedControl: NSSegmentedControl! - dynamic var numBazelPackages: Int = 0 { + @objc dynamic var numBazelPackages: Int = 0 { didSet { let enableAddButton = numBazelPackages > 0 addRemoveSegmentedControl.setEnabled(enableAddButton, @@ -41,7 +41,7 @@ } } - dynamic var numSelectedConfigs: Int = 0 { + @objc dynamic var numSelectedConfigs: Int = 0 { didSet { addRemoveSegmentedControl.setEnabled(numSelectedConfigs > 0, forSegment: SegmentedControlButtonIndex.remove.rawValue) @@ -53,7 +53,7 @@ override var representedObject: Any? { didSet { if let concreteRepresentedObject = representedObject { - bind("numBazelPackages", + bind(NSBindingName(rawValue: "numBazelPackages"), to: concreteRepresentedObject, withKeyPath: "bazelPackages.@count", options: nil) @@ -62,15 +62,15 @@ } deinit { - unbind("numBazelPackages") - unbind("numSelectedConfigs") + NSObject.unbind(NSBindingName(rawValue: "numBazelPackages")) + NSObject.unbind(NSBindingName(rawValue: "numSelectedConfigs")) } override func loadView() { ValueTransformer.setValueTransformer(IsOneValueTransformer(), forName: NSValueTransformerName(rawValue: "IsOneValueTransformer")) super.loadView() - bind("numSelectedConfigs", + bind(NSBindingName(rawValue: "numSelectedConfigs"), to: configArrayController, withKeyPath: "selectedObjects.@count", options: nil) @@ -110,7 +110,7 @@ if let projectURL = projectURL { LogMessage.postInfo("Opening generated project in Xcode", context: projectDocument.projectName) - NSWorkspace.shared().open(projectURL) + NSWorkspace.shared.open(projectURL) } } } @@ -123,7 +123,7 @@ editConfigNamed(configName) } - func document(_ doc:NSDocument, didSave:Bool, contextInfo: UnsafeMutableRawPointer) { + @objc func document(_ doc:NSDocument, didSave:Bool, contextInfo: UnsafeMutableRawPointer) { if contextInfo == &ProjectEditorConfigManagerViewController.PostSaveContextAddConfig { if didSave { didClickAddConfig(nil) @@ -142,7 +142,7 @@ guard let bazelPackages = projectDocument.bazelPackages, !bazelPackages.isEmpty else { // This should be prevented by the UI, so spawn a bug message and beep. LogMessage.postInfo("Bug: Add config invoked on a project with no packages.") - NSBeep() + NSSound.beep() return }
diff --git a/src/Tulsi/ProjectEditorPackageManagerViewController.swift b/src/Tulsi/ProjectEditorPackageManagerViewController.swift index e6f328c..7f4dd2a 100644 --- a/src/Tulsi/ProjectEditorPackageManagerViewController.swift +++ b/src/Tulsi/ProjectEditorPackageManagerViewController.swift
@@ -31,7 +31,7 @@ var newProjectSheet: NewProjectViewController! = nil private var newProjectNeedsSaveAs = false - dynamic var numSelectedPackagePaths: Int = 0 { + @objc dynamic var numSelectedPackagePaths: Int = 0 { didSet { let enableRemoveButton = numSelectedPackagePaths > 0 addRemoveSegmentedControl.setEnabled(enableRemoveButton, @@ -40,14 +40,14 @@ } deinit { - unbind("numSelectedPackagePaths") + NSObject.unbind(NSBindingName(rawValue: "numSelectedPackagePaths")) } override func loadView() { ValueTransformer.setValueTransformer(PackagePathValueTransformer(), forName: NSValueTransformerName(rawValue: "PackagePathValueTransformer")) super.loadView() - bind("numSelectedPackagePaths", + bind(NSBindingName(rawValue: "numSelectedPackagePaths"), to: packageArrayController, withKeyPath: "selectedObjects.@count", options: nil) @@ -118,12 +118,12 @@ comment: "Label for the button used to confirm adding the selected BUILD file to the Tulsi project.") panel.canChooseDirectories = false panel.beginSheetModal(for: self.view.window!) { value in - if value == NSFileHandlingPanelOKButton { + if value.rawValue == NSFileHandlingPanelOKButton { guard let URL = panel.url else { return } if !document.addBUILDFileURL(URL) { - NSBeep() + NSSound.beep() } } } @@ -140,7 +140,7 @@ alert.addButton(withTitle: NSLocalizedString("ProjectEditor_CloseOpenedConfigDocumentsButtonCancel", comment: "Title for a button that will cancel an operation that requires that all opened TulsiGeneratorConfig documents be closed.")) alert.beginSheetModal(for: self.view.window!) { value in - if value == NSAlertFirstButtonReturn { + if value == NSApplication.ModalResponse.alertFirstButtonReturn { document.closeChildConfigDocuments() self.didClickRemoveSelectedBUILDFiles(sender) } @@ -166,7 +166,7 @@ let document = representedObject as! TulsiProjectDocument let buildFile = package + "/BUILD" if let url = document.workspaceRootURL?.appendingPathComponent(buildFile) { - NSWorkspace.shared().open(url) + NSWorkspace.shared.open(url) } }
diff --git a/src/Tulsi/SplashScreenWindowController.swift b/src/Tulsi/SplashScreenWindowController.swift index 7e4a3cf..ab7d2d5 100644 --- a/src/Tulsi/SplashScreenWindowController.swift +++ b/src/Tulsi/SplashScreenWindowController.swift
@@ -20,13 +20,13 @@ @IBOutlet weak var path: NSTextField! var url: URL? - override var nibName: String? { - return "SplashScreenRecentDocumentView" + override var nibName: NSNib.Name? { + return NSNib.Name(rawValue: "SplashScreenRecentDocumentView") } override func viewDidLoad() { guard let url = url else { return } - icon.image = NSWorkspace.shared().icon(forFile: url.path) + icon.image = NSWorkspace.shared.icon(forFile: url.path) filename.stringValue = (url.lastPathComponent as NSString).deletingPathExtension path.stringValue = ((url.path as NSString).deletingLastPathComponent as NSString).abbreviatingWithTildeInPath } @@ -37,17 +37,17 @@ @IBOutlet var recentDocumentsArrayController: NSArrayController! @IBOutlet weak var splashScreenImageView: NSImageView! - dynamic var applicationVersion: String = "" - dynamic var recentDocumentViewControllers = [SplashScreenRecentDocumentViewController]() + @objc dynamic var applicationVersion: String = "" + @objc dynamic var recentDocumentViewControllers = [SplashScreenRecentDocumentViewController]() - override var windowNibName: String? { - return "SplashScreenWindowController" + override var windowNibName: NSNib.Name? { + return NSNib.Name(rawValue: "SplashScreenWindowController") } override func windowDidLoad() { super.windowDidLoad() - splashScreenImageView.image = NSApplication.shared().applicationIconImage + splashScreenImageView.image = NSApplication.shared.applicationIconImage if let cfBundleVersion = Bundle.main.infoDictionary?["CFBundleVersion"] as? String { applicationVersion = cfBundleVersion @@ -57,7 +57,7 @@ } @IBAction func createNewDocument(_ sender: NSButton) { - let documentController = NSDocumentController.shared() + let documentController = NSDocumentController.shared do { try documentController.openUntitledDocumentAndDisplay(true) } catch let e as NSError { @@ -71,7 +71,7 @@ @IBAction func didDoubleClickRecentDocument(_ sender: NSTableView) { let clickedRow = sender.clickedRow guard clickedRow >= 0 else { return } - let documentController = NSDocumentController.shared() + let documentController = NSDocumentController.shared let viewController = recentDocumentViewControllers[clickedRow] guard let url = viewController.url else { return } @@ -92,7 +92,7 @@ private func getRecentDocumentViewControllers() -> [SplashScreenRecentDocumentViewController] { let projectExtension = TulsiProjectDocument.getTulsiBundleExtension() - let documentController = NSDocumentController.shared() + let documentController = NSDocumentController.shared var recentDocumentViewControllers = [SplashScreenRecentDocumentViewController]() var recentDocumentURLs = Set<URL>()
diff --git a/src/Tulsi/TulsiGeneratorConfigDocument.swift b/src/Tulsi/TulsiGeneratorConfigDocument.swift index 1c74293..2de2900 100644 --- a/src/Tulsi/TulsiGeneratorConfigDocument.swift +++ b/src/Tulsi/TulsiGeneratorConfigDocument.swift
@@ -50,7 +50,7 @@ weak var delegate: TulsiGeneratorConfigDocumentDelegate? = nil /// Whether or not the document is currently performing a long running operation. - dynamic var processing: Bool = false + @objc dynamic var processing: Bool = false // The number of tasks that need to complete before processing is finished. May only be mutated on // the main queue. @@ -62,7 +62,7 @@ } // The folder into which the generated Xcode project will be written. - dynamic var outputFolderURL: URL? = nil + @objc dynamic var outputFolderURL: URL? = nil /// The set of all RuleInfo instances from which the user can select build targets. // Maps the given RuleInfo instances to UIRuleInfo's, preserving this config's selections if @@ -89,7 +89,7 @@ } /// The UIRuleEntry instances that are acted on by the associated UI. - dynamic var uiRuleInfos = [UIRuleInfo]() { + @objc dynamic var uiRuleInfos = [UIRuleInfo]() { willSet { stopObservingRuleEntries() @@ -112,7 +112,7 @@ } /// The number of selected items in ruleEntries. - dynamic var selectedRuleInfoCount: Int = 0 { + @objc dynamic var selectedRuleInfoCount: Int = 0 { didSet { updateChangeCount(.changeDone) // TODO(abaire): Implement undo functionality. } @@ -176,7 +176,7 @@ additionalFilePaths: [String]? = nil, bazelURL: URL? = nil, name: String? = nil) throws -> TulsiGeneratorConfigDocument { - let documentController = NSDocumentController.shared() + let documentController = NSDocumentController.shared guard let doc = try documentController.makeUntitledDocument(ofType: TulsiGeneratorConfigDocument.FileType) as? TulsiGeneratorConfigDocument else { throw TulsiError(errorMessage: "Document for type \(TulsiGeneratorConfigDocument.FileType) was not the expected type.") } @@ -219,7 +219,7 @@ infoExtractor: TulsiProjectInfoExtractor, messageLog: MessageLogProtocol?, bazelURL: URL? = nil) throws -> TulsiGeneratorConfigDocument { - let documentController = NSDocumentController.shared() + let documentController = NSDocumentController.shared guard let doc = try documentController.makeDocument(withContentsOf: url, ofType: TulsiGeneratorConfigDocument.FileType) as? TulsiGeneratorConfigDocument else { throw TulsiError(errorMessage: "Document for type \(TulsiGeneratorConfigDocument.FileType) was not the expected type.") @@ -278,7 +278,7 @@ } deinit { - unbind("projectRuleEntries") + NSObject.unbind(NSBindingName(rawValue: "projectRuleEntries")) stopObservingRuleEntries() assert(saveCompletionHandler == nil) } @@ -296,8 +296,8 @@ } override func makeWindowControllers() { - let storyboard = NSStoryboard(name: "Main", bundle: nil) - let windowController = storyboard.instantiateController(withIdentifier: "TulsiGeneratorConfigDocumentWindow") as! NSWindowController + let storyboard = NSStoryboard(name: NSStoryboard.Name(rawValue: "Main"), bundle: nil) + let windowController = storyboard.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier(rawValue: "TulsiGeneratorConfigDocumentWindow")) as! NSWindowController windowController.contentViewController?.representedObject = self // TODO(abaire): Consider supporting restoration of config subwindows. windowController.window?.isRestorable = false @@ -337,7 +337,7 @@ override func save(to url: URL, ofType typeName: String, - for saveOperation: NSSaveOperationType, + for saveOperation: NSDocument.SaveOperationType, completionHandler: @escaping (Error?) -> Void) { var writeError: NSError? = nil do { @@ -408,7 +408,7 @@ } } - override class func autosavesInPlace() -> Bool { + override class var autosavesInPlace: Bool { // TODO(abaire): Enable autosave when undo behavior is implemented. return false }
diff --git a/src/Tulsi/TulsiProjectDocument.swift b/src/Tulsi/TulsiProjectDocument.swift index b6f7adb..9c23c39 100644 --- a/src/Tulsi/TulsiProjectDocument.swift +++ b/src/Tulsi/TulsiProjectDocument.swift
@@ -53,7 +53,7 @@ var project: TulsiProject! = nil /// Whether or not the document is currently performing a long running operation. - dynamic var processing: Bool = false + @objc dynamic var processing: Bool = false // The number of tasks that need to complete before processing is finished. May only be mutated on // the main queue. @@ -65,7 +65,7 @@ } /// The display names of generator configs associated with this project. - dynamic var generatorConfigNames = [String]() + @objc dynamic var generatorConfigNames = [String]() /// Whether or not there are any opened generator config documents associated with this project. var hasChildConfigDocuments: Bool { @@ -91,7 +91,7 @@ } /// The set of Bazel packages associated with this project. - dynamic var bazelPackages: [String]? { + @objc dynamic var bazelPackages: [String]? { set { project!.bazelPackages = newValue ?? [String]() updateChangeCount(.changeDone) // TODO(abaire): Implement undo functionality. @@ -103,7 +103,7 @@ } /// Location of the bazel binary. - dynamic var bazelURL: URL? { + @objc dynamic var bazelURL: URL? { set { project.bazelURL = newValue if newValue != nil && infoExtractor != nil { @@ -118,7 +118,7 @@ } /// Binding point for the directory containing the project's WORKSPACE file. - dynamic var workspaceRootURL: URL? { + @objc dynamic var workspaceRootURL: URL? { return project?.workspaceRootURL } @@ -131,7 +131,7 @@ private var logEventObserver: NSObjectProtocol! = nil /// Array of user-facing messages, generally output by the Tulsi generator. - dynamic var messages = [UIMessage]() + @objc dynamic var messages = [UIMessage]() lazy var bundleExtension: String = { TulsiProjectDocument.getTulsiBundleExtension() @@ -205,14 +205,14 @@ override func writeSafely(to url: URL, ofType typeName: String, - for saveOperation: NSSaveOperationType) throws { + for saveOperation: NSDocument.SaveOperationType) throws { // Ensure that the project's URL is set to the location in which this document is being saved so // that relative paths can be set properly. project.projectBundleURL = url try super.writeSafely(to: url, ofType: typeName, for: saveOperation) } - override class func autosavesInPlace() -> Bool { + override class var autosavesInPlace: Bool { return true } @@ -300,8 +300,8 @@ } override func makeWindowControllers() { - let storyboard = NSStoryboard(name: "Main", bundle: nil) - let windowController = storyboard.instantiateController(withIdentifier: "TulsiProjectDocumentWindow") as! NSWindowController + let storyboard = NSStoryboard(name: NSStoryboard.Name(rawValue: "Main"), bundle: nil) + let windowController = storyboard.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier(rawValue: "TulsiProjectDocumentWindow")) as! NSWindowController windowController.contentViewController?.representedObject = self addWindowController(windowController) } @@ -386,7 +386,7 @@ throw DocumentError.noSuchConfig } - let documentController = NSDocumentController.shared() + let documentController = NSDocumentController.shared if let configDocument = documentController.document(for: configURL) as? TulsiGeneratorConfigDocument { return configDocument } @@ -564,7 +564,7 @@ /// Convenience class for displaying an error message with an optional detail accessory view. class ErrorAlertView: NSAlert { - dynamic var text = "" + @objc dynamic var text = "" static func displayModalError(_ message: String, details: String? = nil) { let alert = ErrorAlertView() @@ -575,17 +575,19 @@ if let details = details { alert.text = details - var views: NSArray = [] - Bundle.main.loadNibNamed("ErrorAlertDetailView", + var views: NSArray? + Bundle.main.loadNibNamed(NSNib.Name(rawValue: "ErrorAlertDetailView"), owner: alert, topLevelObjects: &views) // Note: topLevelObjects will contain the accessory view and an NSApplication object in a // non-deterministic order. - views = views.filter() { $0 is NSView } as NSArray - if let accessoryView = views.firstObject as? NSScrollView { - alert.accessoryView = accessoryView - } else { - assertionFailure("Failed to load accessory view for error alert.") + if let views = views { + let viewsFound = views.filter() { $0 is NSView } as NSArray + if let accessoryView = viewsFound.firstObject as? NSScrollView { + alert.accessoryView = accessoryView + } else { + assertionFailure("Failed to load accessory view for error alert.") + } } } alert.runModal()
diff --git a/src/Tulsi/UIMessage.swift b/src/Tulsi/UIMessage.swift index 246f503..7e86679 100644 --- a/src/Tulsi/UIMessage.swift +++ b/src/Tulsi/UIMessage.swift
@@ -23,8 +23,8 @@ /// Models a single user-facing message. final class UIMessage: NSObject, NSPasteboardWriting { - dynamic let text: String - dynamic let messagePriority: TulsiGenerator.LogMessagePriority + @objc dynamic let text: String + @objc dynamic let messagePriority: TulsiGenerator.LogMessagePriority let timestamp = Date() init(text: String, type: TulsiGenerator.LogMessagePriority) { @@ -34,12 +34,12 @@ // MARK: - NSPasteboardWriting - func writableTypes(for pasteboard: NSPasteboard) -> [String] { - return [NSPasteboardTypeString] + func writableTypes(for pasteboard: NSPasteboard) -> [NSPasteboard.PasteboardType] { + return [NSPasteboard.PasteboardType.string] } - func pasteboardPropertyList(forType type: String) -> Any? { - if type == NSPasteboardTypeString { + func pasteboardPropertyList(forType type: NSPasteboard.PasteboardType) -> Any? { + if type == NSPasteboard.PasteboardType.string { let timeString = DateFormatter.localizedString(from: timestamp, dateStyle: .none, timeStyle: .medium)
diff --git a/src/Tulsi/UIRuleEntry.swift b/src/Tulsi/UIRuleEntry.swift index 18dc565..f93ebb2 100644 --- a/src/Tulsi/UIRuleEntry.swift +++ b/src/Tulsi/UIRuleEntry.swift
@@ -18,15 +18,15 @@ /// Wraps a TulsiGenerator::RuleInfo with functionality to allow it to track selection and be /// accessed via bindings in the UI. class UIRuleInfo: NSObject, Selectable { - dynamic var targetName: String? { + @objc dynamic var targetName: String? { return ruleInfo.label.targetName } - dynamic var type: String { + @objc dynamic var type: String { return ruleInfo.type } - dynamic var selected: Bool = false { + @objc dynamic var selected: Bool = false { didSet { if !selected { return } let linkedInfos = linkedRuleInfos.allObjects as! [UIRuleInfo]
diff --git a/src/Tulsi/UISelectableOutlineViewNode.swift b/src/Tulsi/UISelectableOutlineViewNode.swift index 2f46e58..3a4b1d5 100644 --- a/src/Tulsi/UISelectableOutlineViewNode.swift +++ b/src/Tulsi/UISelectableOutlineViewNode.swift
@@ -23,19 +23,19 @@ class UISelectableOutlineViewNode: NSObject { /// The display name for this node. - let name: String + @objc let name: String /// The object contained by this node (only valid for leaf nodes). var entry: Selectable? { didSet { if let entry = entry { - state = entry.selected ? NSOnState : NSOffState + state = entry.selected ? NSControl.StateValue.on.rawValue : NSControl.StateValue.off.rawValue } } } /// This node's children. - var children: [UISelectableOutlineViewNode] { + @objc var children: [UISelectableOutlineViewNode] { return _children } private var _children = [UISelectableOutlineViewNode]() @@ -44,29 +44,29 @@ weak var parent: UISelectableOutlineViewNode? /// This node's checkbox state in the UI (NSOnState/NSOffState/NSMixedState) - dynamic var state: Int { + @objc dynamic var state: Int { get { if children.isEmpty { - return (entry?.selected ?? false) ? NSOnState : NSOffState + return (entry?.selected ?? false) ? NSControl.StateValue.on.rawValue : NSControl.StateValue.off.rawValue } var stateIsValid = false - var state = NSOffState + var state = NSControl.StateValue.off for node in children { if !stateIsValid { - state = node.state + state = NSControl.StateValue(rawValue: node.state) stateIsValid = true continue } - if state != node.state { - return NSMixedState + if state.rawValue != node.state { + return NSControl.StateValue.mixed.rawValue } } - return state + return state.rawValue } set { - let newSelectionState = (newValue == NSOnState) + let newSelectionState = (newValue == NSControl.StateValue.on.rawValue) let selected = entry?.selected if selected == newSelectionState { return @@ -105,8 +105,8 @@ // TODO(abaire): Use a custom control to override nextState: such that it's never set to mixed via user interaction. func validateState(_ ioValue: AutoreleasingUnsafeMutablePointer<AnyObject?>) throws { if let value = ioValue.pointee as? NSNumber { - if value.intValue == NSMixedState { - ioValue.pointee = NSNumber(value: NSOnState as Int) + if value.intValue == NSControl.StateValue.mixed.rawValue { + ioValue.pointee = NSNumber(value: NSControl.StateValue.on.rawValue as Int) } } }
diff --git a/src/Tulsi/UISourcePath.swift b/src/Tulsi/UISourcePath.swift index f87c6da..b059c5a 100644 --- a/src/Tulsi/UISourcePath.swift +++ b/src/Tulsi/UISourcePath.swift
@@ -17,9 +17,9 @@ /// Models a path containing source files and a user selection state. class UISourcePath: NSObject, Selectable { - dynamic let path: String - dynamic var selected: Bool - dynamic var recursive: Bool + @objc dynamic let path: String + @objc dynamic var selected: Bool + @objc dynamic var recursive: Bool init(path: String, selected: Bool = false, recursive: Bool = false) { self.path = path
diff --git a/src/Tulsi/XcodeProjectGenerationProgressViewController.swift b/src/Tulsi/XcodeProjectGenerationProgressViewController.swift index 76f82e8..35424c9 100644 --- a/src/Tulsi/XcodeProjectGenerationProgressViewController.swift +++ b/src/Tulsi/XcodeProjectGenerationProgressViewController.swift
@@ -18,10 +18,10 @@ /// Models a Tulsi generator action whose progress should be monitored. class ProgressItem: NSObject { - dynamic let label: String - dynamic let maxValue: Int - dynamic var value: Int - dynamic var indeterminate: Bool + @objc dynamic let label: String + @objc dynamic let maxValue: Int + @objc dynamic var value: Int + @objc dynamic var indeterminate: Bool init(notifier: AnyObject?, values: [AnyHashable: Any]) { let taskName = values[ProgressUpdatingTaskName] as! String @@ -45,7 +45,7 @@ NotificationCenter.default.removeObserver(self) } - func progressUpdate(_ notification: Notification) { + @objc func progressUpdate(_ notification: Notification) { indeterminate = false if let newValue = notification.userInfo?[ProgressUpdatingTaskProgressValue] as? Int { value = newValue @@ -56,7 +56,7 @@ /// Handles generation of an Xcode project and displaying progress. class XcodeProjectGenerationProgressViewController: NSViewController { - dynamic var progressItems = [ProgressItem]() + @objc dynamic var progressItems = [ProgressItem]() weak var outputFolderOpenPanel: NSOpenPanel? = nil @@ -95,7 +95,7 @@ } } - func progressUpdatingTaskDidStart(_ notification: Notification) { + @objc func progressUpdatingTaskDidStart(_ notification: Notification) { guard let values = notification.userInfo else { assertionFailure("Progress task notification received without parameters.") return @@ -119,7 +119,7 @@ panel.canChooseFiles = false panel.beginSheetModal(for: view.window!) { let url: URL? - if $0 == NSFileHandlingPanelOKButton { + if $0.rawValue == NSFileHandlingPanelOKButton { url = panel.url } else { url = nil
diff --git a/src/Tulsi/main.swift b/src/Tulsi/main.swift index 557c66a..83cc439 100644 --- a/src/Tulsi/main.swift +++ b/src/Tulsi/main.swift
@@ -59,7 +59,7 @@ } catch HeadlessModeError.invalidBazelPath { print("The path to the bazel binary is invalid") exit(14) - } catch HeadlessModeError.generationFailed() { + } catch HeadlessModeError.generationFailed { print("Xcode project generation failed") exit(15) } catch HeadlessModeError.invalidWorkspaceRootOverride {
diff --git a/src/TulsiGenerator/BazelQueryInfoExtractor.swift b/src/TulsiGenerator/BazelQueryInfoExtractor.swift index 7e0a73d..5badd01 100644 --- a/src/TulsiGenerator/BazelQueryInfoExtractor.swift +++ b/src/TulsiGenerator/BazelQueryInfoExtractor.swift
@@ -253,7 +253,7 @@ private func extractRuleInfosWithRuleInputsFromBazelXMLOutput(_ bazelOutput: Data) -> [RuleInfo: Set<BuildLabel>]? { do { var infos = [RuleInfo: Set<BuildLabel>]() - let doc = try XMLDocument(data: bazelOutput, options: 0) + let doc = try XMLDocument(data: bazelOutput, options: XMLNode.Options(rawValue: 0)) let rules = try doc.nodes(forXPath: "/query/rule") for ruleNode in rules { guard let ruleElement = ruleNode as? XMLElement else { @@ -320,7 +320,7 @@ private func extractSourceFileLabelsFromBazelXMLOutput(_ bazelOutput: Data) -> Set<BuildLabel>? { do { - let doc = try XMLDocument(data: bazelOutput, options: 0) + let doc = try XMLDocument(data: bazelOutput, options: XMLNode.Options(rawValue: 0)) let fileLabels = try doc.nodes(forXPath: "/query/source-file/@name") var extractedLabels = Set<BuildLabel>() for labelNode in fileLabels {
diff --git a/src/TulsiGenerator/PBXObjects.swift b/src/TulsiGenerator/PBXObjects.swift index 1fbec9d..acb2721 100644 --- a/src/TulsiGenerator/PBXObjects.swift +++ b/src/TulsiGenerator/PBXObjects.swift
@@ -1092,7 +1092,7 @@ var targetByName = [String: PBXTarget]() /// List of all targets. - var allTargets: LazyMapCollection<Dictionary<String, PBXTarget>, PBXTarget> { + var allTargets: Dictionary<String, PBXTarget>.Values { return targetByName.values }
diff --git a/src/TulsiGenerator/RuleEntry.swift b/src/TulsiGenerator/RuleEntry.swift index 1f67449..2b1f87e 100644 --- a/src/TulsiGenerator/RuleEntry.swift +++ b/src/TulsiGenerator/RuleEntry.swift
@@ -28,7 +28,7 @@ } public var debugDescription: String { - return "\(type(of: self))(\(label) \(type))" + return "\(Swift.type(of: self))(\(label) \(type))" } init(label: BuildLabel, type: String, linkedTargetLabels: Set<BuildLabel>) { @@ -38,7 +38,7 @@ } func equals(_ other: RuleInfo) -> Bool { - guard type(of: self) == type(of: other) else { + guard Swift.type(of: self) == Swift.type(of: other) else { return false } return self.type == other.type && self.label == other.label @@ -295,7 +295,7 @@ if let productType = self.productType { return productType } - return BuildTypeToTargetType[self.type] + return RuleEntry.BuildTypeToTargetType[self.type] }() /// Returns the value to be used as the Xcode SDKROOT for the build target generated for this
diff --git a/src/TulsiGenerator/XcodeProjectGenerator.swift b/src/TulsiGenerator/XcodeProjectGenerator.swift index 27582eb..b098229 100644 --- a/src/TulsiGenerator/XcodeProjectGenerator.swift +++ b/src/TulsiGenerator/XcodeProjectGenerator.swift
@@ -298,8 +298,8 @@ cachedDefaultSwiftVersion = XcodeProjectGenerator.DefaultSwiftVersion return XcodeProjectGenerator.DefaultSwiftVersion } - cachedDefaultSwiftVersion = stdout.substring(with: match.rangeAt(1)) - return stdout.substring(with: match.rangeAt(1)) + cachedDefaultSwiftVersion = stdout.substring(with: match.range(at: 1)) + return stdout.substring(with: match.range(at: 1)) } /// Encapsulates information about the results of a buildXcodeProjectWithMainGroup invocation. @@ -712,7 +712,7 @@ let xmlDocument = scheme.toXML() - let data = xmlDocument.xmlData(withOptions: Int(XMLNode.Options.nodePrettyPrint.rawValue)) + let data = xmlDocument.xmlData(options: XMLNode.Options(rawValue: XMLNode.Options.RawValue(Int(XMLNode.Options.nodePrettyPrint.rawValue)))) try writeDataHandler(url, data) } @@ -794,7 +794,7 @@ let xmlDocument = scheme.toXML() - let data = xmlDocument.xmlData(withOptions: Int(XMLNode.Options.nodePrettyPrint.rawValue)) + let data = xmlDocument.xmlData(options: XMLNode.Options(rawValue: XMLNode.Options.RawValue(Int(XMLNode.Options.nodePrettyPrint.rawValue)))) try writeDataHandler(url, data) }
diff --git a/src/TulsiGeneratorTests/XcodeProjectGeneratorTests.swift b/src/TulsiGeneratorTests/XcodeProjectGeneratorTests.swift index 9854523..0421e70 100644 --- a/src/TulsiGeneratorTests/XcodeProjectGeneratorTests.swift +++ b/src/TulsiGeneratorTests/XcodeProjectGeneratorTests.swift
@@ -92,7 +92,7 @@ extensionType: String? = nil, productType: PBXTarget.ProductType? = nil) -> BuildLabel { let label = BuildLabel(labelName) - mockExtractor.labelToRuleEntry[label] = type(of: self).makeRuleEntry(label, + mockExtractor.labelToRuleEntry[label] = Swift.type(of: self).makeRuleEntry(label, type: type, attributes: attributes, weakDependencies: weakDependencies, @@ -186,7 +186,7 @@ weakDependencies: Set<BuildLabel>? = nil, productType: PBXTarget.ProductType? = nil) -> BuildLabel { let label = BuildLabel(labelName) - mockExtractor.labelToRuleEntry[label] = type(of: self).makeRuleEntry(label, + mockExtractor.labelToRuleEntry[label] = Swift.type(of: self).makeRuleEntry(label, type: type, attributes: attributes, weakDependencies: weakDependencies, @@ -363,7 +363,7 @@ override func createDirectory(at url: URL, withIntermediateDirectories createIntermediates: Bool, - attributes: [String:Any]?) throws { + attributes: [FileAttributeKey:Any]?) throws { if allowedDirectoryCreates.contains(url.path) { return } throw NSError(domain: "MockFileManager: Directory creation disallowed", code: 0, @@ -372,7 +372,7 @@ override func createDirectory(atPath path: String, withIntermediateDirectories createIntermediates: Bool, - attributes: [String:Any]?) throws { + attributes: [FileAttributeKey:Any]?) throws { if allowedDirectoryCreates.contains(path) { return } throw NSError(domain: "MockFileManager: Directory creation disallowed", code: 0, @@ -399,7 +399,7 @@ return mockContent[path] } - override func createFile(atPath path: String, contents data: Data?, attributes attr: [String : Any]? = nil) -> Bool { + override func createFile(atPath path: String, contents data: Data?, attributes attr: [FileAttributeKey : Any]? = nil) -> Bool { if writeOperations.keys.contains(path) { fatalError("Attempting to overwrite an existing file at \(path)") }