@@ -11,11 +11,20 @@ let suggestionEnd = "*///======== End of Copilot Suggestion"
1111public struct SuggestionInjector {
1212 public init ( ) { }
1313
14+ public struct ExtraInfo {
15+ public var didChangeContent = false
16+ public var didChangeCursorPosition = false
17+ public var suggestionRange : ClosedRange < Int > ?
18+ public var modifications : [ Modification ] = [ ]
19+ public init ( ) { }
20+ }
21+
1422 public func rejectCurrentSuggestions(
1523 from content: inout [ String ] ,
16- cursorPosition: inout CursorPosition
24+ cursorPosition: inout CursorPosition ,
25+ extraInfo: inout ExtraInfo
1726 ) {
18- var ranges = [ Range < Int > ] ( )
27+ var ranges = [ ClosedRange < Int > ] ( )
1928 var suggestionStartIndex = - 1
2029
2130 for (index, line) in content. enumerated ( ) {
@@ -27,25 +36,34 @@ public struct SuggestionInjector {
2736 suggestionStartIndex = - 1
2837 }
2938 }
39+
40+ let reversedRanges = ranges. reversed ( )
3041
31- for range in ranges. lazy. reversed ( ) {
32- for i in stride ( from: range. endIndex, through: range. startIndex, by: - 1 ) {
42+ extraInfo. modifications. append ( contentsOf: reversedRanges. map ( Modification . deleted) )
43+ extraInfo. didChangeContent = !ranges. isEmpty
44+
45+ for range in reversedRanges {
46+ for i in stride ( from: range. upperBound, through: range. lowerBound, by: - 1 ) {
3347 if i <= cursorPosition. line, cursorPosition. line >= 0 {
3448 cursorPosition = . init(
3549 line: cursorPosition. line - 1 ,
3650 character: i == cursorPosition. line ? 0 : cursorPosition. character
3751 )
52+ extraInfo. didChangeCursorPosition = true
3853 }
3954 content. remove ( at: i)
4055 }
4156 }
57+
58+ extraInfo. suggestionRange = nil
4259 }
4360
4461 public func proposeSuggestion(
4562 intoContentWithoutSuggestion content: inout [ String ] ,
4663 completion: CopilotCompletion ,
4764 index: Int ,
48- count: Int
65+ count: Int ,
66+ extraInfo: inout ExtraInfo
4967 ) {
5068 let start = completion. range. start
5169 let startText = " \( suggestionStart) \( index + 1 ) / \( count) "
@@ -77,39 +95,53 @@ public struct SuggestionInjector {
7795 return 0
7896 } ( )
7997 if content. endIndex < lineIndex {
98+ extraInfo. didChangeContent = true
99+ extraInfo. suggestionRange = content. endIndex ... content. endIndex + lines. count - 1
100+ extraInfo. modifications. append ( . inserted( content. endIndex, lines) )
80101 content. append ( contentsOf: lines)
81102 } else {
103+ extraInfo. didChangeContent = true
104+ extraInfo. suggestionRange = lineIndex ... lineIndex + lines. count - 1
105+ extraInfo. modifications. append ( . inserted( lineIndex, lines) )
82106 content. insert ( contentsOf: lines, at: lineIndex)
83107 }
84108 }
85109
86110 public func acceptSuggestion(
87111 intoContentWithoutSuggestion content: inout [ String ] ,
88112 cursorPosition: inout CursorPosition ,
89- completion: CopilotCompletion
113+ completion: CopilotCompletion ,
114+ extraInfo: inout ExtraInfo
90115 ) {
116+ extraInfo. didChangeContent = true
117+ extraInfo. didChangeCursorPosition = true
118+ extraInfo. suggestionRange = nil
91119 let start = completion. range. start
92120 let suggestionContent = completion. text
93121
94122 let existedLine = start. line < content. endIndex ? content [ start. line] : nil
95123 let commonPrefix = longestCommonPrefix ( of: suggestionContent, and: existedLine ?? " " )
96124
97125 if let existedLine, existedLine. count > 1 , !commonPrefix. isEmpty {
126+ extraInfo. modifications. append ( . deleted( start. line... start. line) )
98127 content. remove ( at: start. line)
99128 } else if content. count > start. line,
100129 content [ start. line] . isEmpty || content [ start. line] == " \n "
101130 {
131+ extraInfo. modifications. append ( . deleted( start. line... start. line) )
102132 content. remove ( at: start. line)
103133 }
104134
105135 let toBeInserted = suggestionContent. breakLines ( appendLineBreakToLastLine: true )
106136 if content. endIndex < start. line {
137+ extraInfo. modifications. append ( . inserted( content. endIndex, toBeInserted) )
107138 content. append ( contentsOf: toBeInserted)
108139 cursorPosition = . init(
109140 line: toBeInserted. endIndex,
110141 character: ( toBeInserted. last? . count ?? 1 ) - 1
111142 )
112143 } else {
144+ extraInfo. modifications. append ( . inserted( start. line, toBeInserted) )
113145 content. insert (
114146 contentsOf: toBeInserted,
115147 at: start. line
0 commit comments