diff --git a/extensions/json-language-features/client/src/jsonClient.ts b/extensions/json-language-features/client/src/jsonClient.ts index f49bcac2fd5..15054d499e7 100644 --- a/extensions/json-language-features/client/src/jsonClient.ts +++ b/extensions/json-language-features/client/src/jsonClient.ts @@ -13,6 +13,7 @@ import { } from 'vscode'; import { LanguageClientOptions, RequestType, NotificationType, FormattingOptions as LSPFormattingOptions, DocumentDiagnosticReportKind, + Diagnostic as LSPDiagnostic, DidChangeConfigurationNotification, HandleDiagnosticsSignature, ResponseError, DocumentRangeFormattingParams, DocumentRangeFormattingRequest, ProvideCompletionItemsSignature, ProvideHoverSignature, BaseLanguageClient, ProvideFoldingRangeSignature, ProvideDocumentSymbolsSignature, ProvideDocumentColorsSignature } from 'vscode-languageclient'; @@ -38,6 +39,9 @@ namespace LanguageStatusRequest { export const type: RequestType = new RequestType('json/languageStatus'); } +namespace ValidateContentRequest { + export const type: RequestType<{ schemaUri: string; content: string }, LSPDiagnostic[], any> = new RequestType('json/validateContent'); +} interface SortOptions extends LSPFormattingOptions { } @@ -211,6 +215,10 @@ async function startClientWithParticipants(_context: ExtensionContext, languageP window.showInformationMessage(l10n.t('JSON schema cache cleared.')); })); + toDispose.push(commands.registerCommand('json.validate', async (schemaUri: Uri, content: string) => { + const diagnostics: LSPDiagnostic[] = await client.sendRequest(ValidateContentRequest.type, { schemaUri: schemaUri.toString(), content }); + return diagnostics.map(client.protocol2CodeConverter.asDiagnostic); + })); toDispose.push(commands.registerCommand('json.sort', async () => { @@ -767,3 +775,5 @@ function updateMarkdownString(h: MarkdownString): MarkdownString { function isSchemaResolveError(d: Diagnostic) { return d.code === /* SchemaResolveError */ 0x300; } + + diff --git a/extensions/json-language-features/package.json b/extensions/json-language-features/package.json index dc3b6a69219..375afed0ce6 100644 --- a/extensions/json-language-features/package.json +++ b/extensions/json-language-features/package.json @@ -16,7 +16,8 @@ "activationEvents": [ "onLanguage:json", "onLanguage:jsonc", - "onLanguage:snippets" + "onLanguage:snippets", + "onCommand:json.validate" ], "main": "./client/out/node/jsonClientMain", "browser": "./client/dist/browser/jsonClientMain", diff --git a/extensions/json-language-features/server/src/jsonServer.ts b/extensions/json-language-features/server/src/jsonServer.ts index 36ca0dc591d..6a806b72df6 100644 --- a/extensions/json-language-features/server/src/jsonServer.ts +++ b/extensions/json-language-features/server/src/jsonServer.ts @@ -40,6 +40,10 @@ namespace LanguageStatusRequest { export const type: RequestType = new RequestType('json/languageStatus'); } +namespace ValidateContentRequest { + export const type: RequestType<{ schemaUri: string; content: string }, Diagnostic[], any> = new RequestType('json/validateContent'); +} + export interface DocumentSortingParams { /** * The uri of the document to sort. @@ -299,6 +303,14 @@ export function startServer(connection: Connection, runtime: RuntimeEnvironment) return []; }); + connection.onRequest(ValidateContentRequest.type, async ({ schemaUri, content }) => { + const docURI = 'vscode://schemas/temp/' + new Date().getTime(); + const document = TextDocument.create(docURI, 'json', 1, content); + updateConfiguration([{ uri: schemaUri, fileMatch: [docURI] }]); + return await validateTextDocument(document); + }); + + connection.onRequest(LanguageStatusRequest.type, async uri => { const document = documents.get(uri); if (document) { @@ -319,7 +331,7 @@ export function startServer(connection: Connection, runtime: RuntimeEnvironment) return []; }); - function updateConfiguration() { + function updateConfiguration(extraSchemas?: SchemaConfiguration[]) { const languageSettings = { validate: validateEnabled, allowComments: true, @@ -350,6 +362,10 @@ export function startServer(connection: Connection, runtime: RuntimeEnvironment) } }); } + if (extraSchemas) { + languageSettings.schemas.push(...extraSchemas); + } + languageService.configure(languageSettings); diagnosticsSupport?.requestRefresh(); @@ -529,3 +545,7 @@ export function startServer(connection: Connection, runtime: RuntimeEnvironment) function getFullRange(document: TextDocument): Range { return Range.create(Position.create(0, 0), document.positionAt(document.getText().length)); } + + + +