-
Notifications
You must be signed in to change notification settings - Fork 29
Expand file tree
/
Copy pathLSP.Synchronization.pas
More file actions
294 lines (240 loc) · 7.88 KB
/
LSP.Synchronization.pas
File metadata and controls
294 lines (240 loc) · 7.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
// Pascal Language Server
// Copyright 2020 Arjan Adriaanse
// Copyright 2020 Ryan Joseph
// This file is part of Pascal Language Server.
// Pascal Language Server is free software: you can redistribute it
// and/or modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation, either version 3 of
// the License, or (at your option) any later version.
// Pascal Language Server is distributed in the hope that it will be
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with Pascal Language Server. If not, see
// <https://www.gnu.org/licenses/>.
unit LSP.Synchronization;
{$mode objfpc}{$H+}
interface
uses
Classes,
LSP.BaseTypes, LSP.Base, LSP.Basic;
type
{ TDidOpenTextDocumentParams }
TDidOpenTextDocumentParams = class(TLSPStreamable)
private
fTextDocument: TTextDocumentItem;
procedure SetTextDocument(AValue: TTextDocumentItem);
Public
Constructor Create; override;
Destructor Destroy; override;
Procedure Assign(Source: TPersistent); override;
published
// The document that was opened.
property textDocument: TTextDocumentItem read fTextDocument write SetTextDocument;
end;
{ TDidSaveTextDocumentParams }
TDidSaveTextDocumentParams = class(TLSPStreamable)
private
fTextDocument: TTextDocumentItem;
fText: string;
procedure SetTextDocument(AValue: TTextDocumentItem);
Public
Constructor Create; override;
Destructor Destroy; override;
Procedure Assign(Source: TPersistent); override;
published
// The document that was saved.
property textDocument: TTextDocumentItem read fTextDocument write SetTextDocument;
// Optional the content when saved. Depends on the includeText value
// when the save notification was requested.
property text: string read fText write fText;
end;
{ TDidCloseTextDocumentParams }
TDidCloseTextDocumentParams = class(TLSPStreamable)
private
fTextDocument: TTextDocumentItem;
procedure SetTextDocument(AValue: TTextDocumentItem);
Public
Constructor Create; override;
Destructor Destroy; override;
Procedure Assign(Source: TPersistent); override;
published
// The document that was closed.
property textDocument: TTextDocumentItem read fTextDocument write SetTextDocument;
end;
{ TTextDocumentContentChangeEvent }
// An event describing a change to a text document. If range and
// rangeLength are omitted the new text is considered to be the full
// content of the document.
TTextDocumentContentChangeEvent = class(TCollectionItem)
private
fText: string;
fRange: TRange;
procedure SetRange(AValue: TRange);
Public
constructor Create(ACollection: TCollection); override;
destructor Destroy; override;
published
// The range of the document that changed.
property range: TRange read fRange write SetRange;
// The new text of the whole document.
property text: string read fText write fText;
end;
TContentChanges = specialize TGenericCollection<TTextDocumentContentChangeEvent>;
{ TDidChangeTextDocumentParams }
TDidChangeTextDocumentParams = class(TLSPStreamable)
private
fTextDocument: TVersionedTextDocumentIdentifier;
fContentChanges: TContentChanges;
procedure SetContentChanges(AValue: TContentChanges);
procedure SetTextDocument(AValue: TVersionedTextDocumentIdentifier);
public
constructor Create; override;
Destructor Destroy; override;
published
// The document that did change. The version number points to the
// version after all provided content changes have been applied.
property textDocument: TVersionedTextDocumentIdentifier read fTextDocument write SetTextDocument;
// The actual content changes. The content changes describe single
// state changes to the document. So if there are two content
// changes c1 (at array index 0) and c2 (at array index 1) for a
// document in state S then c1 moves the document from S to S' and
// c2 from S' to S''. So c1 is computed on the state S and c2 is
// computed on the state S'.
//
// To mirror the content of a document using change events use the
// following approach:
// - start with the same initial content
// - apply the 'textDocument/didChange' notifications in the order
// you recevie them.
// - apply the `TextDocumentContentChangeEvent`s in a single
// notification in the order you receive them.
property contentChanges: TContentChanges read fContentChanges write SetContentChanges;
end;
implementation
uses
SysUtils;
{ TDidChangeTextDocumentParams }
procedure TDidChangeTextDocumentParams.SetContentChanges(AValue: TContentChanges
);
begin
if fContentChanges=AValue then Exit;
fContentChanges.Assign(AValue);
end;
procedure TDidChangeTextDocumentParams.SetTextDocument(
AValue: TVersionedTextDocumentIdentifier);
begin
if fTextDocument=AValue then Exit;
fTextDocument.Assign(AValue);
end;
constructor TDidChangeTextDocumentParams.Create;
begin
fTextDocument := TVersionedTextDocumentIdentifier.Create;
fcontentChanges := TContentChanges.Create;
end;
destructor TDidChangeTextDocumentParams.Destroy;
begin
FreeAndNil(fTextDocument);
FreeAndNil(fContentChanges);
inherited Destroy;
end;
{ TDidOpenTextDocumentParams }
procedure TDidOpenTextDocumentParams.SetTextDocument(AValue: TTextDocumentItem);
begin
if fTextDocument=AValue then Exit;
fTextDocument.Assign(aValue);
end;
constructor TDidOpenTextDocumentParams.Create;
begin
inherited Create;
fTextDocument:=TTextDocumentItem.Create;
end;
destructor TDidOpenTextDocumentParams.Destroy;
begin
FreeAndNil(fTextDocument);
inherited Destroy;
end;
procedure TDidOpenTextDocumentParams.Assign(Source: TPersistent);
var
Src: TDidOpenTextDocumentParams absolute source;
begin
if Source is TDidOpenTextDocumentParams then
begin
TextDocument.Assign(Src.textDocument)
end
else
inherited Assign(Source);
end;
{ TDidSaveTextDocumentParams }
procedure TDidSaveTextDocumentParams.SetTextDocument(AValue: TTextDocumentItem);
begin
if fTextDocument=AValue then Exit;
fTextDocument.Assign(AValue);
end;
constructor TDidSaveTextDocumentParams.Create;
begin
inherited Create;
fTextDocument:=TTextDocumentItem.Create;
end;
destructor TDidSaveTextDocumentParams.Destroy;
begin
FreeAndNil(fTextDocument);
inherited Destroy;
end;
procedure TDidSaveTextDocumentParams.Assign(Source: TPersistent);
var
Src: TDidSaveTextDocumentParams absolute source;
begin
if Source is TDidSaveTextDocumentParams then
begin
TextDocument.Assign(Src.textDocument)
end
else
inherited Assign(Source);
end;
{ TDidCloseTextDocumentParams }
procedure TDidCloseTextDocumentParams.SetTextDocument(AValue: TTextDocumentItem
);
begin
if fTextDocument=AValue then Exit;
fTextDocument:=AValue;
end;
constructor TDidCloseTextDocumentParams.Create;
begin
inherited Create;
fTextDocument:=TTextDocumentItem.Create;
end;
destructor TDidCloseTextDocumentParams.Destroy;
begin
FreeAndNil(fTextDocument);
inherited Destroy;
end;
procedure TDidCloseTextDocumentParams.Assign(Source: TPersistent);
var
Src: TDidCloseTextDocumentParams absolute source;
begin
if Source is TDidCloseTextDocumentParams then
begin
TextDocument.Assign(Src.textDocument)
end
else
inherited Assign(Source);
end;
{ TTextDocumentContentChangeEvent }
procedure TTextDocumentContentChangeEvent.SetRange(AValue: TRange);
begin
if fRange=AValue then Exit;
fRange.Assign(AValue);
end;
constructor TTextDocumentContentChangeEvent.Create(ACollection: TCollection);
begin
inherited Create(ACollection);
fRange := TRange.Create;
end;
destructor TTextDocumentContentChangeEvent.Destroy;
begin
FreeAndNil(fRange);
inherited Destroy;
end;
end.