From 5995c10e01e66272260df3779b31b16ae45e862c Mon Sep 17 00:00:00 2001 From: David Wengier Date: Thu, 4 May 2023 17:25:27 +1000 Subject: [PATCH 1/2] Update to use the new formatting method names, and fix range bug --- src/razor/src/Formatting/FormattingHandler.ts | 105 +++++++++++++++--- .../RazorDocumentRangeFormattingRequest.ts | 15 --- .../RazorDocumentRangeFormattingResponse.ts | 11 -- .../Formatting/RazorFormatOnTypeProvider.ts | 19 ---- .../src/Formatting/RazorFormattingFeature.ts | 73 ------------ .../SerializableFormattingParams.ts | 1 + .../SerializableOnTypeFormattingParams.ts | 16 +++ src/razor/src/extension.ts | 13 +-- 8 files changed, 106 insertions(+), 147 deletions(-) delete mode 100644 src/razor/src/Formatting/RazorDocumentRangeFormattingRequest.ts delete mode 100644 src/razor/src/Formatting/RazorDocumentRangeFormattingResponse.ts delete mode 100644 src/razor/src/Formatting/RazorFormatOnTypeProvider.ts delete mode 100644 src/razor/src/Formatting/RazorFormattingFeature.ts create mode 100644 src/razor/src/Formatting/SerializableOnTypeFormattingParams.ts diff --git a/src/razor/src/Formatting/FormattingHandler.ts b/src/razor/src/Formatting/FormattingHandler.ts index e278446ae..63eb4645f 100644 --- a/src/razor/src/Formatting/FormattingHandler.ts +++ b/src/razor/src/Formatting/FormattingHandler.ts @@ -5,20 +5,26 @@ import * as vscode from 'vscode'; import { RequestType } from 'vscode-languageclient'; +import { IRazorDocument } from '../Document/IRazorDocument'; import { RazorDocumentManager } from '../Document/RazorDocumentManager'; +import { RazorDocumentSynchronizer } from '../Document/RazorDocumentSynchronizer'; import { RazorLanguageServerClient } from '../RazorLanguageServerClient'; import { RazorLogger } from '../RazorLogger'; import { convertTextEditToSerializable, SerializableTextEdit } from '../RPC/SerializableTextEdit'; import { SerializableFormattingParams } from './SerializableFormattingParams'; import { SerializableFormattingResponse } from './SerializableFormattingResponse'; +import { SerializableOnTypeFormattingParams } from './SerializableOnTypeFormattingParams'; export class FormattingHandler { - private static readonly provideFormattingEndpoint = 'textDocument/formatting'; + private static readonly provideFormattingEndpoint = 'razor/htmlFormatting'; + private static readonly provideOnTypeFormattingEndpoint = 'razor/htmlOnTypeFormatting'; private formattingRequestType: RequestType = new RequestType(FormattingHandler.provideFormattingEndpoint); + private onTypeFormattingRequestType: RequestType = new RequestType(FormattingHandler.provideOnTypeFormattingEndpoint); private emptyFormattingResponse = new SerializableFormattingResponse(); constructor( private readonly documentManager: RazorDocumentManager, + private readonly documentSynchronizer: RazorDocumentSynchronizer, private readonly serverClient: RazorLanguageServerClient, private readonly logger: RazorLogger) { } @@ -27,6 +33,10 @@ export class FormattingHandler { this.serverClient.onRequestWithParams( this.formattingRequestType, async (request, token) => this.provideFormatting(request, token)); + // tslint:disable-next-line: no-floating-promises + this.serverClient.onRequestWithParams( + this.onTypeFormattingRequestType, + async (request, token) => this.provideOnTypeFormatting(request, token)); } private async provideFormatting( @@ -39,6 +49,12 @@ export class FormattingHandler { return this.emptyFormattingResponse; } + const textDocument = await vscode.workspace.openTextDocument(razorDocumentUri); + const synchronized = await this.documentSynchronizer.trySynchronizeProjectedDocument(textDocument, razorDocument.csharpDocument, formattingParams.hostDocumentVersion, cancellationToken); + if (!synchronized) { + return this.emptyFormattingResponse; + } + const virtualHtmlUri = razorDocument.htmlDocument.uri; const textEdits = await vscode.commands.executeCommand( @@ -50,24 +66,47 @@ export class FormattingHandler { return this.emptyFormattingResponse; } - const htmlDocText = razorDocument.htmlDocument.getContent(); - const zeroBasedLineCount = this.countLines(htmlDocText); - const serializableTextEdits = Array(); - for (let textEdit of textEdits) { - // The below workaround is needed due to a bug on the HTML side where - // they'll sometimes send us an end position that exceeds the length - // of the document. Tracked by https://github.com/microsoft/vscode/issues/175298. - if (textEdit.range.end.line > zeroBasedLineCount) { - const lastLineLength = this.getLastLineLength(htmlDocText); - const updatedEndPosition = new vscode.Position(zeroBasedLineCount, lastLineLength); - const updatedRange = new vscode.Range(textEdit.range.start, updatedEndPosition); - textEdit = new vscode.TextEdit(updatedRange, textEdit.newText); - } + const serializableTextEdits = this.sanitizeTextEdits(razorDocument, textEdits); + + return new SerializableFormattingResponse(serializableTextEdits); + } catch (error) { + this.logger.logWarning(`${FormattingHandler.provideFormattingEndpoint} failed with ${error}`); + } - const serializableTextEdit = convertTextEditToSerializable(textEdit); - serializableTextEdits.push(serializableTextEdit); + return this.emptyFormattingResponse; + } + + private async provideOnTypeFormatting( + formattingParams: SerializableOnTypeFormattingParams, + cancellationToken: vscode.CancellationToken) { + try { + const razorDocumentUri = vscode.Uri.parse(formattingParams.textDocument.uri); + const razorDocument = await this.documentManager.getDocument(razorDocumentUri); + if (razorDocument === undefined) { + return this.emptyFormattingResponse; } + const textDocument = await vscode.workspace.openTextDocument(razorDocumentUri); + const synchronized = await this.documentSynchronizer.trySynchronizeProjectedDocument(textDocument, razorDocument.csharpDocument, formattingParams.hostDocumentVersion, cancellationToken); + if (!synchronized) { + return this.emptyFormattingResponse; + } + + const virtualHtmlUri = razorDocument.htmlDocument.uri; + + const textEdits = await vscode.commands.executeCommand( + 'vscode.executeFormatOnTypeProvider', + virtualHtmlUri, + formattingParams.position, + formattingParams.ch, + formattingParams.options); + + if (textEdits === undefined) { + return this.emptyFormattingResponse; + } + + const serializableTextEdits = this.sanitizeTextEdits(razorDocument, textEdits); + return new SerializableFormattingResponse(serializableTextEdits); } catch (error) { this.logger.logWarning(`${FormattingHandler.provideFormattingEndpoint} failed with ${error}`); @@ -76,6 +115,38 @@ export class FormattingHandler { return this.emptyFormattingResponse; } + private sanitizeTextEdits(razorDocument: IRazorDocument, textEdits: vscode.TextEdit[]) { + const htmlDocText = razorDocument.htmlDocument.getContent(); + const zeroBasedLineCount = this.countLines(htmlDocText); + const serializableTextEdits = Array(); + for (let textEdit of textEdits) { + // The below workaround is needed due to a bug on the HTML side where + // they'll sometimes send us an end position that exceeds the length + // of the document. Tracked by https://github.com/microsoft/vscode/issues/175298. + if (textEdit.range.end.line > zeroBasedLineCount || + textEdit.range.start.line > zeroBasedLineCount) { + const lastLineLength = this.getLastLineLength(htmlDocText); + const updatedPosition = new vscode.Position(zeroBasedLineCount, lastLineLength); + + let start = textEdit.range.start; + let end = textEdit.range.end; + if (textEdit.range.start.line > zeroBasedLineCount) { + start = updatedPosition; + } + + if (textEdit.range.end.line > zeroBasedLineCount) { + end = updatedPosition; + } + const updatedRange = new vscode.Range(start, end); + textEdit = new vscode.TextEdit(updatedRange, textEdit.newText); + } + + const serializableTextEdit = convertTextEditToSerializable(textEdit); + serializableTextEdits.push(serializableTextEdit); + } + return serializableTextEdits; + } + private countLines(text: string) { let lineCount = 0; for (const i of text) { @@ -103,4 +174,4 @@ export class FormattingHandler { return currentLineLength; } -} \ No newline at end of file +} diff --git a/src/razor/src/Formatting/RazorDocumentRangeFormattingRequest.ts b/src/razor/src/Formatting/RazorDocumentRangeFormattingRequest.ts deleted file mode 100644 index 1d00da014..000000000 --- a/src/razor/src/Formatting/RazorDocumentRangeFormattingRequest.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* -------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - * ------------------------------------------------------------------------------------------ */ - -import * as vscode from 'vscode'; -import { LanguageKind } from '../RPC/LanguageKind'; -import { SerializableRange } from '../RPC/SerializableRange'; - -export interface RazorDocumentRangeFormattingRequest { - kind: LanguageKind; - hostDocumentFilePath: string; - projectedRange: SerializableRange; - options: vscode.FormattingOptions; -} diff --git a/src/razor/src/Formatting/RazorDocumentRangeFormattingResponse.ts b/src/razor/src/Formatting/RazorDocumentRangeFormattingResponse.ts deleted file mode 100644 index 2c5e056e9..000000000 --- a/src/razor/src/Formatting/RazorDocumentRangeFormattingResponse.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* -------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - * ------------------------------------------------------------------------------------------ */ - -import { SerializableTextEdit } from '../RPC/SerializableTextEdit'; - -export class RazorDocumentRangeFormattingResponse { - constructor(public readonly edits: SerializableTextEdit[]) { - } -} diff --git a/src/razor/src/Formatting/RazorFormatOnTypeProvider.ts b/src/razor/src/Formatting/RazorFormatOnTypeProvider.ts deleted file mode 100644 index 3056e17b5..000000000 --- a/src/razor/src/Formatting/RazorFormatOnTypeProvider.ts +++ /dev/null @@ -1,19 +0,0 @@ -/* -------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - * ------------------------------------------------------------------------------------------ */ - -import * as vscode from 'vscode'; - -export class RazorFormatOnTypeProvider - implements vscode.OnTypeFormattingEditProvider { - - public provideOnTypeFormattingEdits( - document: vscode.TextDocument, - position: vscode.Position, - character: string, - formattingOptions: vscode.FormattingOptions, - cancellationToken: vscode.CancellationToken): vscode.ProviderResult { - return new Array(); - } -} \ No newline at end of file diff --git a/src/razor/src/Formatting/RazorFormattingFeature.ts b/src/razor/src/Formatting/RazorFormattingFeature.ts deleted file mode 100644 index 0580b6e34..000000000 --- a/src/razor/src/Formatting/RazorFormattingFeature.ts +++ /dev/null @@ -1,73 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import * as vscode from 'vscode'; -import { RequestType } from 'vscode-languageclient'; -import { RazorDocumentManager } from '../Document/RazorDocumentManager'; -import { RazorLanguageServerClient } from '../RazorLanguageServerClient'; -import { RazorLogger } from '../RazorLogger'; -import { LanguageKind } from '../RPC/LanguageKind'; -import { convertRangeFromSerializable } from '../RPC/SerializableRange'; -import { convertTextEditToSerializable } from '../RPC/SerializableTextEdit'; -import { RazorDocumentRangeFormattingRequest } from './RazorDocumentRangeFormattingRequest'; -import { RazorDocumentRangeFormattingResponse } from './RazorDocumentRangeFormattingResponse'; - -export class RazorFormattingFeature { - - private rangeFormattingRequestType: RequestType = new RequestType('razor/rangeFormatting'); - private emptyRangeFormattingResponse: RazorDocumentRangeFormattingResponse = new RazorDocumentRangeFormattingResponse([]); - - constructor( - private readonly serverClient: RazorLanguageServerClient, - private readonly documentManager: RazorDocumentManager, - private readonly logger: RazorLogger) { - } - - public register() { - // tslint:disable-next-line: no-floating-promises - this.serverClient.onRequestWithParams( - this.rangeFormattingRequestType, - async (request: RazorDocumentRangeFormattingRequest, token: vscode.CancellationToken) => this.handleRangeFormatting(request, token)); - } - - private async handleRangeFormatting(request: RazorDocumentRangeFormattingRequest, token: vscode.CancellationToken) { - if (request.kind === LanguageKind.Razor) { - // We shouldn't attempt to format the actual Razor document here. - // Doing so could potentially lead to an infinite loop. - return this.emptyRangeFormattingResponse; - } - - try { - const uri = vscode.Uri.file(request.hostDocumentFilePath); - const razorDocument = await this.documentManager.getDocument(uri); - if (!razorDocument) { - return this.emptyRangeFormattingResponse; - } - - let documentUri = uri; - if (request.kind === LanguageKind.CSharp) { - documentUri = razorDocument.csharpDocument.uri; - } else { - documentUri = razorDocument.htmlDocument.uri; - } - - // Get the edits - const textEdits = await vscode.commands.executeCommand( - 'vscode.executeFormatRangeProvider', - documentUri, - convertRangeFromSerializable(request.projectedRange), - request.options); - - if (textEdits) { - const edits = textEdits.map(item => convertTextEditToSerializable(item)); - return new RazorDocumentRangeFormattingResponse(edits); - } - } catch (error) { - this.logger.logWarning(`razor/rangeFormatting failed with ${error}`); - } - - return this.emptyRangeFormattingResponse; - } -} diff --git a/src/razor/src/Formatting/SerializableFormattingParams.ts b/src/razor/src/Formatting/SerializableFormattingParams.ts index 3328dc4c2..41251fb9b 100644 --- a/src/razor/src/Formatting/SerializableFormattingParams.ts +++ b/src/razor/src/Formatting/SerializableFormattingParams.ts @@ -7,6 +7,7 @@ import * as vscode from 'vscode'; import { SerializableTextDocumentIdentifier } from './../RPC/SerializableTextDocumentIdentifier'; export interface SerializableFormattingParams { + hostDocumentVersion: number; textDocument: SerializableTextDocumentIdentifier; options: vscode.FormattingOptions; } diff --git a/src/razor/src/Formatting/SerializableOnTypeFormattingParams.ts b/src/razor/src/Formatting/SerializableOnTypeFormattingParams.ts new file mode 100644 index 000000000..947a91393 --- /dev/null +++ b/src/razor/src/Formatting/SerializableOnTypeFormattingParams.ts @@ -0,0 +1,16 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import * as vscode from 'vscode'; +import { SerializablePosition } from '../RPC/SerializablePosition'; +import { SerializableTextDocumentIdentifier } from './../RPC/SerializableTextDocumentIdentifier'; + +export interface SerializableOnTypeFormattingParams { + hostDocumentVersion: number; + textDocument: SerializableTextDocumentIdentifier; + ch: string; + position: SerializablePosition; + options: vscode.FormattingOptions; +} diff --git a/src/razor/src/extension.ts b/src/razor/src/extension.ts index 25e07e515..fa125f00b 100644 --- a/src/razor/src/extension.ts +++ b/src/razor/src/extension.ts @@ -25,8 +25,6 @@ import { reportTelemetryForDocuments } from './DocumentTelemetryListener'; import { DynamicFileInfoHandler } from './DynamicFile/DynamicFileInfoHandler'; import { FoldingRangeHandler } from './Folding/FoldingRangeHandler'; import { FormattingHandler } from './Formatting/FormattingHandler'; -import { RazorFormatOnTypeProvider } from './Formatting/RazorFormatOnTypeProvider'; -import { RazorFormattingFeature } from './Formatting/RazorFormattingFeature'; import { HostEventStream } from './HostEventStream'; import { RazorHoverProvider } from './Hover/RazorHoverProvider'; import { RazorHtmlFeature } from './Html/RazorHtmlFeature'; @@ -70,7 +68,6 @@ export async function activate(vscodeType: typeof vscodeapi, context: ExtensionC const htmlFeature = new RazorHtmlFeature(documentManager, languageServiceClient, eventEmitterFactory, logger); const localRegistrations: vscode.Disposable[] = []; const reportIssueCommand = new ReportIssueCommand(vscodeType, documentManager, logger); - const razorFormattingFeature = new RazorFormattingFeature(languageServerClient, documentManager, logger); const razorCodeActionRunner = new RazorCodeActionRunner(languageServerClient, logger); const codeActionsHandler = new CodeActionsHandler(documentManager, documentSynchronizer, languageServerClient, logger); @@ -102,6 +99,7 @@ export async function activate(vscodeType: typeof vscodeapi, context: ExtensionC logger); const formattingHandler = new FormattingHandler( documentManager, + documentSynchronizer, languageServerClient, logger); @@ -151,7 +149,6 @@ export async function activate(vscodeType: typeof vscodeapi, context: ExtensionC documentManager, languageServiceClient, logger); - const onTypeFormattingEditProvider = new RazorFormatOnTypeProvider(); const razorDiagnosticHandler = new RazorDiagnosticHandler(documentSynchronizer, languageServerClient, languageServiceClient, documentManager, logger); localRegistrations.push( @@ -186,13 +183,6 @@ export async function activate(vscodeType: typeof vscodeapi, context: ExtensionC vscodeType.languages.registerDocumentHighlightProvider( RazorLanguage.id, documentHighlightProvider), - // Our OnTypeFormatter doesn't do anything at the moment, but it's needed so - // VS Code doesn't throw an exception when it tries to send us an - // OnTypeFormatting request. - vscodeType.languages.registerOnTypeFormattingEditProvider( - RazorLanguage.documentSelector, - onTypeFormattingEditProvider, - ''), documentManager.register(), csharpFeature.register(), htmlFeature.register(), @@ -206,7 +196,6 @@ export async function activate(vscodeType: typeof vscodeapi, context: ExtensionC await proposedApisFeature.register(vscodeType, localRegistrations); } - razorFormattingFeature.register(); razorCodeActionRunner.register(); colorPresentationHandler.register(); documentColorHandler.register(); From b4ad031f5cb9e3c3c9336f82ed7c3220e2f2f3d9 Mon Sep 17 00:00:00 2001 From: David Wengier Date: Tue, 9 May 2023 12:30:48 +1000 Subject: [PATCH 2/2] Bump Razor server --- package.json | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index cb20e7b4a..424d40524 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "defaults": { "roslyn": "4.7.0-2.23253.5", "omniSharp": "1.39.6", - "razor": "7.0.0-preview.23220.3" + "razor": "7.0.0-preview.23258.1" }, "main": "./dist/extension", "brokeredServices": [{ @@ -536,7 +536,7 @@ { "id": "Razor", "description": "Razor Language Server (Windows / x64)", - "url": "https://download.visualstudio.microsoft.com/download/pr/04badfdc-0d27-45fa-a857-6116db74269b/6d3896fc76117c1a941ad64514e48860/razorlanguageserver-win-x64-7.0.0-preview.23220.3.zip", + "url": "https://download.visualstudio.microsoft.com/download/pr/4ccf25e1-f154-4946-b682-0cdfd35a60ce/d67585e2b3009d700c70f6f3f7ec666f/razorlanguageserver-win-x64-7.0.0-preview.23258.1.zip", "installPath": ".razor", "platforms": [ "win32" @@ -548,7 +548,7 @@ { "id": "Razor", "description": "Razor Language Server (Windows / x86)", - "url": "https://download.visualstudio.microsoft.com/download/pr/04badfdc-0d27-45fa-a857-6116db74269b/0a9275474ea64e65890ec70e3e155699/razorlanguageserver-win-x86-7.0.0-preview.23220.3.zip", + "url": "https://download.visualstudio.microsoft.com/download/pr/4ccf25e1-f154-4946-b682-0cdfd35a60ce/dc253426025d44bf9f78e9d69b1b946e/razorlanguageserver-win-x86-7.0.0-preview.23258.1.zip", "installPath": ".razor", "platforms": [ "win32" @@ -560,7 +560,7 @@ { "id": "Razor", "description": "Razor Language Server (Windows / ARM64)", - "url": "https://download.visualstudio.microsoft.com/download/pr/04badfdc-0d27-45fa-a857-6116db74269b/da796acb9624df1f0506cae5bee403c3/razorlanguageserver-win-arm64-7.0.0-preview.23220.3.zip", + "url": "https://download.visualstudio.microsoft.com/download/pr/4ccf25e1-f154-4946-b682-0cdfd35a60ce/c6a4cc07ec8a8e089ce3a8e618e2df35/razorlanguageserver-win-arm64-7.0.0-preview.23258.1.zip", "installPath": ".razor", "platforms": [ "win32" @@ -572,7 +572,7 @@ { "id": "Razor", "description": "Razor Language Server (Linux / x64)", - "url": "https://download.visualstudio.microsoft.com/download/pr/04badfdc-0d27-45fa-a857-6116db74269b/e6b119e9d63d402f743625eb8f090afd/razorlanguageserver-linux-x64-7.0.0-preview.23220.3.zip", + "url": "https://download.visualstudio.microsoft.com/download/pr/4ccf25e1-f154-4946-b682-0cdfd35a60ce/86cc790bb4a8c703cbec0e3260b63620/razorlanguageserver-linux-x64-7.0.0-preview.23258.1.zip", "installPath": ".razor", "platforms": [ "linux" @@ -587,7 +587,7 @@ { "id": "Razor", "description": "Razor Language Server (Linux ARM64)", - "url": "https://download.visualstudio.microsoft.com/download/pr/04badfdc-0d27-45fa-a857-6116db74269b/91b088b9b816ea2d9f633e4653407796/razorlanguageserver-linux-arm64-7.0.0-preview.23220.3.zip", + "url": "https://download.visualstudio.microsoft.com/download/pr/4ccf25e1-f154-4946-b682-0cdfd35a60ce/cbd4a5d06dfd59faf0afca97cb44c2d8/razorlanguageserver-linux-arm64-7.0.0-preview.23258.1.zip", "installPath": ".razor", "platforms": [ "linux" @@ -602,7 +602,7 @@ { "id": "Razor", "description": "Razor Language Server (Linux musl / x64)", - "url": "https://download.visualstudio.microsoft.com/download/pr/04badfdc-0d27-45fa-a857-6116db74269b/9dbbf00efa68e82a028e46929aa974c0/razorlanguageserver-linux-musl-x64-7.0.0-preview.23220.3.zip", + "url": "https://download.visualstudio.microsoft.com/download/pr/4ccf25e1-f154-4946-b682-0cdfd35a60ce/8eb49bd7a28941933356bdb206864b2d/razorlanguageserver-linux-musl-x64-7.0.0-preview.23258.1.zip", "installPath": ".razor", "platforms": [ "linux-musl" @@ -617,7 +617,7 @@ { "id": "Razor", "description": "Razor Language Server (Linux musl ARM64)", - "url": "https://download.visualstudio.microsoft.com/download/pr/04badfdc-0d27-45fa-a857-6116db74269b/4283aabbacb3013a5c4449091d1802e0/razorlanguageserver-linux-musl-arm64-7.0.0-preview.23220.3.zip", + "url": "https://download.visualstudio.microsoft.com/download/pr/4ccf25e1-f154-4946-b682-0cdfd35a60ce/6ddcb891121eef359196e37ab1f4f31d/razorlanguageserver-linux-musl-arm64-7.0.0-preview.23258.1.zip", "installPath": ".razor", "platforms": [ "linux-musl" @@ -632,7 +632,7 @@ { "id": "Razor", "description": "Razor Language Server (macOS / x64)", - "url": "https://download.visualstudio.microsoft.com/download/pr/04badfdc-0d27-45fa-a857-6116db74269b/89434a154d12c8981a55b176486fc38a/razorlanguageserver-osx-x64-7.0.0-preview.23220.3.zip", + "url": "https://download.visualstudio.microsoft.com/download/pr/4ccf25e1-f154-4946-b682-0cdfd35a60ce/cd0a3b009315c636383c21962d312d8a/razorlanguageserver-osx-x64-7.0.0-preview.23258.1.zip", "installPath": ".razor", "platforms": [ "darwin" @@ -647,7 +647,7 @@ { "id": "Razor", "description": "Razor Language Server (macOS ARM64)", - "url": "https://download.visualstudio.microsoft.com/download/pr/04badfdc-0d27-45fa-a857-6116db74269b/0fb5b30e7cb285257e5122b4ea3e10c8/razorlanguageserver-osx-arm64-7.0.0-preview.23220.3.zip", + "url": "https://download.visualstudio.microsoft.com/download/pr/4ccf25e1-f154-4946-b682-0cdfd35a60ce/274355756fd7dd499d0116f063b2cd67/razorlanguageserver-osx-arm64-7.0.0-preview.23258.1.zip", "installPath": ".razor", "platforms": [ "darwin" @@ -1201,7 +1201,7 @@ ], "description": "Generation behavior of properties when implement interface or abstract class.", "order": 10 - }, + }, "dotnet.completion.showCompletionItemsFromUnimportedNamespaces": { "type": "boolean", "default": false,