-
Notifications
You must be signed in to change notification settings - Fork 28.1k
/
model.ts
1156 lines (1034 loc) · 36.2 KB
/
model.ts
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
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import { IMarkdownString } from 'vs/base/common/htmlContent';
import URI from 'vs/base/common/uri';
import { LanguageId, LanguageIdentifier } from 'vs/editor/common/modes';
import { LineTokens } from 'vs/editor/common/core/lineTokens';
import { IDisposable } from 'vs/base/common/lifecycle';
import { Position, IPosition } from 'vs/editor/common/core/position';
import { Range, IRange } from 'vs/editor/common/core/range';
import { Selection } from 'vs/editor/common/core/selection';
import { ModelRawContentChangedEvent, IModelContentChangedEvent, IModelDecorationsChangedEvent, IModelLanguageChangedEvent, IModelOptionsChangedEvent, IModelLanguageConfigurationChangedEvent, IModelTokensChangedEvent, IModelContentChange } from 'vs/editor/common/model/textModelEvents';
import { ThemeColor } from 'vs/platform/theme/common/themeService';
import { ITextSnapshot } from 'vs/platform/files/common/files';
import { SearchData } from 'vs/editor/common/model/textModelSearch';
/**
* Vertical Lane in the overview ruler of the editor.
*/
export enum OverviewRulerLane {
Left = 1,
Center = 2,
Right = 4,
Full = 7
}
/**
* Options for rendering a model decoration in the overview ruler.
*/
export interface IModelDecorationOverviewRulerOptions {
/**
* CSS color to render in the overview ruler.
* e.g.: rgba(100, 100, 100, 0.5) or a color from the color registry
*/
color: string | ThemeColor;
/**
* CSS color to render in the overview ruler.
* e.g.: rgba(100, 100, 100, 0.5) or a color from the color registry
*/
darkColor: string | ThemeColor;
/**
* CSS color to render in the overview ruler.
* e.g.: rgba(100, 100, 100, 0.5) or a color from the color registry
*/
hcColor?: string | ThemeColor;
/**
* The position in the overview ruler.
*/
position: OverviewRulerLane;
}
/**
* Options for a model decoration.
*/
export interface IModelDecorationOptions {
/**
* Customize the growing behavior of the decoration when typing at the edges of the decoration.
* Defaults to TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges
*/
stickiness?: TrackedRangeStickiness;
/**
* CSS class name describing the decoration.
*/
className?: string;
/**
* Message to be rendered when hovering over the glyph margin decoration.
*/
glyphMarginHoverMessage?: IMarkdownString | IMarkdownString[];
/**
* Array of MarkdownString to render as the decoration message.
*/
hoverMessage?: IMarkdownString | IMarkdownString[];
/**
* Should the decoration expand to encompass a whole line.
*/
isWholeLine?: boolean;
/**
* Always render the decoration (even when the range it encompasses is collapsed).
* @internal
*/
showIfCollapsed?: boolean;
/**
* Specifies the stack order of a decoration.
* A decoration with greater stack order is always in front of a decoration with a lower stack order.
*/
zIndex?: number;
/**
* If set, render this decoration in the overview ruler.
*/
overviewRuler?: IModelDecorationOverviewRulerOptions;
/**
* If set, the decoration will be rendered in the glyph margin with this CSS class name.
*/
glyphMarginClassName?: string;
/**
* If set, the decoration will be rendered in the lines decorations with this CSS class name.
*/
linesDecorationsClassName?: string;
/**
* If set, the decoration will be rendered in the margin (covering its full width) with this CSS class name.
*/
marginClassName?: string;
/**
* If set, the decoration will be rendered inline with the text with this CSS class name.
* Please use this only for CSS rules that must impact the text. For example, use `className`
* to have a background color decoration.
*/
inlineClassName?: string;
/**
* If set, the decoration will be rendered before the text with this CSS class name.
*/
beforeContentClassName?: string;
/**
* If set, the decoration will be rendered after the text with this CSS class name.
*/
afterContentClassName?: string;
}
/**
* New model decorations.
*/
export interface IModelDeltaDecoration {
/**
* Range that this decoration covers.
*/
range: IRange;
/**
* Options associated with this decoration.
*/
options: IModelDecorationOptions;
}
/**
* A decoration in the model.
*/
export interface IModelDecoration {
/**
* Identifier for a decoration.
*/
readonly id: string;
/**
* Identifier for a decoration's owener.
*/
readonly ownerId: number;
/**
* Range that this decoration covers.
*/
readonly range: Range;
/**
* Options associated with this decoration.
*/
readonly options: IModelDecorationOptions;
}
/**
* An accessor that can add, change or remove model decorations.
* @internal
*/
export interface IModelDecorationsChangeAccessor {
/**
* Add a new decoration.
* @param range Range that this decoration covers.
* @param options Options associated with this decoration.
* @return An unique identifier associated with this decoration.
*/
addDecoration(range: IRange, options: IModelDecorationOptions): string;
/**
* Change the range that an existing decoration covers.
* @param id The unique identifier associated with the decoration.
* @param newRange The new range that this decoration covers.
*/
changeDecoration(id: string, newRange: IRange): void;
/**
* Change the options associated with an existing decoration.
* @param id The unique identifier associated with the decoration.
* @param newOptions The new options associated with this decoration.
*/
changeDecorationOptions(id: string, newOptions: IModelDecorationOptions): void;
/**
* Remove an existing decoration.
* @param id The unique identifier associated with the decoration.
*/
removeDecoration(id: string): void;
/**
* Perform a minimum ammount of operations, in order to transform the decorations
* identified by `oldDecorations` to the decorations described by `newDecorations`
* and returns the new identifiers associated with the resulting decorations.
*
* @param oldDecorations Array containing previous decorations identifiers.
* @param newDecorations Array describing what decorations should result after the call.
* @return An array containing the new decorations identifiers.
*/
deltaDecorations(oldDecorations: string[], newDecorations: IModelDeltaDecoration[]): string[];
}
/**
* Word inside a model.
*/
export interface IWordAtPosition {
/**
* The word.
*/
readonly word: string;
/**
* The column where the word starts.
*/
readonly startColumn: number;
/**
* The column where the word ends.
*/
readonly endColumn: number;
}
/**
* End of line character preference.
*/
export enum EndOfLinePreference {
/**
* Use the end of line character identified in the text buffer.
*/
TextDefined = 0,
/**
* Use line feed (\n) as the end of line character.
*/
LF = 1,
/**
* Use carriage return and line feed (\r\n) as the end of line character.
*/
CRLF = 2
}
/**
* The default end of line to use when instantiating models.
*/
export enum DefaultEndOfLine {
/**
* Use line feed (\n) as the end of line character.
*/
LF = 1,
/**
* Use carriage return and line feed (\r\n) as the end of line character.
*/
CRLF = 2
}
/**
* End of line character preference.
*/
export enum EndOfLineSequence {
/**
* Use line feed (\n) as the end of line character.
*/
LF = 0,
/**
* Use carriage return and line feed (\r\n) as the end of line character.
*/
CRLF = 1
}
/**
* An identifier for a single edit operation.
*/
export interface ISingleEditOperationIdentifier {
/**
* Identifier major
*/
major: number;
/**
* Identifier minor
*/
minor: number;
}
/**
* A single edit operation, that acts as a simple replace.
* i.e. Replace text at `range` with `text` in model.
*/
export interface ISingleEditOperation {
/**
* The range to replace. This can be empty to emulate a simple insert.
*/
range: IRange;
/**
* The text to replace with. This can be null to emulate a simple delete.
*/
text: string;
/**
* This indicates that this operation has "insert" semantics.
* i.e. forceMoveMarkers = true => if `range` is collapsed, all markers at the position will be moved.
*/
forceMoveMarkers?: boolean;
}
/**
* A single edit operation, that has an identifier.
*/
export interface IIdentifiedSingleEditOperation {
/**
* An identifier associated with this single edit operation.
* @internal
*/
identifier?: ISingleEditOperationIdentifier;
/**
* The range to replace. This can be empty to emulate a simple insert.
*/
range: Range;
/**
* The text to replace with. This can be null to emulate a simple delete.
*/
text: string;
/**
* This indicates that this operation has "insert" semantics.
* i.e. forceMoveMarkers = true => if `range` is collapsed, all markers at the position will be moved.
*/
forceMoveMarkers?: boolean;
/**
* This indicates that this operation is inserting automatic whitespace
* that can be removed on next model edit operation if `config.trimAutoWhitespace` is true.
* @internal
*/
isAutoWhitespaceEdit?: boolean;
/**
* This indicates that this operation is in a set of operations that are tracked and should not be "simplified".
* @internal
*/
_isTracked?: boolean;
}
/**
* A callback that can compute the cursor state after applying a series of edit operations.
*/
export interface ICursorStateComputer {
/**
* A callback that can compute the resulting cursors state after some edit operations have been executed.
*/
(inverseEditOperations: IIdentifiedSingleEditOperation[]): Selection[];
}
export class TextModelResolvedOptions {
_textModelResolvedOptionsBrand: void;
readonly tabSize: number;
readonly insertSpaces: boolean;
readonly defaultEOL: DefaultEndOfLine;
readonly trimAutoWhitespace: boolean;
/**
* @internal
*/
constructor(src: {
tabSize: number;
insertSpaces: boolean;
defaultEOL: DefaultEndOfLine;
trimAutoWhitespace: boolean;
}) {
this.tabSize = src.tabSize | 0;
this.insertSpaces = Boolean(src.insertSpaces);
this.defaultEOL = src.defaultEOL | 0;
this.trimAutoWhitespace = Boolean(src.trimAutoWhitespace);
}
/**
* @internal
*/
public equals(other: TextModelResolvedOptions): boolean {
return (
this.tabSize === other.tabSize
&& this.insertSpaces === other.insertSpaces
&& this.defaultEOL === other.defaultEOL
&& this.trimAutoWhitespace === other.trimAutoWhitespace
);
}
/**
* @internal
*/
public createChangeEvent(newOpts: TextModelResolvedOptions): IModelOptionsChangedEvent {
return {
tabSize: this.tabSize !== newOpts.tabSize,
insertSpaces: this.insertSpaces !== newOpts.insertSpaces,
trimAutoWhitespace: this.trimAutoWhitespace !== newOpts.trimAutoWhitespace,
};
}
}
/**
* @internal
*/
export interface ITextModelCreationOptions {
tabSize: number;
insertSpaces: boolean;
detectIndentation: boolean;
trimAutoWhitespace: boolean;
defaultEOL: DefaultEndOfLine;
isForSimpleWidget: boolean;
}
export interface ITextModelUpdateOptions {
tabSize?: number;
insertSpaces?: boolean;
trimAutoWhitespace?: boolean;
}
export class FindMatch {
_findMatchBrand: void;
public readonly range: Range;
public readonly matches: string[];
/**
* @internal
*/
constructor(range: Range, matches: string[]) {
this.range = range;
this.matches = matches;
}
}
/**
* @internal
*/
export interface IFoundBracket {
range: Range;
open: string;
close: string;
isOpen: boolean;
}
/**
* Describes the behavior of decorations when typing/editing near their edges.
* Note: Please do not edit the values, as they very carefully match `DecorationRangeBehavior`
*/
export enum TrackedRangeStickiness {
AlwaysGrowsWhenTypingAtEdges = 0,
NeverGrowsWhenTypingAtEdges = 1,
GrowsOnlyWhenTypingBefore = 2,
GrowsOnlyWhenTypingAfter = 3,
}
/**
* A model.
*/
export interface ITextModel {
/**
* Gets the resource associated with this editor model.
*/
readonly uri: URI;
/**
* A unique identifier associated with this model.
*/
readonly id: string;
/**
* This model is constructed for a simple widget code editor.
* @internal
*/
readonly isForSimpleWidget: boolean;
/**
* If true, the text model might contain RTL.
* If false, the text model **contains only** contain LTR.
* @internal
*/
mightContainRTL(): boolean;
/**
* If true, the text model might contain non basic ASCII.
* If false, the text model **contains only** basic ASCII.
* @internal
*/
mightContainNonBasicASCII(): boolean;
/**
* Get the resolved options for this model.
*/
getOptions(): TextModelResolvedOptions;
/**
* Get the current version id of the model.
* Anytime a change happens to the model (even undo/redo),
* the version id is incremented.
*/
getVersionId(): number;
/**
* Get the alternative version id of the model.
* This alternative version id is not always incremented,
* it will return the same values in the case of undo-redo.
*/
getAlternativeVersionId(): number;
/**
* Replace the entire text buffer value contained in this model.
*/
setValue(newValue: string): void;
/**
* Replace the entire text buffer value contained in this model.
* @internal
*/
setValueFromTextBuffer(newValue: ITextBuffer): void;
/**
* Get the text stored in this model.
* @param eol The end of line character preference. Defaults to `EndOfLinePreference.TextDefined`.
* @param preserverBOM Preserve a BOM character if it was detected when the model was constructed.
* @return The text.
*/
getValue(eol?: EndOfLinePreference, preserveBOM?: boolean): string;
/**
* Get the text stored in this model.
* @param preserverBOM Preserve a BOM character if it was detected when the model was constructed.
* @return The text snapshot (it is safe to consume it asynchronously).
* @internal
*/
createSnapshot(preserveBOM?: boolean): ITextSnapshot;
/**
* Get the length of the text stored in this model.
*/
getValueLength(eol?: EndOfLinePreference, preserveBOM?: boolean): number;
/**
* Check if the raw text stored in this model equals another raw text.
* @internal
*/
equalsTextBuffer(other: ITextBuffer): boolean;
/**
* Get the text in a certain range.
* @param range The range describing what text to get.
* @param eol The end of line character preference. This will only be used for multiline ranges. Defaults to `EndOfLinePreference.TextDefined`.
* @return The text.
*/
getValueInRange(range: IRange, eol?: EndOfLinePreference): string;
/**
* Get the length of text in a certain range.
* @param range The range describing what text length to get.
* @return The text length.
*/
getValueLengthInRange(range: IRange): number;
/**
* Splits characters in two buckets. First bucket (A) is of characters that
* sit in lines with length < `LONG_LINE_BOUNDARY`. Second bucket (B) is of
* characters that sit in lines with length >= `LONG_LINE_BOUNDARY`.
* If count(B) > count(A) return true. Returns false otherwise.
* @internal
*/
isDominatedByLongLines(): boolean;
/**
* Get the number of lines in the model.
*/
getLineCount(): number;
/**
* Get the text for a certain line.
*/
getLineContent(lineNumber: number): string;
/**
* Get the text for all lines.
*/
getLinesContent(): string[];
/**
* Get the end of line sequence predominantly used in the text buffer.
* @return EOL char sequence (e.g.: '\n' or '\r\n').
*/
getEOL(): string;
/**
* Change the end of line sequence used in the text buffer.
*/
setEOL(eol: EndOfLineSequence): void;
/**
* Get the minimum legal column for line at `lineNumber`
*/
getLineMinColumn(lineNumber: number): number;
/**
* Get the maximum legal column for line at `lineNumber`
*/
getLineMaxColumn(lineNumber: number): number;
/**
* Returns the column before the first non whitespace character for line at `lineNumber`.
* Returns 0 if line is empty or contains only whitespace.
*/
getLineFirstNonWhitespaceColumn(lineNumber: number): number;
/**
* Returns the column after the last non whitespace character for line at `lineNumber`.
* Returns 0 if line is empty or contains only whitespace.
*/
getLineLastNonWhitespaceColumn(lineNumber: number): number;
/**
* Create a valid position,
*/
validatePosition(position: IPosition): Position;
/**
* Advances the given position by the given offest (negative offsets are also accepted)
* and returns it as a new valid position.
*
* If the offset and position are such that their combination goes beyond the beginning or
* end of the model, throws an exception.
*
* If the ofsset is such that the new position would be in the middle of a multi-byte
* line terminator, throws an exception.
*/
modifyPosition(position: IPosition, offset: number): Position;
/**
* Create a valid range.
*/
validateRange(range: IRange): Range;
/**
* Converts the position to a zero-based offset.
*
* The position will be [adjusted](#TextDocument.validatePosition).
*
* @param position A position.
* @return A valid zero-based offset.
*/
getOffsetAt(position: IPosition): number;
/**
* Converts a zero-based offset to a position.
*
* @param offset A zero-based offset.
* @return A valid [position](#Position).
*/
getPositionAt(offset: number): Position;
/**
* Get a range covering the entire model
*/
getFullModelRange(): Range;
/**
* Returns if the model was disposed or not.
*/
isDisposed(): boolean;
/**
* @internal
*/
tokenizeViewport(startLineNumber: number, endLineNumber: number): void;
/**
* Only basic mode supports allowed on this model because it is simply too large.
* (tokenization is allowed and other basic supports)
* @internal
*/
isTooLargeForHavingARichMode(): boolean;
/**
* The file is so large, that even tokenization is disabled.
* @internal
*/
isTooLargeForTokenization(): boolean;
/**
* Search the model.
* @param searchString The string used to search. If it is a regular expression, set `isRegex` to true.
* @param searchOnlyEditableRange Limit the searching to only search inside the editable range of the model.
* @param isRegex Used to indicate that `searchString` is a regular expression.
* @param matchCase Force the matching to match lower/upper case exactly.
* @param wordSeparators Force the matching to match entire words only. Pass null otherwise.
* @param captureMatches The result will contain the captured groups.
* @param limitResultCount Limit the number of results
* @return The ranges where the matches are. It is empty if not matches have been found.
*/
findMatches(searchString: string, searchOnlyEditableRange: boolean, isRegex: boolean, matchCase: boolean, wordSeparators: string | null, captureMatches: boolean, limitResultCount?: number): FindMatch[];
/**
* Search the model.
* @param searchString The string used to search. If it is a regular expression, set `isRegex` to true.
* @param searchScope Limit the searching to only search inside this range.
* @param isRegex Used to indicate that `searchString` is a regular expression.
* @param matchCase Force the matching to match lower/upper case exactly.
* @param wordSeparators Force the matching to match entire words only. Pass null otherwise.
* @param captureMatches The result will contain the captured groups.
* @param limitResultCount Limit the number of results
* @return The ranges where the matches are. It is empty if no matches have been found.
*/
findMatches(searchString: string, searchScope: IRange, isRegex: boolean, matchCase: boolean, wordSeparators: string | null, captureMatches: boolean, limitResultCount?: number): FindMatch[];
/**
* Search the model for the next match. Loops to the beginning of the model if needed.
* @param searchString The string used to search. If it is a regular expression, set `isRegex` to true.
* @param searchStart Start the searching at the specified position.
* @param isRegex Used to indicate that `searchString` is a regular expression.
* @param matchCase Force the matching to match lower/upper case exactly.
* @param wordSeparators Force the matching to match entire words only. Pass null otherwise.
* @param captureMatches The result will contain the captured groups.
* @return The range where the next match is. It is null if no next match has been found.
*/
findNextMatch(searchString: string, searchStart: IPosition, isRegex: boolean, matchCase: boolean, wordSeparators: string | null, captureMatches: boolean): FindMatch;
/**
* Search the model for the previous match. Loops to the end of the model if needed.
* @param searchString The string used to search. If it is a regular expression, set `isRegex` to true.
* @param searchStart Start the searching at the specified position.
* @param isRegex Used to indicate that `searchString` is a regular expression.
* @param matchCase Force the matching to match lower/upper case exactly.
* @param wordSeparators Force the matching to match entire words only. Pass null otherwise.
* @param captureMatches The result will contain the captured groups.
* @return The range where the previous match is. It is null if no previous match has been found.
*/
findPreviousMatch(searchString: string, searchStart: IPosition, isRegex: boolean, matchCase: boolean, wordSeparators: string | null, captureMatches: boolean): FindMatch;
/**
* Get the language associated with this model.
* @internal
*/
getLanguageIdentifier(): LanguageIdentifier;
/**
* Get the language associated with this model.
*/
getModeId(): string;
/**
* Get the word under or besides `position`.
* @param position The position to look for a word.
* @param skipSyntaxTokens Ignore syntax tokens, as identified by the mode.
* @return The word under or besides `position`. Might be null.
*/
getWordAtPosition(position: IPosition): IWordAtPosition;
/**
* Get the word under or besides `position` trimmed to `position`.column
* @param position The position to look for a word.
* @param skipSyntaxTokens Ignore syntax tokens, as identified by the mode.
* @return The word under or besides `position`. Will never be null.
*/
getWordUntilPosition(position: IPosition): IWordAtPosition;
/**
* Force tokenization information for `lineNumber` to be accurate.
* @internal
*/
forceTokenization(lineNumber: number): void;
/**
* If it is cheap, force tokenization information for `lineNumber` to be accurate.
* This is based on a heuristic.
* @internal
*/
tokenizeIfCheap(lineNumber: number): void;
/**
* Check if calling `forceTokenization` for this `lineNumber` will be cheap (time-wise).
* This is based on a heuristic.
* @internal
*/
isCheapToTokenize(lineNumber: number): boolean;
/**
* Get the tokens for the line `lineNumber`.
* The tokens might be inaccurate. Use `forceTokenization` to ensure accurate tokens.
* @internal
*/
getLineTokens(lineNumber: number): LineTokens;
/**
* Get the language associated with this model.
* @internal
*/
getLanguageIdentifier(): LanguageIdentifier;
/**
* Get the language associated with this model.
*/
getModeId(): string;
/**
* Set the current language mode associated with the model.
* @internal
*/
setMode(languageIdentifier: LanguageIdentifier): void;
/**
* Returns the real (inner-most) language mode at a given position.
* The result might be inaccurate. Use `forceTokenization` to ensure accurate tokens.
* @internal
*/
getLanguageIdAtPosition(lineNumber: number, column: number): LanguageId;
/**
* Get the word under or besides `position`.
* @param position The position to look for a word.
* @param skipSyntaxTokens Ignore syntax tokens, as identified by the mode.
* @return The word under or besides `position`. Might be null.
*/
getWordAtPosition(position: IPosition): IWordAtPosition;
/**
* Get the word under or besides `position` trimmed to `position`.column
* @param position The position to look for a word.
* @param skipSyntaxTokens Ignore syntax tokens, as identified by the mode.
* @return The word under or besides `position`. Will never be null.
*/
getWordUntilPosition(position: IPosition): IWordAtPosition;
/**
* Find the matching bracket of `request` up, counting brackets.
* @param request The bracket we're searching for
* @param position The position at which to start the search.
* @return The range of the matching bracket, or null if the bracket match was not found.
* @internal
*/
findMatchingBracketUp(bracket: string, position: IPosition): Range;
/**
* Find the first bracket in the model before `position`.
* @param position The position at which to start the search.
* @return The info for the first bracket before `position`, or null if there are no more brackets before `positions`.
* @internal
*/
findPrevBracket(position: IPosition): IFoundBracket;
/**
* Find the first bracket in the model after `position`.
* @param position The position at which to start the search.
* @return The info for the first bracket after `position`, or null if there are no more brackets after `positions`.
* @internal
*/
findNextBracket(position: IPosition): IFoundBracket;
/**
* Given a `position`, if the position is on top or near a bracket,
* find the matching bracket of that bracket and return the ranges of both brackets.
* @param position The position at which to look for a bracket.
* @internal
*/
matchBracket(position: IPosition): [Range, Range];
/**
* @internal
*/
getLinesIndentGuides(startLineNumber: number, endLineNumber: number): number[];
/**
* Change the decorations. The callback will be called with a change accessor
* that becomes invalid as soon as the callback finishes executing.
* This allows for all events to be queued up until the change
* is completed. Returns whatever the callback returns.
* @param ownerId Identifies the editor id in which these decorations should appear. If no `ownerId` is provided, the decorations will appear in all editors that attach this model.
* @internal
*/
changeDecorations<T>(callback: (changeAccessor: IModelDecorationsChangeAccessor) => T, ownerId?: number): T;
/**
* Perform a minimum ammount of operations, in order to transform the decorations
* identified by `oldDecorations` to the decorations described by `newDecorations`
* and returns the new identifiers associated with the resulting decorations.
*
* @param oldDecorations Array containing previous decorations identifiers.
* @param newDecorations Array describing what decorations should result after the call.
* @param ownerId Identifies the editor id in which these decorations should appear. If no `ownerId` is provided, the decorations will appear in all editors that attach this model.
* @return An array containing the new decorations identifiers.
*/
deltaDecorations(oldDecorations: string[], newDecorations: IModelDeltaDecoration[], ownerId?: number): string[];
/**
* Remove all decorations that have been added with this specific ownerId.
* @param ownerId The owner id to search for.
* @internal
*/
removeAllDecorationsWithOwnerId(ownerId: number): void;
/**
* Get the options associated with a decoration.
* @param id The decoration id.
* @return The decoration options or null if the decoration was not found.
*/
getDecorationOptions(id: string): IModelDecorationOptions;
/**
* Get the range associated with a decoration.
* @param id The decoration id.
* @return The decoration range or null if the decoration was not found.
*/
getDecorationRange(id: string): Range;
/**
* Gets all the decorations for the line `lineNumber` as an array.
* @param lineNumber The line number
* @param ownerId If set, it will ignore decorations belonging to other owners.
* @param filterOutValidation If set, it will ignore decorations specific to validation (i.e. warnings, errors).
* @return An array with the decorations
*/
getLineDecorations(lineNumber: number, ownerId?: number, filterOutValidation?: boolean): IModelDecoration[];
/**
* Gets all the decorations for the lines between `startLineNumber` and `endLineNumber` as an array.
* @param startLineNumber The start line number
* @param endLineNumber The end line number
* @param ownerId If set, it will ignore decorations belonging to other owners.
* @param filterOutValidation If set, it will ignore decorations specific to validation (i.e. warnings, errors).
* @return An array with the decorations
*/
getLinesDecorations(startLineNumber: number, endLineNumber: number, ownerId?: number, filterOutValidation?: boolean): IModelDecoration[];
/**
* Gets all the deocorations in a range as an array. Only `startLineNumber` and `endLineNumber` from `range` are used for filtering.
* So for now it returns all the decorations on the same line as `range`.
* @param range The range to search in
* @param ownerId If set, it will ignore decorations belonging to other owners.
* @param filterOutValidation If set, it will ignore decorations specific to validation (i.e. warnings, errors).
* @return An array with the decorations
*/
getDecorationsInRange(range: IRange, ownerId?: number, filterOutValidation?: boolean): IModelDecoration[];
/**
* Gets all the decorations as an array.
* @param ownerId If set, it will ignore decorations belonging to other owners.
* @param filterOutValidation If set, it will ignore decorations specific to validation (i.e. warnings, errors).
*/
getAllDecorations(ownerId?: number, filterOutValidation?: boolean): IModelDecoration[];
/**
* Gets all the decorations that should be rendered in the overview ruler as an array.
* @param ownerId If set, it will ignore decorations belonging to other owners.
* @param filterOutValidation If set, it will ignore decorations specific to validation (i.e. warnings, errors).
*/
getOverviewRulerDecorations(ownerId?: number, filterOutValidation?: boolean): IModelDecoration[];
/**
* @internal
*/
_getTrackedRange(id: string): Range;
/**
* @internal
*/
_setTrackedRange(id: string, newRange: Range, newStickiness: TrackedRangeStickiness): string;
/**
* Normalize a string containing whitespace according to indentation rules (converts to spaces or to tabs).
*/
normalizeIndentation(str: string): string;
/**
* Get what is considered to be one indent (e.g. a tab character or 4 spaces, etc.).
*/
getOneIndent(): string;
/**
* Change the options of this model.
*/
updateOptions(newOpts: ITextModelUpdateOptions): void;
/**
* Detect the indentation options for this model from its content.
*/
detectIndentation(defaultInsertSpaces: boolean, defaultTabSize: number): void;
/**
* Push a stack element onto the undo stack. This acts as an undo/redo point.
* The idea is to use `pushEditOperations` to edit the model and then to
* `pushStackElement` to create an undo/redo stop point.
*/
pushStackElement(): void;
/**
* Push edit operations, basically editing the model. This is the preferred way
* of editing the model. The edit operations will land on the undo stack.
* @param beforeCursorState The cursor state before the edit operaions. This cursor state will be returned when `undo` or `redo` are invoked.
* @param editOperations The edit operations.
* @param cursorStateComputer A callback that can compute the resulting cursors state after the edit operations have been executed.
* @return The cursor state returned by the `cursorStateComputer`.
*/
pushEditOperations(beforeCursorState: Selection[], editOperations: IIdentifiedSingleEditOperation[], cursorStateComputer: ICursorStateComputer): Selection[];
/**
* Edit the model without adding the edits to the undo stack.
* This can have dire consequences on the undo stack! See @pushEditOperations for the preferred way.
* @param operations The edit operations.
* @return The inverse edit operations, that, when applied, will bring the model back to the previous state.
*/
applyEdits(operations: IIdentifiedSingleEditOperation[]): IIdentifiedSingleEditOperation[];
/**
* Undo edit operations until the first previous stop point created by `pushStackElement`.
* The inverse edit operations will be pushed on the redo stack.
* @internal
*/