From 1707726927dccac2372313fb478b9a3226ab391c Mon Sep 17 00:00:00 2001 From: yoyo930021 Date: Thu, 26 Mar 2020 18:58:12 +0800 Subject: [PATCH 1/3] Fix object property completion when have hyphen --- server/src/modes/script/javascript.ts | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/server/src/modes/script/javascript.ts b/server/src/modes/script/javascript.ts index 61403ab1b6..3d446d29c6 100644 --- a/server/src/modes/script/javascript.ts +++ b/server/src/modes/script/javascript.ts @@ -25,7 +25,8 @@ import { MarkupContent, CodeAction, CodeActionKind, - WorkspaceEdit + WorkspaceEdit, + InsertTextFormat } from 'vscode-languageserver-types'; import { LanguageMode } from '../../embeddedSupport/languageModes'; import { VueDocumentRegions, LanguageRange } from '../../embeddedSupport/embeddedSupport'; @@ -157,17 +158,29 @@ export async function getJavascriptMode( const entries = completions.entries.filter(entry => entry.name !== '__vueEditorBridge'); return { isIncomplete: false, - items: entries.map((entry, index) => { + items: entries.map(entry => { const range = entry.replacementSpan && convertRange(scriptDoc, entry.replacementSpan); + const filterText = entry.insertText && range && entry.insertText[0] === '[' ? '.' + entry.name : undefined; const { label, detail } = calculateLabelAndDetailTextForPathImport(entry); + const kind = toCompletionItemKind(entry.kind); + const insertTextFormat = + kind === CompletionItemKind.Function || kind === CompletionItemKind.Method + ? InsertTextFormat.Snippet + : undefined; + const insertText = entry.insertText || entry.name; + return { uri: doc.uri, position, + preselect: entry.isRecommended ? true : undefined, label, detail, - sortText: entry.sortText + index, + filterText, + insertTextFormat, + sortText: entry.sortText, kind: toCompletionItemKind(entry.kind), - textEdit: range && TextEdit.replace(range, entry.name), + textEdit: range && TextEdit.replace(range, insertText), + insertText: range ? undefined : insertText, data: { // data used for resolving item details (see 'doResolve') languageId: scriptDoc.languageId, From fcd97a63af9fb823214e240bae685611ca546abb Mon Sep 17 00:00:00 2001 From: Pine Wu Date: Fri, 31 Jul 2020 17:04:55 +0800 Subject: [PATCH 2/3] A simpler fix --- server/src/modes/script/javascript.ts | 48 +++++++++++++++++---------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/server/src/modes/script/javascript.ts b/server/src/modes/script/javascript.ts index 3d446d29c6..69462dc23d 100644 --- a/server/src/modes/script/javascript.ts +++ b/server/src/modes/script/javascript.ts @@ -25,8 +25,7 @@ import { MarkupContent, CodeAction, CodeActionKind, - WorkspaceEdit, - InsertTextFormat + WorkspaceEdit } from 'vscode-languageserver-types'; import { LanguageMode } from '../../embeddedSupport/languageModes'; import { VueDocumentRegions, LanguageRange } from '../../embeddedSupport/embeddedSupport'; @@ -158,29 +157,19 @@ export async function getJavascriptMode( const entries = completions.entries.filter(entry => entry.name !== '__vueEditorBridge'); return { isIncomplete: false, - items: entries.map(entry => { + items: entries.map((entry, index) => { const range = entry.replacementSpan && convertRange(scriptDoc, entry.replacementSpan); - const filterText = entry.insertText && range && entry.insertText[0] === '[' ? '.' + entry.name : undefined; const { label, detail } = calculateLabelAndDetailTextForPathImport(entry); - const kind = toCompletionItemKind(entry.kind); - const insertTextFormat = - kind === CompletionItemKind.Function || kind === CompletionItemKind.Method - ? InsertTextFormat.Snippet - : undefined; - const insertText = entry.insertText || entry.name; - return { uri: doc.uri, position, - preselect: entry.isRecommended ? true : undefined, label, detail, - filterText, - insertTextFormat, - sortText: entry.sortText, + filterText: getFilterText(entry.insertText), + sortText: entry.sortText + index, kind: toCompletionItemKind(entry.kind), - textEdit: range && TextEdit.replace(range, insertText), - insertText: range ? undefined : insertText, + textEdit: range && TextEdit.replace(range, entry.name), + insertText: entry.insertText, data: { // data used for resolving item details (see 'doResolve') languageId: scriptDoc.languageId, @@ -736,3 +725,28 @@ function convertTSDiagnosticCategoryToDiagnosticSeverity(c: ts.DiagnosticCategor return DiagnosticSeverity.Hint; } } + +/* tslint:disable:max-line-length */ +/** + * Adapted from https://github.com/microsoft/vscode/blob/2b090abd0fdab7b21a3eb74be13993ad61897f84/extensions/typescript-language-features/src/languageFeatures/completions.ts#L147-L181 + */ +function getFilterText(insertText: string | undefined): string | undefined { + // For `this.` completions, generally don't set the filter text since we don't want them to be overly prioritized. #74164 + if (insertText?.startsWith('this.')) { + return undefined; + } + + // Handle the case: + // ``` + // const xyz = { 'ab c': 1 }; + // xyz.ab| + // ``` + // In which case we want to insert a bracket accessor but should use `.abc` as the filter text instead of + // the bracketed insert text. + else if (insertText?.startsWith('[')) { + return insertText.replace(/^\[['"](.+)[['"]\]$/, '.$1'); + } + + // In all other cases, fallback to using the insertText + return insertText; +} From 8efdb3e76d91ed637dad7de70aed323713a8489c Mon Sep 17 00:00:00 2001 From: Pine Wu Date: Fri, 31 Jul 2020 17:12:29 +0800 Subject: [PATCH 3/3] Add test for hyphen property --- test/lsp/features/completion/script.test.ts | 18 +++++++++++------- test/lsp/fixture/completion/script/Hyphen.vue | 8 ++++++++ 2 files changed, 19 insertions(+), 7 deletions(-) create mode 100644 test/lsp/fixture/completion/script/Hyphen.vue diff --git a/test/lsp/features/completion/script.test.ts b/test/lsp/features/completion/script.test.ts index 9b5d4dc633..cae8b4d817 100644 --- a/test/lsp/features/completion/script.test.ts +++ b/test/lsp/features/completion/script.test.ts @@ -1,28 +1,32 @@ -import { activateLS, showFile } from '../../helper'; +import { activateLS } from '../../helper'; import { position, getDocUri } from '../../util'; import { testCompletion } from './helper'; describe('Should autocomplete for \ No newline at end of file