@@ -11,9 +11,7 @@ import XcodeInspector
1111import ProChatTabs
1212
1313enum ChatTabFactory {
14- static func chatTabBuilderCollection(
15- openTab: @escaping ( any ChatTab ) -> Void
16- ) -> [ ChatTabBuilderCollection ] {
14+ static func chatTabBuilderCollection( ) -> [ ChatTabBuilderCollection ] {
1715 func folderIfNeeded(
1816 _ builders: [ any ChatTabBuilder ] ,
1917 title: String
@@ -27,82 +25,88 @@ enum ChatTabFactory {
2725
2826 let collection = [
2927 folderIfNeeded ( ChatGPTChatTab . chatBuilders ( ) , title: ChatGPTChatTab . name) ,
30- folderIfNeeded ( BrowserChatTab . chatBuilders ( externalDependency: . init(
31- getEditorContent: {
32- guard let editor = XcodeInspector . shared. focusedEditor else {
33- return . init( selectedText: " " , language: " " , fileContent: " " )
34- }
35- let content = editor. content
36- return . init(
37- selectedText: content. selectedContent,
38- language: languageIdentifierFromFileURL (
39- XcodeInspector . shared
40- . activeDocumentURL
41- )
42- . rawValue,
43- fileContent: content. content
44- )
45- } ,
46- handleCustomCommand: { command, prompt in
47- switch command. feature {
48- case let . chatWithSelection( extraSystemPrompt, _, useExtraSystemPrompt) :
49- let service = ChatService ( )
50- return try await service. processMessage (
51- systemPrompt: nil ,
52- extraSystemPrompt: ( useExtraSystemPrompt ?? false ) ? extraSystemPrompt :
53- nil ,
54- prompt: prompt
55- )
56- case let . customChat( systemPrompt, _) :
57- let service = ChatService ( )
58- return try await service. processMessage (
59- systemPrompt: systemPrompt,
60- extraSystemPrompt: nil ,
61- prompt: prompt
62- )
63- case let . singleRoundDialog(
64- systemPrompt,
65- overwriteSystemPrompt,
66- _,
67- _
68- ) :
69- let service = ChatService ( )
70- return try await service. handleSingleRoundDialogCommand (
71- systemPrompt: systemPrompt,
72- overwriteSystemPrompt: overwriteSystemPrompt ?? false ,
73- prompt: prompt
74- )
75- case let . promptToCode( extraSystemPrompt, instruction, _, _) :
76- let service = PromptToCodeService (
77- code: prompt,
78- selectionRange: . outOfScope,
79- language: . plaintext,
80- identSize: 4 ,
81- usesTabsForIndentation: true ,
82- projectRootURL: . init( fileURLWithPath: " / " ) ,
83- fileURL: . init( fileURLWithPath: " / " ) ,
84- allCode: prompt,
85- extraSystemPrompt: extraSystemPrompt,
86- generateDescriptionRequirement: false
87- )
88- try await service. modifyCode ( prompt: instruction ?? " Modify content. " )
89- return service. code
90- }
91- } ,
92- handleNewTab: openTab
93- ) ) , title: BrowserChatTab . name) ,
28+ folderIfNeeded (
29+ BrowserChatTab . chatBuilders (
30+ externalDependency: externalDependenciesForBrowserChatTab ( )
31+ ) ,
32+ title: BrowserChatTab . name
33+ ) ,
9434 ] . compactMap { $0 }
9535
9636 return collection
9737 }
38+
39+ static func externalDependenciesForBrowserChatTab( ) -> BrowserChatTab . ExternalDependency {
40+ . init(
41+ getEditorContent: {
42+ guard let editor = XcodeInspector . shared. focusedEditor else {
43+ return . init( selectedText: " " , language: " " , fileContent: " " )
44+ }
45+ let content = editor. content
46+ return . init(
47+ selectedText: content. selectedContent,
48+ language: languageIdentifierFromFileURL (
49+ XcodeInspector . shared
50+ . activeDocumentURL
51+ )
52+ . rawValue,
53+ fileContent: content. content
54+ )
55+ } ,
56+ handleCustomCommand: { command, prompt in
57+ switch command. feature {
58+ case let . chatWithSelection( extraSystemPrompt, _, useExtraSystemPrompt) :
59+ let service = ChatService ( )
60+ return try await service. processMessage (
61+ systemPrompt: nil ,
62+ extraSystemPrompt: ( useExtraSystemPrompt ?? false ) ? extraSystemPrompt :
63+ nil ,
64+ prompt: prompt
65+ )
66+ case let . customChat( systemPrompt, _) :
67+ let service = ChatService ( )
68+ return try await service. processMessage (
69+ systemPrompt: systemPrompt,
70+ extraSystemPrompt: nil ,
71+ prompt: prompt
72+ )
73+ case let . singleRoundDialog(
74+ systemPrompt,
75+ overwriteSystemPrompt,
76+ _,
77+ _
78+ ) :
79+ let service = ChatService ( )
80+ return try await service. handleSingleRoundDialogCommand (
81+ systemPrompt: systemPrompt,
82+ overwriteSystemPrompt: overwriteSystemPrompt ?? false ,
83+ prompt: prompt
84+ )
85+ case let . promptToCode( extraSystemPrompt, instruction, _, _) :
86+ let service = PromptToCodeService (
87+ code: prompt,
88+ selectionRange: . outOfScope,
89+ language: . plaintext,
90+ identSize: 4 ,
91+ usesTabsForIndentation: true ,
92+ projectRootURL: . init( fileURLWithPath: " / " ) ,
93+ fileURL: . init( fileURLWithPath: " / " ) ,
94+ allCode: prompt,
95+ extraSystemPrompt: extraSystemPrompt,
96+ generateDescriptionRequirement: false
97+ )
98+ try await service. modifyCode ( prompt: instruction ?? " Modify content. " )
99+ return service. code
100+ }
101+ }
102+ )
103+ }
98104}
99105
100106#else
101107
102108enum ChatTabFactory {
103- static func chatTabBuilderCollection(
104- openTab: @escaping ( any ChatTab ) -> Void
105- ) -> [ ChatTabBuilderCollection ] {
109+ static func chatTabBuilderCollection( ) -> [ ChatTabBuilderCollection ] {
106110 func folderIfNeeded(
107111 _ builders: [ any ChatTabBuilder ] ,
108112 title: String
0 commit comments