提交 5a38563b 编写于 作者: J Johannes Rieken

fix #60247

上级 e3062841
...@@ -360,6 +360,8 @@ export class SnippetSuggestion implements CompletionItem { ...@@ -360,6 +360,8 @@ export class SnippetSuggestion implements CompletionItem {
export class SnippetSuggestProvider implements CompletionItemProvider { export class SnippetSuggestProvider implements CompletionItemProvider {
private static readonly _maxPrefix = 10000;
constructor( constructor(
@IModeService private readonly _modeService: IModeService, @IModeService private readonly _modeService: IModeService,
@ISnippetsService private readonly _snippets: ISnippetsService @ISnippetsService private readonly _snippets: ISnippetsService
...@@ -369,14 +371,17 @@ export class SnippetSuggestProvider implements CompletionItemProvider { ...@@ -369,14 +371,17 @@ export class SnippetSuggestProvider implements CompletionItemProvider {
provideCompletionItems(model: ITextModel, position: Position, context: CompletionContext): Promise<CompletionList> { provideCompletionItems(model: ITextModel, position: Position, context: CompletionContext): Promise<CompletionList> {
if (position.column >= SnippetSuggestProvider._maxPrefix) {
return undefined;
}
const languageId = this._getLanguageIdAtPosition(model, position); const languageId = this._getLanguageIdAtPosition(model, position);
return this._snippets.getSnippets(languageId).then(snippets => { return this._snippets.getSnippets(languageId).then(snippets => {
let suggestions: SnippetSuggestion[]; let suggestions: SnippetSuggestion[];
let shift = Math.max(0, position.column - 100); let pos = { lineNumber: position.lineNumber, column: 1 };
let pos = { lineNumber: position.lineNumber, column: Math.max(1, position.column - 100) };
let lineOffsets: number[] = []; let lineOffsets: number[] = [];
let linePrefixLow = model.getLineContent(position.lineNumber).substr(Math.max(0, position.column - 100), position.column - 1).toLowerCase(); let linePrefixLow = model.getLineContent(position.lineNumber).substr(0, position.column - 1).toLowerCase();
while (pos.column < position.column) { while (pos.column < position.column) {
let word = model.getWordAtPosition(pos); let word = model.getWordAtPosition(pos);
...@@ -407,7 +412,6 @@ export class SnippetSuggestProvider implements CompletionItemProvider { ...@@ -407,7 +412,6 @@ export class SnippetSuggestProvider implements CompletionItemProvider {
let consumed = new Set<Snippet>(); let consumed = new Set<Snippet>();
suggestions = []; suggestions = [];
for (let start of lineOffsets) { for (let start of lineOffsets) {
start -= shift;
for (const snippet of snippets) { for (const snippet of snippets) {
if (!consumed.has(snippet) && matches(linePrefixLow, start, snippet.prefixLow, 0)) { if (!consumed.has(snippet) && matches(linePrefixLow, start, snippet.prefixLow, 0)) {
suggestions.push(new SnippetSuggestion(snippet, Range.fromPositions(position.delta(0, -(linePrefixLow.length - start)), position))); suggestions.push(new SnippetSuggestion(snippet, Range.fromPositions(position.delta(0, -(linePrefixLow.length - start)), position)));
......
...@@ -310,4 +310,23 @@ suite('SnippetsService', function () { ...@@ -310,4 +310,23 @@ suite('SnippetsService', function () {
assert.equal(result.suggestions.length, 1); assert.equal(result.suggestions.length, 1);
assert.equal(result.suggestions[0].label, 'mytemplate'); assert.equal(result.suggestions[0].label, 'mytemplate');
}); });
test('No snippets suggestion beyond character 100 if not at end of line #60247', async function () {
snippetService = new SimpleSnippetService([new Snippet(
['fooLang'],
'bug',
'bug',
'',
'second',
'',
SnippetSource.User
)]);
const provider = new SnippetSuggestProvider(modeService, snippetService);
let model = TextModel.createFromString('Thisisaverylonglinegoingwithmore100bcharactersandthismakesintellisensebecomea Thisisaverylonglinegoingwithmore100bcharactersandthismakesintellisensebecomea b text_after_b', undefined, modeService.getLanguageIdentifier('fooLang'));
let result = await provider.provideCompletionItems(model, new Position(1, 158), suggestContext);
assert.equal(result.suggestions.length, 1);
});
}); });
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册