@@ -129,84 +129,6 @@ def _create_document(self, doc_uri, source=None, version=None):
129129 )
130130
131131
132- def get_well_formatted_range (range ):
133- start = range ['start' ]
134- end = range ['end' ]
135-
136- if start ['line' ] > end ['line' ] or (start ['line' ] == end ['line' ] and start ['character' ] > end ['character' ]):
137- return { 'start' : end , 'end' : start }
138-
139- return range
140-
141- def get_well_formatted_edit (text_edit ):
142- range = get_well_formatted_range (text_edit ['range' ])
143- if range != text_edit ['range' ]:
144- return { 'newText' : text_edit ['newText' ], 'range' : range }
145-
146- return text_edit
147-
148- def compare_text_edits (a , b ):
149- diff = a ['range' ]['start' ]['line' ] - b ['range' ]['start' ]['line' ]
150- if diff == 0 :
151- return a ['range' ]['start' ]['character' ] - b ['range' ]['start' ]['character' ]
152-
153- return diff
154-
155- def merge_sort_text_edits (text_edits ):
156- if len (text_edits ) <= 1 :
157- return text_edits
158-
159- p = len (text_edits ) // 2
160- left = text_edits [:p ]
161- right = text_edits [p :]
162-
163- merge_sort_text_edits (left )
164- merge_sort_text_edits (right )
165-
166- left_idx = 0
167- right_idx = 0
168- i = 0
169- while left_idx < len (left ) and right_idx < len (right ):
170- ret = compare_text_edits (left [left_idx ], right [right_idx ])
171- if ret <= 0 :
172- # smaller_equal -> take left to preserve order
173- text_edits [i ] = left [left_idx ]
174- i += 1
175- left_idx += 1
176- else :
177- # greater -> take right
178- text_edits [i ] = right [right_idx ]
179- i += 1
180- right_idx += 1
181- while left_idx < len (left ):
182- text_edits [i ] = left [left_idx ]
183- i += 1
184- left_idx += 1
185- while right_idx < len (right ):
186- text_edits [i ] = right [right_idx ]
187- i += 1
188- right_idx += 1
189- return text_edits
190-
191- def apply_text_edits (doc , text_edits ):
192- text = doc .source
193- sorted_edits = merge_sort_text_edits (list (map (get_well_formatted_edit ,text_edits )))
194- last_modified_offset = 0
195- spans = []
196- for e in sorted_edits :
197- start_offset = doc .offset_at_position (e ['range' ]['start' ])
198- if start_offset < last_modified_offset :
199- raise Exception ('overlapping edit' )
200- elif start_offset > last_modified_offset :
201- spans .append (text [last_modified_offset :start_offset ])
202-
203- if len (e ['newText' ]):
204- spans .append (e ['newText' ])
205- last_modified_offset = doc .offset_at_position (e ['range' ]['end' ])
206-
207- spans .append (text [last_modified_offset :])
208- return '' .join (spans )
209-
210132class Document :
211133
212134 def __init__ (self , uri , workspace , source = None , version = None , local = True , extra_sys_path = None ,
0 commit comments