Skip to content

Commit d00e5cb

Browse files
committed
debt - replace CompletionItem#overwriteBefore/After with CompletionItem#range
1 parent 504ab3b commit d00e5cb

18 files changed

Lines changed: 106 additions & 69 deletions

File tree

src/vs/editor/common/core/position.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,30 @@ export class Position {
3636
this.column = column;
3737
}
3838

39+
/**
40+
* Create a new postion from this position.
41+
*
42+
* @param newLineNumber new line number
43+
* @param newColumn new column
44+
*/
45+
with(newLineNumber: number = this.lineNumber, newColumn: number = this.column): Position {
46+
if (newLineNumber === this.lineNumber && newColumn === this.column) {
47+
return this;
48+
} else {
49+
return new Position(newLineNumber, newColumn);
50+
}
51+
}
52+
53+
/**
54+
* Derive a new position from this position.
55+
*
56+
* @param deltaLineNumber line number delta
57+
* @param deltaColumn column delta
58+
*/
59+
delta(deltaLineNumber: number = 0, deltaColumn: number = 0): Position {
60+
return this.with(this.lineNumber + deltaLineNumber, this.column + deltaColumn);
61+
}
62+
3963
/**
4064
* Test if this position equals other position
4165
*/

src/vs/editor/common/modes.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -366,21 +366,20 @@ export let completionKindFromLegacyString = (function () {
366366
*/
367367
export interface CompletionItem {
368368
label: string;
369-
insertText: string;
370-
insertTextIsSnippet?: boolean;
371369
kind: CompletionKind;
372370
detail?: string;
373371
documentation?: string | IMarkdownString;
374-
filterText?: string;
375372
sortText?: string;
373+
filterText?: string;
376374
preselect?: boolean;
375+
insertText: string;
376+
insertTextIsSnippet?: boolean;
377+
noWhitespaceAdjust?: boolean;
378+
range?: IRange;
377379
noAutoAccept?: boolean;
378380
commitCharacters?: string[];
379-
overwriteBefore?: number;
380-
overwriteAfter?: number;
381381
additionalTextEdits?: model.ISingleEditOperation[];
382382
command?: Command;
383-
noWhitespaceAdjust?: boolean;
384383
}
385384

386385
/**

src/vs/editor/common/services/editorSimpleWorker.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -462,10 +462,10 @@ export abstract class BaseEditorSimpleWorker {
462462
if (model) {
463463
const suggestions: CompletionItem[] = [];
464464
const wordDefRegExp = new RegExp(wordDef, wordDefFlags);
465-
const currentWord = model.getWordUntilPosition(position, wordDefRegExp).word;
465+
const currentWord = model.getWordUntilPosition(position, wordDefRegExp);
466466

467467
const seen: Record<string, boolean> = Object.create(null);
468-
seen[currentWord] = true;
468+
seen[currentWord.word] = true;
469469

470470
for (
471471
let iter = model.createWordIterator(wordDefRegExp), e = iter.next();
@@ -486,7 +486,7 @@ export abstract class BaseEditorSimpleWorker {
486486
label: word,
487487
insertText: word,
488488
noAutoAccept: true,
489-
overwriteBefore: currentWord.length
489+
range: { startLineNumber: position.lineNumber, startColumn: currentWord.startColumn, endLineNumber: position.lineNumber, endColumn: currentWord.endColumn }
490490
});
491491
}
492492

src/vs/editor/contrib/suggest/completionModel.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,8 @@ export class CompletionModel {
175175
// 'word' is that remainder of the current line that we
176176
// filter and score against. In theory each suggestion uses a
177177
// different word, but in practice not - that's why we cache
178-
const wordLen = suggestion.overwriteBefore + characterCountDelta - (item.position.column - this._column);
178+
const overwriteBefore = item.position.column - suggestion.range.startColumn;
179+
const wordLen = overwriteBefore + characterCountDelta - (item.position.column - this._column);
179180
if (word.length !== wordLen) {
180181
word = wordLen === 0 ? '' : leadingLineContent.slice(-wordLen);
181182
}
@@ -198,7 +199,7 @@ export class CompletionModel {
198199
// if it matches we check with the label to compute highlights
199200
// and if that doesn't yield a result we have no highlights,
200201
// despite having the match
201-
let match = scoreFn(word, suggestion.filterText, suggestion.overwriteBefore);
202+
let match = scoreFn(word, suggestion.filterText, overwriteBefore);
202203
if (!match) {
203204
continue;
204205
}
@@ -207,7 +208,7 @@ export class CompletionModel {
207208

208209
} else {
209210
// by default match `word` against the `label`
210-
let match = scoreFn(word, suggestion.label, suggestion.overwriteBefore);
211+
let match = scoreFn(word, suggestion.label, overwriteBefore);
211212
if (match) {
212213
item.score = match[0];
213214
item.matches = match[1];

src/vs/editor/contrib/suggest/suggest.ts

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { Position, IPosition } from 'vs/editor/common/core/position';
1616
import { RawContextKey } from 'vs/platform/contextkey/common/contextkey';
1717
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
1818
import { CancellationToken } from 'vs/base/common/cancellation';
19+
import { Range } from 'vs/editor/common/core/range';
1920

2021
export const Context = {
2122
Visible: new RawContextKey<boolean>('suggestWidgetVisible', false),
@@ -59,6 +60,9 @@ export function provideSuggestionItems(
5960
const allSuggestions: ISuggestionItem[] = [];
6061
const acceptSuggestion = createSuggesionFilter(snippetConfig);
6162

63+
const wordUntil = model.getWordUntilPosition(position);
64+
const defaultRange = new Range(position.lineNumber, wordUntil.startColumn, position.lineNumber, wordUntil.endColumn);
65+
6266
position = position.clone();
6367

6468
// get provider groups, always add snippet suggestion provider
@@ -90,7 +94,9 @@ export function provideSuggestionItems(
9094
for (let suggestion of container.suggestions) {
9195
if (acceptSuggestion(suggestion)) {
9296

93-
fixOverwriteBeforeAfter(suggestion, container);
97+
if (!suggestion.range) {
98+
suggestion.range = defaultRange;
99+
}
94100

95101
allSuggestions.push({
96102
position,
@@ -131,15 +137,6 @@ export function provideSuggestionItems(
131137
return result;
132138
}
133139

134-
function fixOverwriteBeforeAfter(suggestion: CompletionItem, container: CompletionList): void {
135-
if (typeof suggestion.overwriteBefore !== 'number') {
136-
suggestion.overwriteBefore = 0;
137-
}
138-
if (typeof suggestion.overwriteAfter !== 'number' || suggestion.overwriteAfter < 0) {
139-
suggestion.overwriteAfter = 0;
140-
}
141-
}
142-
143140
function createSuggestionResolver(provider: CompletionItemProvider, suggestion: CompletionItem, model: ITextModel, position: Position): (token: CancellationToken) => Promise<void> {
144141
return (token) => {
145142
if (typeof provider.resolveCompletionItem === 'function') {

src/vs/editor/contrib/suggest/suggestController.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ export class SuggestController implements IEditorContribution {
165165
this._toDispose.push(this._widget.onDidFocus(({ item }) => {
166166

167167
const position = this._editor.getPosition();
168-
const startColumn = item.position.column - item.suggestion.overwriteBefore;
168+
const startColumn = item.suggestion.range.startColumn;
169169
const endColumn = position.column;
170170
let value = true;
171171
if (
@@ -236,10 +236,13 @@ export class SuggestController implements IEditorContribution {
236236
insertText = SnippetParser.escape(insertText);
237237
}
238238

239+
const overwriteBefore = position.column - suggestion.range.startColumn;
240+
const overwriteAfter = suggestion.range.endColumn - position.column;
241+
239242
SnippetController2.get(this._editor).insert(
240243
insertText,
241-
suggestion.overwriteBefore + columnDelta,
242-
suggestion.overwriteAfter,
244+
overwriteBefore + columnDelta,
245+
overwriteAfter,
243246
false, false,
244247
!suggestion.noWhitespaceAdjust
245248
);
@@ -310,7 +313,7 @@ export class SuggestController implements IEditorContribution {
310313
return true;
311314
}
312315
const position = this._editor.getPosition();
313-
const startColumn = item.position.column - item.suggestion.overwriteBefore;
316+
const startColumn = item.suggestion.range.startColumn;
314317
const endColumn = position.column;
315318
if (endColumn - startColumn !== item.suggestion.insertText.length) {
316319
// unequal lengths -> makes edit

src/vs/editor/contrib/suggest/test/completionModel.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export function createSuggestItem(label: string, overwriteBefore: number, kind =
1919

2020
suggestion: CompletionItem = {
2121
label,
22-
overwriteBefore,
22+
range: { startLineNumber: position.lineNumber, startColumn: position.column - overwriteBefore, endLineNumber: position.lineNumber, endColumn: position.column },
2323
insertText: label,
2424
kind
2525
};

src/vs/editor/contrib/suggest/test/suggestModel.test.ts

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,7 @@ suite('SuggestModel - TriggerAndCancelOracle', function () {
356356
label: 'foo.bar',
357357
kind: CompletionKind.Property,
358358
insertText: 'foo.bar',
359-
overwriteBefore: pos.column - 1
359+
range: Range.fromPositions(pos.with(undefined, 1), pos)
360360
}]
361361
};
362362
}
@@ -371,7 +371,10 @@ suite('SuggestModel - TriggerAndCancelOracle', function () {
371371
label: 'boom',
372372
kind: CompletionKind.Property,
373373
insertText: 'boom',
374-
overwriteBefore: doc.getLineContent(pos.lineNumber)[pos.column - 2] === '.' ? 0 : pos.column - 1
374+
range: Range.fromPositions(
375+
pos.delta(0, doc.getLineContent(pos.lineNumber)[pos.column - 2] === '.' ? 0 : -1),
376+
pos
377+
)
375378
}]
376379
};
377380
}
@@ -465,7 +468,7 @@ suite('SuggestModel - TriggerAndCancelOracle', function () {
465468
label: 'foo',
466469
kind: CompletionKind.Property,
467470
insertText: 'foo',
468-
overwriteBefore: pos.column - 1
471+
range: Range.fromPositions(pos.with(undefined, 1), pos)
469472
}]
470473
};
471474
}
@@ -502,7 +505,7 @@ suite('SuggestModel - TriggerAndCancelOracle', function () {
502505
label: 'foo;',
503506
kind: CompletionKind.Property,
504507
insertText: 'foo',
505-
overwriteBefore: pos.column - 1
508+
range: Range.fromPositions(pos.with(undefined, 1), pos)
506509
}]
507510
};
508511
}
@@ -549,7 +552,7 @@ suite('SuggestModel - TriggerAndCancelOracle', function () {
549552
label: 'foo.bar',
550553
kind: CompletionKind.Property,
551554
insertText: 'foo.bar',
552-
overwriteBefore: pos.column - 1
555+
range: Range.fromPositions(pos.with(undefined, 1), pos)
553556
}
554557
]
555558
};
@@ -578,12 +581,12 @@ suite('SuggestModel - TriggerAndCancelOracle', function () {
578581
label: 'abc',
579582
kind: CompletionKind.Property,
580583
insertText: 'abc',
581-
overwriteBefore: pos.column - 1
584+
range: Range.fromPositions(pos.with(undefined, 1), pos)
582585
}, {
583586
label: 'äbc',
584587
kind: CompletionKind.Property,
585588
insertText: 'äbc',
586-
overwriteBefore: pos.column - 1
589+
range: Range.fromPositions(pos.with(undefined, 1), pos)
587590
}]
588591
};
589592
}
@@ -650,7 +653,7 @@ suite('SuggestModel - TriggerAndCancelOracle', function () {
650653
label: 'bar',
651654
kind: CompletionKind.Property,
652655
insertText: 'bar',
653-
overwriteBefore: 2,
656+
range: Range.fromPositions(pos.delta(0, -2), pos),
654657
additionalTextEdits: [{
655658
text: ', bar',
656659
range: { startLineNumber: 1, endLineNumber: 1, startColumn: 17, endColumn: 17 }

src/vs/editor/standalone/browser/standaloneLanguages.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -759,11 +759,9 @@ class SuggestAdapter {
759759

760760
// insert the text of the edit and create a dedicated
761761
// suggestion-container with overwrite[Before|After]
762-
suggestion.overwriteBefore = position.column - editRange.startColumn;
763-
suggestion.overwriteAfter = editRange.endColumn - position.column;
762+
suggestion.range = editRange;
764763
} else {
765-
suggestion.overwriteBefore = position.column - wordStartPos.column;
766-
suggestion.overwriteAfter = 0;
764+
suggestion.range = { startLineNumber: position.lineNumber, startColumn: wordStartPos.column, endLineNumber: position.lineNumber, endColumn: position.column };
767765
}
768766
if (item.textEdit) {
769767
suggestion.insertText = item.textEdit.text;

src/vs/monaco.d.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -468,6 +468,20 @@ declare namespace monaco {
468468
*/
469469
readonly column: number;
470470
constructor(lineNumber: number, column: number);
471+
/**
472+
* Create a new postion from this position.
473+
*
474+
* @param newLineNumber new line number
475+
* @param newColumn new column
476+
*/
477+
with(newLineNumber?: number, newColumn?: number): Position;
478+
/**
479+
* Derive a new position from this position.
480+
*
481+
* @param deltaLineNumber line number delta
482+
* @param deltaColumn column delta
483+
*/
484+
delta(deltaLineNumber?: number, deltaColumn?: number): Position;
471485
/**
472486
* Test if this position equals other position
473487
*/

0 commit comments

Comments
 (0)