From 87e4638cf647384252382cda2f884cf375382649 Mon Sep 17 00:00:00 2001 From: Allison Chou Date: Tue, 20 Jun 2023 17:34:36 -0700 Subject: [PATCH 1/4] Fix Razor completion documentation --- .../Completion/RazorCompletionItemProvider.ts | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/razor/src/Completion/RazorCompletionItemProvider.ts b/src/razor/src/Completion/RazorCompletionItemProvider.ts index 029735744b..4ca196972a 100644 --- a/src/razor/src/Completion/RazorCompletionItemProvider.ts +++ b/src/razor/src/Completion/RazorCompletionItemProvider.ts @@ -13,7 +13,7 @@ import { getUriPath } from '../UriPaths'; import { ProvisionalCompletionOrchestrator } from './ProvisionalCompletionOrchestrator'; import { LanguageKind } from '../RPC/LanguageKind'; import { RoslynLanguageServer } from '../../../lsptoolshost/roslynLanguageServer'; -import { CompletionItem, CompletionParams, CompletionTriggerKind } from 'vscode-languageclient'; +import { CompletionItem, CompletionList, CompletionParams, CompletionTriggerKind } from 'vscode-languageclient'; import { UriConverter } from '../../../lsptoolshost/uriConverter'; import * as RazorConventions from '../RazorConventions'; import { MappingHelpers } from '../Mapping/MappingHelpers'; @@ -35,11 +35,6 @@ export class RazorCompletionItemProvider let completions: vscode.CompletionList | vscode.CompletionItem[]; - // For CSharp, completions need to keep the "data" field - // on the completion item for lazily resolving the edits in - // the resolveCompletionItem step. Using the vs code command - // drops that field because it doesn't exist in the declared vs code - // CompletionItem type. if (language === LanguageKind.CSharp) { const params: CompletionParams = { context: { @@ -71,6 +66,13 @@ export class RazorCompletionItemProvider completions instanceof Array ? completions // was vscode.CompletionItem[] : completions ? completions.items // was vscode.CompletionList : []; + + // For CSharp, completions need to keep the "data" field + // on the completion item for lazily resolving the edits in + // the resolveCompletionItem step. Using the vs code command + // drops that field because it doesn't exist in the declared vs code + // CompletionItem type. + const data = (completions)?.itemDefaults?.data; // There are times when the generated code will not line up with the content of the .razor/.cshtml file. // Therefore, we need to offset all completion items' characters by a certain amount in order @@ -79,7 +81,7 @@ export class RazorCompletionItemProvider const completionCharacterOffset = projectedPosition.character - hostDocumentPosition.character; for (const completionItem of completionItems) { const doc = completionItem.documentation as vscode.MarkdownString; - if (doc) { + if (doc && doc.value) { // Without this, the documentation doesn't get rendered in the editor. const newDoc = new vscode.MarkdownString(doc.value); newDoc.isTrusted = doc.isTrusted; @@ -128,6 +130,8 @@ export class RazorCompletionItemProvider completionItem.insertText = intellicodeCompletion.textEditText; } } + + (completionItem).data = data; } const isIncomplete = completions instanceof Array ? false @@ -204,6 +208,13 @@ export class RazorCompletionItemProvider item = newItem; + // The documentation object Roslyn returns can have a different + // shape than what the client expects, so we do a conversion here. + const markdownString = (item.documentation); + if (markdownString && markdownString.value) { + item.documentation = new vscode.MarkdownString(markdownString.value); + } + if (item.command && item.command.arguments?.length === 4) { let uri = vscode.Uri.parse(item.command.arguments[0]); @@ -238,4 +249,3 @@ function getTriggerKind(triggerKind: vscode.CompletionTriggerKind): CompletionTr } } - From 40ac6823ceef10e1526d600389b6d575c70d31cb Mon Sep 17 00:00:00 2001 From: Allison Chou Date: Wed, 21 Jun 2023 12:04:41 -0700 Subject: [PATCH 2/4] Review feedback --- .../src/Completion/RazorCompletionItemProvider.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/razor/src/Completion/RazorCompletionItemProvider.ts b/src/razor/src/Completion/RazorCompletionItemProvider.ts index 4ca196972a..b5a4a2c291 100644 --- a/src/razor/src/Completion/RazorCompletionItemProvider.ts +++ b/src/razor/src/Completion/RazorCompletionItemProvider.ts @@ -47,6 +47,11 @@ export class RazorCompletionItemProvider position: projectedPosition }; + // For CSharp, completions need to keep the "data" field on the + // completion item for lazily resolving the edits in the + // resolveCompletionItem step. Using the vs code command drops + // that field because it doesn't exist in the declared vs code + // CompletionItem type. completions = await vscode .commands .executeCommand( @@ -67,11 +72,6 @@ export class RazorCompletionItemProvider : completions ? completions.items // was vscode.CompletionList : []; - // For CSharp, completions need to keep the "data" field - // on the completion item for lazily resolving the edits in - // the resolveCompletionItem step. Using the vs code command - // drops that field because it doesn't exist in the declared vs code - // CompletionItem type. const data = (completions)?.itemDefaults?.data; // There are times when the generated code will not line up with the content of the .razor/.cshtml file. @@ -131,7 +131,9 @@ export class RazorCompletionItemProvider } } - (completionItem).data = data; + if (!(completionItem).data) { + (completionItem).data = data; + } } const isIncomplete = completions instanceof Array ? false From 19fc69d149c3bdebc8b722ff7a87117b057d00e5 Mon Sep 17 00:00:00 2001 From: Allison Chou Date: Wed, 21 Jun 2023 16:19:45 -0700 Subject: [PATCH 3/4] Review comments --- .../src/Completion/RazorCompletionItemProvider.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/razor/src/Completion/RazorCompletionItemProvider.ts b/src/razor/src/Completion/RazorCompletionItemProvider.ts index b5a4a2c291..c20bda8ab1 100644 --- a/src/razor/src/Completion/RazorCompletionItemProvider.ts +++ b/src/razor/src/Completion/RazorCompletionItemProvider.ts @@ -13,7 +13,7 @@ import { getUriPath } from '../UriPaths'; import { ProvisionalCompletionOrchestrator } from './ProvisionalCompletionOrchestrator'; import { LanguageKind } from '../RPC/LanguageKind'; import { RoslynLanguageServer } from '../../../lsptoolshost/roslynLanguageServer'; -import { CompletionItem, CompletionList, CompletionParams, CompletionTriggerKind } from 'vscode-languageclient'; +import { CompletionItem, CompletionList, CompletionParams, CompletionTriggerKind, MarkupContent } from 'vscode-languageclient'; import { UriConverter } from '../../../lsptoolshost/uriConverter'; import * as RazorConventions from '../RazorConventions'; import { MappingHelpers } from '../Mapping/MappingHelpers'; @@ -210,11 +210,11 @@ export class RazorCompletionItemProvider item = newItem; - // The documentation object Roslyn returns can have a different - // shape than what the client expects, so we do a conversion here. - const markdownString = (item.documentation); - if (markdownString && markdownString.value) { - item.documentation = new vscode.MarkdownString(markdownString.value); + // The documentation object Roslyn returns is a MarkupContent, + // which we need to convert to a MarkupString. + const markupContent = ((item.documentation)); + if (markupContent && markupContent.value) { + item.documentation = new vscode.MarkdownString(markupContent.value); } if (item.command && item.command.arguments?.length === 4) { From efcdbf206073efed496cf844e5235429130ac242 Mon Sep 17 00:00:00 2001 From: Allison Chou Date: Wed, 21 Jun 2023 16:26:09 -0700 Subject: [PATCH 4/4] Review comments --- src/razor/src/Completion/RazorCompletionItemProvider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/razor/src/Completion/RazorCompletionItemProvider.ts b/src/razor/src/Completion/RazorCompletionItemProvider.ts index c20bda8ab1..a4c177ac22 100644 --- a/src/razor/src/Completion/RazorCompletionItemProvider.ts +++ b/src/razor/src/Completion/RazorCompletionItemProvider.ts @@ -211,7 +211,7 @@ export class RazorCompletionItemProvider item = newItem; // The documentation object Roslyn returns is a MarkupContent, - // which we need to convert to a MarkupString. + // which we need to convert to a MarkdownString. const markupContent = ((item.documentation)); if (markupContent && markupContent.value) { item.documentation = new vscode.MarkdownString(markupContent.value);