From fd67b6e2f168e19d5db4a970d915ae181e647964 Mon Sep 17 00:00:00 2001 From: Jodiss8 Date: Sun, 6 Apr 2025 04:43:11 -0400 Subject: [PATCH] Delete EditorExtension directory --- .../AcceptPromptToCodeCommand.swift | 31 ------ EditorExtension/AcceptSuggestionCommand.swift | 33 ------- EditorExtension/CloseIdleTabsCommand.swift | 20 ---- EditorExtension/CustomCommand.swift | 23 ----- EditorExtension/EditorExtension.entitlements | 17 ---- EditorExtension/GetSuggestionsCommand.swift | 20 ---- EditorExtension/Helpers.swift | 98 ------------------- EditorExtension/Info.plist | 48 --------- EditorExtension/NextSuggestionCommand.swift | 20 ---- EditorExtension/OpenChat.swift | 19 ---- EditorExtension/OpenSettingsCommand.swift | 68 ------------- .../PrefetchSuggestionsCommand.swift | 19 ---- .../PreviousSuggestionCommand.swift | 20 ---- EditorExtension/PromptToCodeCommand.swift | 19 ---- EditorExtension/RejectSuggestionCommand.swift | 20 ---- EditorExtension/SeparatorCommand.swift | 20 ---- EditorExtension/SourceEditorExtension.swift | 90 ----------------- EditorExtension/SyncTextSettingsCommand.swift | 19 ---- .../ToggleRealtimeSuggestionsCommand.swift | 25 ----- 19 files changed, 629 deletions(-) delete mode 100644 EditorExtension/AcceptPromptToCodeCommand.swift delete mode 100644 EditorExtension/AcceptSuggestionCommand.swift delete mode 100644 EditorExtension/CloseIdleTabsCommand.swift delete mode 100644 EditorExtension/CustomCommand.swift delete mode 100644 EditorExtension/EditorExtension.entitlements delete mode 100644 EditorExtension/GetSuggestionsCommand.swift delete mode 100644 EditorExtension/Helpers.swift delete mode 100644 EditorExtension/Info.plist delete mode 100644 EditorExtension/NextSuggestionCommand.swift delete mode 100644 EditorExtension/OpenChat.swift delete mode 100644 EditorExtension/OpenSettingsCommand.swift delete mode 100644 EditorExtension/PrefetchSuggestionsCommand.swift delete mode 100644 EditorExtension/PreviousSuggestionCommand.swift delete mode 100644 EditorExtension/PromptToCodeCommand.swift delete mode 100644 EditorExtension/RejectSuggestionCommand.swift delete mode 100644 EditorExtension/SeparatorCommand.swift delete mode 100644 EditorExtension/SourceEditorExtension.swift delete mode 100644 EditorExtension/SyncTextSettingsCommand.swift delete mode 100644 EditorExtension/ToggleRealtimeSuggestionsCommand.swift 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) - } - } - } -}