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)")
}