diff --git a/EditorExtension/AcceptPromptToCodeCommand.swift b/EditorExtension/AcceptPromptToCodeCommand.swift
deleted file mode 100644
index 51bea4a..0000000
--- a/EditorExtension/AcceptPromptToCodeCommand.swift
+++ /dev/null
@@ -1,31 +0,0 @@
-import Client
-import Foundation
-import SuggestionBasic
-import XcodeKit
-
-class AcceptPromptToCodeCommand: NSObject, XCSourceEditorCommand, CommandType {
- var name: String { "Accept Prompt to Code" }
-
- func perform(
- with invocation: XCSourceEditorCommandInvocation,
- completionHandler: @escaping (Error?) -> Void
- ) {
- Task {
- do {
- try await (Task(timeout: 7) {
- let service = try getService()
- if let content = try await service.getPromptToCodeAcceptedCode(
- editorContent: .init(invocation)
- ) {
- invocation.accept(content)
- }
- completionHandler(nil)
- }.value)
- } catch is CancellationError {
- completionHandler(nil)
- } catch {
- completionHandler(error)
- }
- }
- }
-}
diff --git a/EditorExtension/AcceptSuggestionCommand.swift b/EditorExtension/AcceptSuggestionCommand.swift
deleted file mode 100644
index a1ea71f..0000000
--- a/EditorExtension/AcceptSuggestionCommand.swift
+++ /dev/null
@@ -1,33 +0,0 @@
-import Client
-import SuggestionBasic
-import Foundation
-import XcodeKit
-import XPCShared
-
-class AcceptSuggestionCommand: NSObject, XCSourceEditorCommand, CommandType {
- var name: String { "Accept Suggestion" }
-
- func perform(
- with invocation: XCSourceEditorCommandInvocation,
- completionHandler: @escaping (Error?) -> Void
- ) {
- Task {
- do {
- try await (Task(timeout: 7) {
- let service = try getService()
- if let content = try await service.getSuggestionAcceptedCode(
- editorContent: .init(invocation)
- ) {
- invocation.accept(content)
- }
- completionHandler(nil)
- }.value)
- } catch is CancellationError {
- completionHandler(nil)
- } catch {
- completionHandler(error)
- }
- }
- }
-}
-
diff --git a/EditorExtension/CloseIdleTabsCommand.swift b/EditorExtension/CloseIdleTabsCommand.swift
deleted file mode 100644
index 0e9537e..0000000
--- a/EditorExtension/CloseIdleTabsCommand.swift
+++ /dev/null
@@ -1,20 +0,0 @@
-import Client
-import Foundation
-import SuggestionBasic
-import XcodeKit
-
-class CloseIdleTabsCommand: NSObject, XCSourceEditorCommand, CommandType {
- var name: String { "Close Idle Tabs" }
-
- func perform(
- with invocation: XCSourceEditorCommandInvocation,
- completionHandler: @escaping (Error?) -> Void
- ) {
- completionHandler(nil)
- Task {
- let service = try getService()
- _ = try await service.postNotification(name: "CloseIdleTabsOfXcodeWindow")
- }
- }
-}
-
diff --git a/EditorExtension/CustomCommand.swift b/EditorExtension/CustomCommand.swift
deleted file mode 100644
index 0a43a51..0000000
--- a/EditorExtension/CustomCommand.swift
+++ /dev/null
@@ -1,23 +0,0 @@
-import Client
-import Foundation
-import SuggestionBasic
-import XcodeKit
-
-class CustomCommand: NSObject, XCSourceEditorCommand, CommandType {
- var name: String = ""
-
- func perform(
- with invocation: XCSourceEditorCommandInvocation,
- completionHandler: @escaping (Error?) -> Void
- ) {
- completionHandler(nil)
- Task {
- let service = try getService()
- _ = try await service.customCommand(
- id: customCommandMap[invocation.commandIdentifier] ?? "",
- editorContent: .init(invocation)
- )
- }
- }
-}
-
diff --git a/EditorExtension/EditorExtension.entitlements b/EditorExtension/EditorExtension.entitlements
deleted file mode 100644
index 776babc..0000000
--- a/EditorExtension/EditorExtension.entitlements
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
- com.apple.security.app-sandbox
-
- com.apple.security.application-groups
-
- $(TeamIdentifierPrefix)group.$(BUNDLE_IDENTIFIER_BASE)
-
- com.apple.security.temporary-exception.mach-lookup.global-name
-
- $(BUNDLE_IDENTIFIER_BASE).CommunicationBridge
- $(BUNDLE_IDENTIFIER_BASE).ExtensionService
-
-
-
diff --git a/EditorExtension/GetSuggestionsCommand.swift b/EditorExtension/GetSuggestionsCommand.swift
deleted file mode 100644
index 6be1c41..0000000
--- a/EditorExtension/GetSuggestionsCommand.swift
+++ /dev/null
@@ -1,20 +0,0 @@
-import Client
-import Foundation
-import SuggestionBasic
-import XcodeKit
-
-class GetSuggestionsCommand: NSObject, XCSourceEditorCommand, CommandType {
- var name: String { "Get Suggestions" }
-
- func perform(
- with invocation: XCSourceEditorCommandInvocation,
- completionHandler: @escaping (Error?) -> Void
- ) {
- completionHandler(nil)
- Task {
- let service = try getService()
- _ = try await service.getSuggestedCode(editorContent: .init(invocation))
- }
- }
-}
-
diff --git a/EditorExtension/Helpers.swift b/EditorExtension/Helpers.swift
deleted file mode 100644
index 8851c27..0000000
--- a/EditorExtension/Helpers.swift
+++ /dev/null
@@ -1,98 +0,0 @@
-import SuggestionBasic
-import Foundation
-import XcodeKit
-import XPCShared
-
-extension XCSourceEditorCommandInvocation {
- func mutateCompleteBuffer(modifications: [Modification], restoringSelections restore: Bool) {
- if restore {
- let selectionsRangesToRestore = buffer.selections
- .compactMap { $0 as? XCSourceTextRange }
- buffer.selections.removeAllObjects()
- buffer.lines.apply(modifications)
- for range in selectionsRangesToRestore {
- buffer.selections.add(range)
- }
- } else {
- buffer.lines.apply(modifications)
- }
- }
-
- func accept(_ updatedContent: UpdatedContent) {
- if let newSelection = updatedContent.newSelection {
- mutateCompleteBuffer(
- modifications: updatedContent.modifications,
- restoringSelections: false
- )
- buffer.selections.removeAllObjects()
- buffer.selections.add(XCSourceTextRange(
- start: .init(line: newSelection.start.line, column: newSelection.start.character),
- end: .init(line: newSelection.end.line, column: newSelection.end.character)
- ))
- } else {
- mutateCompleteBuffer(
- modifications: updatedContent.modifications,
- restoringSelections: true
- )
- }
- }
-}
-
-extension EditorContent {
- init(_ invocation: XCSourceEditorCommandInvocation) {
- let buffer = invocation.buffer
- self.init(
- content: buffer.completeBuffer,
- lines: buffer.lines as? [String] ?? [],
- uti: buffer.contentUTI,
- cursorPosition: ((buffer.selections.lastObject as? XCSourceTextRange)?.end).map {
- CursorPosition(line: $0.line, character: $0.column)
- } ?? CursorPosition(line: 0, character: 0),
- cursorOffset: -1,
- selections: buffer.selections.map {
- let sl = ($0 as? XCSourceTextRange)?.start.line ?? 0
- let sc = ($0 as? XCSourceTextRange)?.start.column ?? 0
- let el = ($0 as? XCSourceTextRange)?.end.line ?? 0
- let ec = ($0 as? XCSourceTextRange)?.end.column ?? 0
-
- return Selection(
- start: CursorPosition( line: sl, character: sc ),
- end: CursorPosition( line: el, character: ec )
- )
- },
- tabSize: buffer.tabWidth,
- indentSize: buffer.indentationWidth,
- usesTabsForIndentation: buffer.usesTabsForIndentation
- )
- }
-}
-
-/// https://gist.github.com/swhitty/9be89dfe97dbb55c6ef0f916273bbb97
-extension Task where Failure == Error {
- // Start a new Task with a timeout. If the timeout expires before the operation is
- // completed then the task is cancelled and an error is thrown.
- init(
- priority: TaskPriority? = nil,
- timeout: TimeInterval,
- operation: @escaping @Sendable () async throws -> Success
- ) {
- self = Task(priority: priority) {
- try await withThrowingTaskGroup(of: Success.self) { group -> Success in
- group.addTask(operation: operation)
- group.addTask {
- try await _Concurrency.Task.sleep(nanoseconds: UInt64(timeout * 1_000_000_000))
- throw TimeoutError()
- }
- guard let success = try await group.next() else {
- throw _Concurrency.CancellationError()
- }
- group.cancelAll()
- return success
- }
- }
- }
-}
-
-private struct TimeoutError: LocalizedError {
- var errorDescription: String? = "Task timed out before completion"
-}
diff --git a/EditorExtension/Info.plist b/EditorExtension/Info.plist
deleted file mode 100644
index 13a9bdb..0000000
--- a/EditorExtension/Info.plist
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
-
-
- APPLICATION_SUPPORT_FOLDER
- $(APPLICATION_SUPPORT_FOLDER)
- BUNDLE_IDENTIFIER_BASE
- $(BUNDLE_IDENTIFIER_BASE)
- CFBundleDevelopmentRegion
- $(DEVELOPMENT_LANGUAGE)
- CFBundleDisplayName
- $(EXTENSION_BUNDLE_DISPLAY_NAME)
- CFBundleExecutable
- $(EXECUTABLE_NAME)
- CFBundleIdentifier
- $(PRODUCT_BUNDLE_IDENTIFIER)
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- $(EXTENSION_BUNDLE_NAME)
- CFBundlePackageType
- $(PRODUCT_BUNDLE_PACKAGE_TYPE)
- CFBundleShortVersionString
- $(MARKETING_VERSION)
- CFBundleVersion
- $(CURRENT_PROJECT_VERSION)
- HOST_APP_NAME
- $(HOST_APP_NAME)
- NSExtension
-
- NSExtensionAttributes
-
- XCSourceEditorCommandDefinitions
-
- XCSourceEditorExtensionPrincipalClass
- $(PRODUCT_MODULE_NAME).SourceEditorExtension
-
- NSExtensionPointIdentifier
- com.apple.dt.Xcode.extension.source-editor
-
- NSHumanReadableCopyright
-
- TEAM_ID_PREFIX
- $(TeamIdentifierPrefix)
- STANDARD_TELEMETRY_CHANNEL_KEY
- $(STANDARD_TELEMETRY_CHANNEL_KEY)
-
-
diff --git a/EditorExtension/NextSuggestionCommand.swift b/EditorExtension/NextSuggestionCommand.swift
deleted file mode 100644
index f07f401..0000000
--- a/EditorExtension/NextSuggestionCommand.swift
+++ /dev/null
@@ -1,20 +0,0 @@
-import Client
-import Foundation
-import SuggestionBasic
-import XcodeKit
-
-class NextSuggestionCommand: NSObject, XCSourceEditorCommand, CommandType {
- var name: String { "Next Suggestion" }
-
- func perform(
- with invocation: XCSourceEditorCommandInvocation,
- completionHandler: @escaping (Error?) -> Void
- ) {
- completionHandler(nil)
- Task {
- let service = try getService()
- _ = try await service.getNextSuggestedCode(editorContent: .init(invocation))
- }
- }
-}
-
diff --git a/EditorExtension/OpenChat.swift b/EditorExtension/OpenChat.swift
deleted file mode 100644
index fccdc3f..0000000
--- a/EditorExtension/OpenChat.swift
+++ /dev/null
@@ -1,19 +0,0 @@
-import Client
-import SuggestionBasic
-import Foundation
-import XcodeKit
-
-class OpenChatCommand: NSObject, XCSourceEditorCommand, CommandType {
- var name: String { "Open Chat" }
-
- func perform(
- with invocation: XCSourceEditorCommandInvocation,
- completionHandler: @escaping (Error?) -> Void
- ) {
- completionHandler(nil)
- Task {
- let service = try getService()
- _ = try await service.openChat(editorContent: .init(invocation))
- }
- }
-}
diff --git a/EditorExtension/OpenSettingsCommand.swift b/EditorExtension/OpenSettingsCommand.swift
deleted file mode 100644
index 2350171..0000000
--- a/EditorExtension/OpenSettingsCommand.swift
+++ /dev/null
@@ -1,68 +0,0 @@
-//
-// OpenSettingsCommand.swift
-// EditorExtension
-//
-// Opens the settings app
-//
-
-import Foundation
-import XcodeKit
-
-enum GitHubCopilotForXcodeSettingsLaunchError: Error, LocalizedError {
- case appNotFound
- case openFailed(exitCode: Int32)
-
- var errorDescription: String? {
- switch self {
- case .appNotFound:
- return "\(hostAppName()) settings application not found"
- case let .openFailed(exitCode):
- return "Failed to launch \(hostAppName()) settings (exit code \(exitCode))"
- }
- }
-}
-
-class OpenSettingsCommand: NSObject, XCSourceEditorCommand, CommandType {
- var name: String { "Open \(hostAppName()) Settings" }
-
- func perform(
- with invocation: XCSourceEditorCommandInvocation,
- completionHandler: @escaping (Error?) -> Void
- ) {
- Task {
- if let appPath = locateHostBundleURL(url: Bundle.main.bundleURL)?.absoluteString {
- let task = Process()
- task.launchPath = "/usr/bin/open"
- task.arguments = [appPath]
- task.launch()
- task.waitUntilExit()
- if task.terminationStatus == 0 {
- completionHandler(nil)
- } else {
- completionHandler(GitHubCopilotForXcodeSettingsLaunchError.openFailed(exitCode: task.terminationStatus))
- }
- } else {
- completionHandler(GitHubCopilotForXcodeSettingsLaunchError.appNotFound)
- }
- }
- }
-
- func locateHostBundleURL(url: URL) -> URL? {
- var nextURL = url
- while nextURL.path != "/" {
- nextURL = nextURL.deletingLastPathComponent()
- if nextURL.lastPathComponent.hasSuffix(".app") {
- return nextURL
- }
- }
- let devAppURL = url
- .deletingLastPathComponent()
- .appendingPathComponent("GitHub Copilot for Xcode Dev.app")
- return devAppURL
- }
-}
-
-func hostAppName() -> String {
- return Bundle.main.object(forInfoDictionaryKey: "HOST_APP_NAME") as? String
- ?? "GitHub Copilot for Xcode"
-}
diff --git a/EditorExtension/PrefetchSuggestionsCommand.swift b/EditorExtension/PrefetchSuggestionsCommand.swift
deleted file mode 100644
index bc43c40..0000000
--- a/EditorExtension/PrefetchSuggestionsCommand.swift
+++ /dev/null
@@ -1,19 +0,0 @@
-import Client
-import SuggestionBasic
-import Foundation
-import XcodeKit
-
-class PrefetchSuggestionsCommand: NSObject, XCSourceEditorCommand, CommandType {
- var name: String { "Prefetch Suggestions" }
-
- func perform(
- with invocation: XCSourceEditorCommandInvocation,
- completionHandler: @escaping (Error?) -> Void
- ) {
- completionHandler(nil)
- Task {
- let service = try getService()
- await service.prefetchRealtimeSuggestions(editorContent: .init(invocation))
- }
- }
-}
diff --git a/EditorExtension/PreviousSuggestionCommand.swift b/EditorExtension/PreviousSuggestionCommand.swift
deleted file mode 100644
index 61894ba..0000000
--- a/EditorExtension/PreviousSuggestionCommand.swift
+++ /dev/null
@@ -1,20 +0,0 @@
-import Client
-import Foundation
-import SuggestionBasic
-import XcodeKit
-
-class PreviousSuggestionCommand: NSObject, XCSourceEditorCommand, CommandType {
- var name: String { "Previous Suggestion" }
-
- func perform(
- with invocation: XCSourceEditorCommandInvocation,
- completionHandler: @escaping (Error?) -> Void
- ) {
- completionHandler(nil)
- Task {
- let service = try getService()
- _ = try await service.getPreviousSuggestedCode(editorContent: .init(invocation))
- }
- }
-}
-
diff --git a/EditorExtension/PromptToCodeCommand.swift b/EditorExtension/PromptToCodeCommand.swift
deleted file mode 100644
index 13e4f3b..0000000
--- a/EditorExtension/PromptToCodeCommand.swift
+++ /dev/null
@@ -1,19 +0,0 @@
-import Client
-import SuggestionBasic
-import Foundation
-import XcodeKit
-
-class PromptToCodeCommand: NSObject, XCSourceEditorCommand, CommandType {
- var name: String { "Prompt to Code" }
-
- func perform(
- with invocation: XCSourceEditorCommandInvocation,
- completionHandler: @escaping (Error?) -> Void
- ) {
- completionHandler(nil)
- Task {
- let service = try getService()
- _ = try await service.promptToCode(editorContent: .init(invocation))
- }
- }
-}
diff --git a/EditorExtension/RejectSuggestionCommand.swift b/EditorExtension/RejectSuggestionCommand.swift
deleted file mode 100644
index d109123..0000000
--- a/EditorExtension/RejectSuggestionCommand.swift
+++ /dev/null
@@ -1,20 +0,0 @@
-import Client
-import Foundation
-import SuggestionBasic
-import XcodeKit
-
-class RejectSuggestionCommand: NSObject, XCSourceEditorCommand, CommandType {
- var name: String { "Decline Suggestion" }
-
- func perform(
- with invocation: XCSourceEditorCommandInvocation,
- completionHandler: @escaping (Error?) -> Void
- ) {
- completionHandler(nil)
- Task {
- let service = try getService()
- _ = try await service.getSuggestionRejectedCode(editorContent: .init(invocation))
- }
- }
-}
-
diff --git a/EditorExtension/SeparatorCommand.swift b/EditorExtension/SeparatorCommand.swift
deleted file mode 100644
index 79e4b13..0000000
--- a/EditorExtension/SeparatorCommand.swift
+++ /dev/null
@@ -1,20 +0,0 @@
-import Client
-import SuggestionBasic
-import Foundation
-import XcodeKit
-
-class SeparatorCommand: NSObject, XCSourceEditorCommand, CommandType {
- var name: String = ""
-
- func perform(
- with invocation: XCSourceEditorCommandInvocation,
- completionHandler: @escaping (Error?) -> Void
- ) {
- completionHandler(nil)
- }
-
- func named(_ name: String) -> Self {
- self.name = name
- return self
- }
-}
diff --git a/EditorExtension/SourceEditorExtension.swift b/EditorExtension/SourceEditorExtension.swift
deleted file mode 100644
index a9d252f..0000000
--- a/EditorExtension/SourceEditorExtension.swift
+++ /dev/null
@@ -1,90 +0,0 @@
-import Client
-import Foundation
-import GitHubCopilotService
-import Preferences
-import XcodeKit
-
-#if canImport(PreferencesPlus)
-import PreferencesPlus
-#endif
-
-class SourceEditorExtension: NSObject, XCSourceEditorExtension {
- var builtin: [[XCSourceEditorCommandDefinitionKey: Any]] {
- [
- AcceptSuggestionCommand(),
- RejectSuggestionCommand(),
- GetSuggestionsCommand(),
- NextSuggestionCommand(),
- PreviousSuggestionCommand(),
- SyncTextSettingsCommand(),
- ToggleRealtimeSuggestionsCommand(),
- ].map(makeCommandDefinition)
- }
-
- var chat: [[XCSourceEditorCommandDefinitionKey: Any]] {
- [
- OpenChatCommand()
- ].map(makeCommandDefinition)
- }
-
- var additionalBuiltin: [[XCSourceEditorCommandDefinitionKey: Any]] {
- [
- OpenSettingsCommand(),
- ].map(makeCommandDefinition)
- }
-
- var commandDefinitions: [[XCSourceEditorCommandDefinitionKey: Any]] {
- var definitions = builtin
-
- if FeatureFlagNotifierImpl.shared.featureFlags.chat {
- definitions += chat
- }
-
- definitions += additionalBuiltin
-
- return definitions
- }
-
- func extensionDidFinishLaunching() {
- #if DEBUG
- // In a debug build, we usually want to use the XPC service run from Xcode.
- #else
- // When the source extension is initialized
- // we can call a random command to wake up the XPC service.
- Task.detached {
- try await Task.sleep(nanoseconds: 1_000_000_000)
- let service = try getService()
- _ = try await service.getXPCServiceVersion()
- }
- #endif
- }
-}
-
-let identifierPrefix: String = Bundle.main.bundleIdentifier ?? ""
-
-var customCommandMap = [String: String]()
-
-protocol CommandType: AnyObject {
- var commandClassName: String { get }
- var identifier: String { get }
- var name: String { get }
-}
-
-extension CommandType where Self: NSObject {
- var commandClassName: String { Self.className() }
- var identifier: String { commandClassName }
-}
-
-extension CommandType {
- func makeCommandDefinition() -> [XCSourceEditorCommandDefinitionKey: Any] {
- [.classNameKey: commandClassName,
- .identifierKey: identifierPrefix + identifier,
- .nameKey: name]
- }
-}
-
-func makeCommandDefinition(_ commandType: CommandType)
- -> [XCSourceEditorCommandDefinitionKey: Any]
-{
- commandType.makeCommandDefinition()
-}
diff --git a/EditorExtension/SyncTextSettingsCommand.swift b/EditorExtension/SyncTextSettingsCommand.swift
deleted file mode 100644
index f1c5456..0000000
--- a/EditorExtension/SyncTextSettingsCommand.swift
+++ /dev/null
@@ -1,19 +0,0 @@
-import Client
-import SuggestionBasic
-import Foundation
-import XcodeKit
-
-class SyncTextSettingsCommand: NSObject, XCSourceEditorCommand, CommandType {
- var name: String { "Sync Text Settings" }
-
- func perform(
- with invocation: XCSourceEditorCommandInvocation,
- completionHandler: @escaping (Error?) -> Void
- ) {
- completionHandler(nil)
- Task {
- let service = try getService()
- _ = try await service.getRealtimeSuggestedCode(editorContent: .init(invocation))
- }
- }
-}
diff --git a/EditorExtension/ToggleRealtimeSuggestionsCommand.swift b/EditorExtension/ToggleRealtimeSuggestionsCommand.swift
deleted file mode 100644
index 690143d..0000000
--- a/EditorExtension/ToggleRealtimeSuggestionsCommand.swift
+++ /dev/null
@@ -1,25 +0,0 @@
-import Client
-import SuggestionBasic
-import Foundation
-import XcodeKit
-
-class ToggleRealtimeSuggestionsCommand: NSObject, XCSourceEditorCommand, CommandType {
- var name: String { "Enable/Disable Completions" }
-
- func perform(
- with invocation: XCSourceEditorCommandInvocation,
- completionHandler: @escaping (Error?) -> Void
- ) {
- Task {
- do {
- let service = try getService()
- try await service.toggleRealtimeSuggestion()
- completionHandler(nil)
- } catch is CancellationError {
- completionHandler(nil)
- } catch {
- completionHandler(error)
- }
- }
- }
-}