From 157ee8c3945f38ada5dc276e32faa67be9afe208 Mon Sep 17 00:00:00 2001 From: Literallie Date: Tue, 9 Oct 2018 01:41:08 +0200 Subject: [PATCH 01/10] Show JSON schema resolution errors in status bar only This commit adds a middleware to the JSON Language Feature client which intercepts diagnostics for schema resolution errors, and shows them in the status bar instead of treating them as code errors. Fixes #51032 --- .../json-language-features/client/src/jsonMain.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/extensions/json-language-features/client/src/jsonMain.ts b/extensions/json-language-features/client/src/jsonMain.ts index 8da28460f36..8d387112c93 100644 --- a/extensions/json-language-features/client/src/jsonMain.ts +++ b/extensions/json-language-features/client/src/jsonMain.ts @@ -8,8 +8,8 @@ import * as fs from 'fs'; import * as nls from 'vscode-nls'; const localize = nls.loadMessageBundle(); -import { workspace, languages, ExtensionContext, extensions, Uri, LanguageConfiguration } from 'vscode'; -import { LanguageClient, LanguageClientOptions, RequestType, ServerOptions, TransportKind, NotificationType, DidChangeConfigurationNotification } from 'vscode-languageclient'; +import { workspace, window, languages, ExtensionContext, extensions, Uri, LanguageConfiguration, Diagnostic } from 'vscode'; +import { LanguageClient, LanguageClientOptions, RequestType, ServerOptions, TransportKind, NotificationType, DidChangeConfigurationNotification, HandleDiagnosticsSignature } from 'vscode-languageclient'; import TelemetryReporter from 'vscode-extension-telemetry'; import { hash } from './utils/hash'; @@ -89,6 +89,16 @@ export function activate(context: ExtensionContext) { middleware: { workspace: { didChangeConfiguration: () => client.sendNotification(DidChangeConfigurationNotification.type, { settings: getSettings() }) + }, + handleDiagnostics: (uri: Uri, diagnostics: Diagnostic[], next: HandleDiagnosticsSignature) => { + let schemaResolveDiagnostic = diagnostics + .find(candidate => candidate.code === /* SchemaResolveError */ 0x300); + if (schemaResolveDiagnostic) { + // Show schema resolution errors in status bar only; ref: #51032 + window.showWarningMessage(schemaResolveDiagnostic.message); + } else { + next(uri, diagnostics); + } } } }; From 0137ebd471f2ab077353c54d22473aa7a7a93d4b Mon Sep 17 00:00:00 2001 From: Literallie Date: Tue, 9 Oct 2018 01:46:24 +0200 Subject: [PATCH 02/10] Use ErrorCode in JSON Language Service schema resolution error handling This adds a dependency on vscode-json-languageservice to the client, which might not be desired, but allows for cleaner code and the correct reference should the error codes change. --- .../client/src/jsonMain.ts | 3 ++- .../json-language-features/package.json | 1 + extensions/json-language-features/yarn.lock | 22 ++++++++++++++++++- 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/extensions/json-language-features/client/src/jsonMain.ts b/extensions/json-language-features/client/src/jsonMain.ts index 8d387112c93..26c32250f8d 100644 --- a/extensions/json-language-features/client/src/jsonMain.ts +++ b/extensions/json-language-features/client/src/jsonMain.ts @@ -10,6 +10,7 @@ const localize = nls.loadMessageBundle(); import { workspace, window, languages, ExtensionContext, extensions, Uri, LanguageConfiguration, Diagnostic } from 'vscode'; import { LanguageClient, LanguageClientOptions, RequestType, ServerOptions, TransportKind, NotificationType, DidChangeConfigurationNotification, HandleDiagnosticsSignature } from 'vscode-languageclient'; +import { ErrorCode } from 'vscode-json-languageservice'; import TelemetryReporter from 'vscode-extension-telemetry'; import { hash } from './utils/hash'; @@ -92,7 +93,7 @@ export function activate(context: ExtensionContext) { }, handleDiagnostics: (uri: Uri, diagnostics: Diagnostic[], next: HandleDiagnosticsSignature) => { let schemaResolveDiagnostic = diagnostics - .find(candidate => candidate.code === /* SchemaResolveError */ 0x300); + .find(candidate => candidate.code === ErrorCode.SchemaResolveError); if (schemaResolveDiagnostic) { // Show schema resolution errors in status bar only; ref: #51032 window.showWarningMessage(schemaResolveDiagnostic.message); diff --git a/extensions/json-language-features/package.json b/extensions/json-language-features/package.json index 2a0eed9a52e..d2d64fe7963 100644 --- a/extensions/json-language-features/package.json +++ b/extensions/json-language-features/package.json @@ -101,6 +101,7 @@ }, "dependencies": { "vscode-extension-telemetry": "0.0.22", + "vscode-json-languageservice": "^3.2.0", "vscode-languageclient": "^5.1.0", "vscode-nls": "^4.0.0" }, diff --git a/extensions/json-language-features/yarn.lock b/extensions/json-language-features/yarn.lock index 72991652542..47868a6e58b 100644 --- a/extensions/json-language-features/yarn.lock +++ b/extensions/json-language-features/yarn.lock @@ -28,6 +28,11 @@ diagnostic-channel@0.2.0: dependencies: semver "^5.3.0" +jsonc-parser@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-2.0.2.tgz#42fcf56d70852a043fadafde51ddb4a85649978d" + integrity sha512-TSU435K5tEKh3g7bam1AFf+uZrISheoDsLlpmAo6wWZYqjsnd09lHYK1Qo+moK4Ikifev1Gdpa69g4NELKnCrQ== + semver@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" @@ -45,6 +50,16 @@ vscode-extension-telemetry@0.0.22: dependencies: applicationinsights "1.0.5" +vscode-json-languageservice@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/vscode-json-languageservice/-/vscode-json-languageservice-3.2.0.tgz#fe796c2ddbda966d87905442f9636f139e00f341" + integrity sha512-tLAv9/D01fLAvnYnZ1OLy03HSHhVFjaSkUidEjfrwytHrxVDgqXLkHAJg+F6Q3mPYfpnPQvN2jTjiJ1yInuNVg== + dependencies: + jsonc-parser "^2.0.2" + vscode-languageserver-types "^3.13.0" + vscode-nls "^4.0.0" + vscode-uri "^1.0.6" + vscode-jsonrpc@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-4.0.0.tgz#a7bf74ef3254d0a0c272fab15c82128e378b3be9" @@ -66,7 +81,7 @@ vscode-languageserver-protocol@3.13.0: vscode-jsonrpc "^4.0.0" vscode-languageserver-types "3.13.0" -vscode-languageserver-types@3.13.0: +vscode-languageserver-types@3.13.0, vscode-languageserver-types@^3.13.0: version "3.13.0" resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.13.0.tgz#b704b024cef059f7b326611c99b9c8753c0a18b4" integrity sha512-BnJIxS+5+8UWiNKCP7W3g9FlE7fErFw0ofP5BXJe7c2tl0VeWh+nNHFbwAS2vmVC4a5kYxHBjRy0UeOtziemVA== @@ -76,6 +91,11 @@ vscode-nls@^4.0.0: resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-4.0.0.tgz#4001c8a6caba5cedb23a9c5ce1090395c0e44002" integrity sha512-qCfdzcH+0LgQnBpZA53bA32kzp9rpq/f66Som577ObeuDlFIrtbEJ+A/+CCxjIh4G8dpJYNCKIsxpRAHIfsbNw== +vscode-uri@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-1.0.6.tgz#6b8f141b0bbc44ad7b07e94f82f168ac7608ad4d" + integrity sha512-sLI2L0uGov3wKVb9EB+vIQBl9tVP90nqRvxSoJ35vI3NjxE8jfsE5DSOhWgSunHSZmKS4OCi2jrtfxK7uyp2ww== + zone.js@0.7.6: version "0.7.6" resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.7.6.tgz#fbbc39d3e0261d0986f1ba06306eb3aeb0d22009" From ab43e947f77bfd0e3f11a2d99c1f55eacb8b5dd9 Mon Sep 17 00:00:00 2001 From: Literallie Date: Tue, 9 Oct 2018 02:12:01 +0200 Subject: [PATCH 03/10] Only remove actual schema resolution errors from JSON errors --- .../json-language-features/client/src/jsonMain.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/extensions/json-language-features/client/src/jsonMain.ts b/extensions/json-language-features/client/src/jsonMain.ts index 26c32250f8d..44e2a435f2b 100644 --- a/extensions/json-language-features/client/src/jsonMain.ts +++ b/extensions/json-language-features/client/src/jsonMain.ts @@ -92,14 +92,15 @@ export function activate(context: ExtensionContext) { didChangeConfiguration: () => client.sendNotification(DidChangeConfigurationNotification.type, { settings: getSettings() }) }, handleDiagnostics: (uri: Uri, diagnostics: Diagnostic[], next: HandleDiagnosticsSignature) => { - let schemaResolveDiagnostic = diagnostics - .find(candidate => candidate.code === ErrorCode.SchemaResolveError); - if (schemaResolveDiagnostic) { + const schemaErrorIndex = diagnostics + .findIndex(candidate => candidate.code === ErrorCode.SchemaResolveError); + if (schemaErrorIndex !== -1) { // Show schema resolution errors in status bar only; ref: #51032 + const schemaResolveDiagnostic = diagnostics[schemaErrorIndex]; window.showWarningMessage(schemaResolveDiagnostic.message); - } else { - next(uri, diagnostics); + diagnostics.splice(schemaErrorIndex, 1); } + next(uri, diagnostics); } } }; From 01754ba288d8f2ed097ce5c2565a57adfb4a91b5 Mon Sep 17 00:00:00 2001 From: Literallie Date: Wed, 10 Oct 2018 11:03:12 +0200 Subject: [PATCH 04/10] Revert "Use ErrorCode in JSON Language Service schema resolution error handling" This reverts commit 0137ebd471f2ab077353c54d22473aa7a7a93d4b. --- .../client/src/jsonMain.ts | 3 +-- .../json-language-features/package.json | 1 - extensions/json-language-features/yarn.lock | 22 +------------------ 3 files changed, 2 insertions(+), 24 deletions(-) diff --git a/extensions/json-language-features/client/src/jsonMain.ts b/extensions/json-language-features/client/src/jsonMain.ts index 44e2a435f2b..8b959c80005 100644 --- a/extensions/json-language-features/client/src/jsonMain.ts +++ b/extensions/json-language-features/client/src/jsonMain.ts @@ -10,7 +10,6 @@ const localize = nls.loadMessageBundle(); import { workspace, window, languages, ExtensionContext, extensions, Uri, LanguageConfiguration, Diagnostic } from 'vscode'; import { LanguageClient, LanguageClientOptions, RequestType, ServerOptions, TransportKind, NotificationType, DidChangeConfigurationNotification, HandleDiagnosticsSignature } from 'vscode-languageclient'; -import { ErrorCode } from 'vscode-json-languageservice'; import TelemetryReporter from 'vscode-extension-telemetry'; import { hash } from './utils/hash'; @@ -93,7 +92,7 @@ export function activate(context: ExtensionContext) { }, handleDiagnostics: (uri: Uri, diagnostics: Diagnostic[], next: HandleDiagnosticsSignature) => { const schemaErrorIndex = diagnostics - .findIndex(candidate => candidate.code === ErrorCode.SchemaResolveError); + .findIndex(candidate => candidate.code === /* SchemaResolveError */ 0x300); if (schemaErrorIndex !== -1) { // Show schema resolution errors in status bar only; ref: #51032 const schemaResolveDiagnostic = diagnostics[schemaErrorIndex]; diff --git a/extensions/json-language-features/package.json b/extensions/json-language-features/package.json index d2d64fe7963..2a0eed9a52e 100644 --- a/extensions/json-language-features/package.json +++ b/extensions/json-language-features/package.json @@ -101,7 +101,6 @@ }, "dependencies": { "vscode-extension-telemetry": "0.0.22", - "vscode-json-languageservice": "^3.2.0", "vscode-languageclient": "^5.1.0", "vscode-nls": "^4.0.0" }, diff --git a/extensions/json-language-features/yarn.lock b/extensions/json-language-features/yarn.lock index 47868a6e58b..72991652542 100644 --- a/extensions/json-language-features/yarn.lock +++ b/extensions/json-language-features/yarn.lock @@ -28,11 +28,6 @@ diagnostic-channel@0.2.0: dependencies: semver "^5.3.0" -jsonc-parser@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-2.0.2.tgz#42fcf56d70852a043fadafde51ddb4a85649978d" - integrity sha512-TSU435K5tEKh3g7bam1AFf+uZrISheoDsLlpmAo6wWZYqjsnd09lHYK1Qo+moK4Ikifev1Gdpa69g4NELKnCrQ== - semver@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" @@ -50,16 +45,6 @@ vscode-extension-telemetry@0.0.22: dependencies: applicationinsights "1.0.5" -vscode-json-languageservice@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/vscode-json-languageservice/-/vscode-json-languageservice-3.2.0.tgz#fe796c2ddbda966d87905442f9636f139e00f341" - integrity sha512-tLAv9/D01fLAvnYnZ1OLy03HSHhVFjaSkUidEjfrwytHrxVDgqXLkHAJg+F6Q3mPYfpnPQvN2jTjiJ1yInuNVg== - dependencies: - jsonc-parser "^2.0.2" - vscode-languageserver-types "^3.13.0" - vscode-nls "^4.0.0" - vscode-uri "^1.0.6" - vscode-jsonrpc@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-4.0.0.tgz#a7bf74ef3254d0a0c272fab15c82128e378b3be9" @@ -81,7 +66,7 @@ vscode-languageserver-protocol@3.13.0: vscode-jsonrpc "^4.0.0" vscode-languageserver-types "3.13.0" -vscode-languageserver-types@3.13.0, vscode-languageserver-types@^3.13.0: +vscode-languageserver-types@3.13.0: version "3.13.0" resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.13.0.tgz#b704b024cef059f7b326611c99b9c8753c0a18b4" integrity sha512-BnJIxS+5+8UWiNKCP7W3g9FlE7fErFw0ofP5BXJe7c2tl0VeWh+nNHFbwAS2vmVC4a5kYxHBjRy0UeOtziemVA== @@ -91,11 +76,6 @@ vscode-nls@^4.0.0: resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-4.0.0.tgz#4001c8a6caba5cedb23a9c5ce1090395c0e44002" integrity sha512-qCfdzcH+0LgQnBpZA53bA32kzp9rpq/f66Som577ObeuDlFIrtbEJ+A/+CCxjIh4G8dpJYNCKIsxpRAHIfsbNw== -vscode-uri@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-1.0.6.tgz#6b8f141b0bbc44ad7b07e94f82f168ac7608ad4d" - integrity sha512-sLI2L0uGov3wKVb9EB+vIQBl9tVP90nqRvxSoJ35vI3NjxE8jfsE5DSOhWgSunHSZmKS4OCi2jrtfxK7uyp2ww== - zone.js@0.7.6: version "0.7.6" resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.7.6.tgz#fbbc39d3e0261d0986f1ba06306eb3aeb0d22009" From 27ce1616ca6a454135b24561b619c2361ef47a18 Mon Sep 17 00:00:00 2001 From: Literallie Date: Wed, 10 Oct 2018 16:15:06 +0200 Subject: [PATCH 05/10] Show JSON schema resolution issues in status bar, not notifications Note that this uses the status bar item only for that. After switching files, the item is not shown until problems are re-evaluated. --- .../client/src/jsonMain.ts | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/extensions/json-language-features/client/src/jsonMain.ts b/extensions/json-language-features/client/src/jsonMain.ts index 8b959c80005..e38e6221c5b 100644 --- a/extensions/json-language-features/client/src/jsonMain.ts +++ b/extensions/json-language-features/client/src/jsonMain.ts @@ -8,7 +8,7 @@ import * as fs from 'fs'; import * as nls from 'vscode-nls'; const localize = nls.loadMessageBundle(); -import { workspace, window, languages, ExtensionContext, extensions, Uri, LanguageConfiguration, Diagnostic } from 'vscode'; +import { workspace, window, languages, ExtensionContext, extensions, Uri, LanguageConfiguration, Diagnostic, StatusBarAlignment, TextEditor } from 'vscode'; import { LanguageClient, LanguageClientOptions, RequestType, ServerOptions, TransportKind, NotificationType, DidChangeConfigurationNotification, HandleDiagnosticsSignature } from 'vscode-languageclient'; import TelemetryReporter from 'vscode-extension-telemetry'; @@ -77,6 +77,10 @@ export function activate(context: ExtensionContext) { let documentSelector = ['json', 'jsonc']; + let statusBarItem = window.createStatusBarItem(StatusBarAlignment.Right, 0); + statusBarItem.text = '$(alert) JSON'; + toDispose.push(statusBarItem); + // Options to control the language client let clientOptions: LanguageClientOptions = { // Register the server for json documents @@ -96,8 +100,11 @@ export function activate(context: ExtensionContext) { if (schemaErrorIndex !== -1) { // Show schema resolution errors in status bar only; ref: #51032 const schemaResolveDiagnostic = diagnostics[schemaErrorIndex]; - window.showWarningMessage(schemaResolveDiagnostic.message); + statusBarItem.tooltip = schemaResolveDiagnostic.message; + statusBarItem.show(); diagnostics.splice(schemaErrorIndex, 1); + } else { + statusBarItem.hide(); } next(uri, diagnostics); } @@ -132,8 +139,14 @@ export function activate(context: ExtensionContext) { client.sendNotification(SchemaContentChangeNotification.type, uri.toString()); } }; + + let handleActiveEditorChange = (_?: TextEditor) => { + statusBarItem.hide(); + }; + toDispose.push(workspace.onDidChangeTextDocument(e => handleContentChange(e.document.uri))); toDispose.push(workspace.onDidCloseTextDocument(d => handleContentChange(d.uri))); + toDispose.push(window.onDidChangeActiveTextEditor(handleActiveEditorChange)); client.sendNotification(SchemaAssociationNotification.type, getSchemaAssociation(context)); }); From 7814f38222c9c6bfadb36c002b32a11fb50d2220 Mon Sep 17 00:00:00 2001 From: Literallie Date: Thu, 11 Oct 2018 00:16:52 +0200 Subject: [PATCH 06/10] Add SchemaRetry notification to jsonServerMain --- .../server/src/jsonServerMain.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/extensions/json-language-features/server/src/jsonServerMain.ts b/extensions/json-language-features/server/src/jsonServerMain.ts index 6eadf2403b8..e2dd17bf4a0 100644 --- a/extensions/json-language-features/server/src/jsonServerMain.ts +++ b/extensions/json-language-features/server/src/jsonServerMain.ts @@ -34,6 +34,10 @@ namespace SchemaContentChangeNotification { export const type: NotificationType = new NotificationType('json/schemaContent'); } +namespace SchemaRetryNotification { + export const type: NotificationType = new NotificationType('json/schemaRetry'); +} + // Create a connection for the server const connection: IConnection = createConnection(); @@ -207,6 +211,14 @@ connection.onNotification(SchemaContentChangeNotification.type, uri => { languageService.resetSchema(uri); }); +// Retry schema validation on all open documents +connection.onNotification(SchemaRetryNotification.type, uri => { + const document = documents.get(uri); + if (document) { + triggerValidation(document); + } +}); + function updateConfiguration() { const languageSettings = { validate: true, @@ -405,4 +417,4 @@ connection.onFoldingRanges((params, token) => { }); // Listen on the connection -connection.listen(); \ No newline at end of file +connection.listen(); From fe4ce0b9d4de05fe3cfb68a200ff723992e72f79 Mon Sep 17 00:00:00 2001 From: Literallie Date: Thu, 11 Oct 2018 00:27:58 +0200 Subject: [PATCH 07/10] Add retry action to JSON status bar icon --- .../client/src/jsonMain.ts | 23 +++++++++++++++---- .../json-language-features/package.nls.json | 5 ++-- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/extensions/json-language-features/client/src/jsonMain.ts b/extensions/json-language-features/client/src/jsonMain.ts index e38e6221c5b..46a39b4be44 100644 --- a/extensions/json-language-features/client/src/jsonMain.ts +++ b/extensions/json-language-features/client/src/jsonMain.ts @@ -8,7 +8,7 @@ import * as fs from 'fs'; import * as nls from 'vscode-nls'; const localize = nls.loadMessageBundle(); -import { workspace, window, languages, ExtensionContext, extensions, Uri, LanguageConfiguration, Diagnostic, StatusBarAlignment, TextEditor } from 'vscode'; +import { workspace, window, languages, commands, ExtensionContext, extensions, Uri, LanguageConfiguration, Diagnostic, StatusBarAlignment } from 'vscode'; import { LanguageClient, LanguageClientOptions, RequestType, ServerOptions, TransportKind, NotificationType, DidChangeConfigurationNotification, HandleDiagnosticsSignature } from 'vscode-languageclient'; import TelemetryReporter from 'vscode-extension-telemetry'; @@ -22,6 +22,10 @@ namespace SchemaContentChangeNotification { export const type: NotificationType = new NotificationType('json/schemaContent'); } +namespace SchemaRetryNotification { + export const type: NotificationType = new NotificationType('json/schemaRetry'); +} + export interface ISchemaAssociations { [pattern: string]: string[]; } @@ -78,7 +82,7 @@ export function activate(context: ExtensionContext) { let documentSelector = ['json', 'jsonc']; let statusBarItem = window.createStatusBarItem(StatusBarAlignment.Right, 0); - statusBarItem.text = '$(alert) JSON'; + statusBarItem.command = '_json.retrySchema'; toDispose.push(statusBarItem); // Options to control the language client @@ -100,7 +104,9 @@ export function activate(context: ExtensionContext) { if (schemaErrorIndex !== -1) { // Show schema resolution errors in status bar only; ref: #51032 const schemaResolveDiagnostic = diagnostics[schemaErrorIndex]; - statusBarItem.tooltip = schemaResolveDiagnostic.message; + statusBarItem.tooltip = schemaResolveDiagnostic.message + + '\n' + localize('json.clickToRetry', 'Click to retry.'); + statusBarItem.text = '$(alert) JSON'; statusBarItem.show(); diagnostics.splice(schemaErrorIndex, 1); } else { @@ -140,7 +146,7 @@ export function activate(context: ExtensionContext) { } }; - let handleActiveEditorChange = (_?: TextEditor) => { + let handleActiveEditorChange = () => { statusBarItem.hide(); }; @@ -148,6 +154,15 @@ export function activate(context: ExtensionContext) { toDispose.push(workspace.onDidCloseTextDocument(d => handleContentChange(d.uri))); toDispose.push(window.onDidChangeActiveTextEditor(handleActiveEditorChange)); + let handleRetrySchemaCommand = () => { + if (window.activeTextEditor) { + client.sendNotification(SchemaRetryNotification.type, window.activeTextEditor.document.uri.toString()); + statusBarItem.text = '$(watch) JSON'; + } + }; + + toDispose.push(commands.registerCommand('_json.retrySchema', handleRetrySchemaCommand)); + client.sendNotification(SchemaAssociationNotification.type, getSchemaAssociation(context)); }); diff --git a/extensions/json-language-features/package.nls.json b/extensions/json-language-features/package.nls.json index 943de414e15..62e983f9bb6 100644 --- a/extensions/json-language-features/package.nls.json +++ b/extensions/json-language-features/package.nls.json @@ -9,5 +9,6 @@ "json.format.enable.desc": "Enable/disable default JSON formatter", "json.tracing.desc": "Traces the communication between VS Code and the JSON language server.", "json.colorDecorators.enable.desc": "Enables or disables color decorators", - "json.colorDecorators.enable.deprecationMessage": "The setting `json.colorDecorators.enable` has been deprecated in favor of `editor.colorDecorators`." -} \ No newline at end of file + "json.colorDecorators.enable.deprecationMessage": "The setting `json.colorDecorators.enable` has been deprecated in favor of `editor.colorDecorators`.", + "json.clickToRetry": "Click to retry." +} From cb8d48242988cb1c3743871f4bd20f5e3698f455 Mon Sep 17 00:00:00 2001 From: Literallie Date: Thu, 11 Oct 2018 16:41:39 +0200 Subject: [PATCH 08/10] Cache JSON schema error files --- .../client/src/jsonMain.ts | 31 ++++++++++++++----- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/extensions/json-language-features/client/src/jsonMain.ts b/extensions/json-language-features/client/src/jsonMain.ts index 46a39b4be44..5116fba257c 100644 --- a/extensions/json-language-features/client/src/jsonMain.ts +++ b/extensions/json-language-features/client/src/jsonMain.ts @@ -8,7 +8,7 @@ import * as fs from 'fs'; import * as nls from 'vscode-nls'; const localize = nls.loadMessageBundle(); -import { workspace, window, languages, commands, ExtensionContext, extensions, Uri, LanguageConfiguration, Diagnostic, StatusBarAlignment } from 'vscode'; +import { workspace, window, languages, commands, ExtensionContext, extensions, Uri, LanguageConfiguration, Diagnostic, StatusBarAlignment, TextEditor } from 'vscode'; import { LanguageClient, LanguageClientOptions, RequestType, ServerOptions, TransportKind, NotificationType, DidChangeConfigurationNotification, HandleDiagnosticsSignature } from 'vscode-languageclient'; import TelemetryReporter from 'vscode-extension-telemetry'; @@ -85,6 +85,14 @@ export function activate(context: ExtensionContext) { statusBarItem.command = '_json.retrySchema'; toDispose.push(statusBarItem); + let showStatusBarItem = (message: string) => { + statusBarItem.tooltip = message + '\n' + localize('json.clickToRetry', 'Click to retry.'); + statusBarItem.text = '$(alert) JSON'; + statusBarItem.show(); + }; + + let fileSchemaErrors = new Map(); + // Options to control the language client let clientOptions: LanguageClientOptions = { // Register the server for json documents @@ -104,13 +112,12 @@ export function activate(context: ExtensionContext) { if (schemaErrorIndex !== -1) { // Show schema resolution errors in status bar only; ref: #51032 const schemaResolveDiagnostic = diagnostics[schemaErrorIndex]; - statusBarItem.tooltip = schemaResolveDiagnostic.message + - '\n' + localize('json.clickToRetry', 'Click to retry.'); - statusBarItem.text = '$(alert) JSON'; - statusBarItem.show(); + fileSchemaErrors.set(uri.toString(), schemaResolveDiagnostic.message); + showStatusBarItem(schemaResolveDiagnostic.message); diagnostics.splice(schemaErrorIndex, 1); } else { statusBarItem.hide(); + fileSchemaErrors.delete(uri.toString()); } next(uri, diagnostics); } @@ -146,12 +153,20 @@ export function activate(context: ExtensionContext) { } }; - let handleActiveEditorChange = () => { - statusBarItem.hide(); + let handleActiveEditorChange = (activeEditor?: TextEditor) => { + if (activeEditor && fileSchemaErrors.has(activeEditor.document.uri.toString())) { + const message = fileSchemaErrors.get(activeEditor.document.uri.toString())!; + showStatusBarItem(message); + } else { + statusBarItem.hide(); + } }; toDispose.push(workspace.onDidChangeTextDocument(e => handleContentChange(e.document.uri))); - toDispose.push(workspace.onDidCloseTextDocument(d => handleContentChange(d.uri))); + toDispose.push(workspace.onDidCloseTextDocument(d => { + handleContentChange(d.uri); + fileSchemaErrors.delete(d.uri.toString()); + })); toDispose.push(window.onDidChangeActiveTextEditor(handleActiveEditorChange)); let handleRetrySchemaCommand = () => { From 54f4967761ca9567295ec14d35d6b530714359ab Mon Sep 17 00:00:00 2001 From: Literallie Date: Thu, 11 Oct 2018 22:06:48 +0200 Subject: [PATCH 09/10] Refactor SchemaRetryNotification to ForceValidateRequest Now returns the new diagnostics. Also, actually refresh the schemas instead of just revalidating the documents. It worked only sometimes before. --- .../client/src/jsonMain.ts | 6 +-- .../server/src/jsonServerMain.ts | 37 ++++++++++++------- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/extensions/json-language-features/client/src/jsonMain.ts b/extensions/json-language-features/client/src/jsonMain.ts index 5116fba257c..a882115d1b8 100644 --- a/extensions/json-language-features/client/src/jsonMain.ts +++ b/extensions/json-language-features/client/src/jsonMain.ts @@ -22,8 +22,8 @@ namespace SchemaContentChangeNotification { export const type: NotificationType = new NotificationType('json/schemaContent'); } -namespace SchemaRetryNotification { - export const type: NotificationType = new NotificationType('json/schemaRetry'); +namespace ForceValidateRequest { + export const type: RequestType = new RequestType('json/validate'); } export interface ISchemaAssociations { @@ -171,7 +171,7 @@ export function activate(context: ExtensionContext) { let handleRetrySchemaCommand = () => { if (window.activeTextEditor) { - client.sendNotification(SchemaRetryNotification.type, window.activeTextEditor.document.uri.toString()); + client.sendRequest(ForceValidateRequest.type, window.activeTextEditor.document.uri.toString()); statusBarItem.text = '$(watch) JSON'; } }; diff --git a/extensions/json-language-features/server/src/jsonServerMain.ts b/extensions/json-language-features/server/src/jsonServerMain.ts index e2dd17bf4a0..8a8ce642331 100644 --- a/extensions/json-language-features/server/src/jsonServerMain.ts +++ b/extensions/json-language-features/server/src/jsonServerMain.ts @@ -6,7 +6,7 @@ import { createConnection, IConnection, TextDocuments, TextDocument, InitializeParams, InitializeResult, NotificationType, RequestType, - DocumentRangeFormattingRequest, Disposable, ServerCapabilities + DocumentRangeFormattingRequest, Disposable, ServerCapabilities, Diagnostic } from 'vscode-languageserver'; import { xhr, XHRResponse, configure as configureHttpRequests, getErrorStatusDescription } from 'request-light'; @@ -34,8 +34,8 @@ namespace SchemaContentChangeNotification { export const type: NotificationType = new NotificationType('json/schemaContent'); } -namespace SchemaRetryNotification { - export const type: NotificationType = new NotificationType('json/schemaRetry'); +namespace ForceValidateRequest { + export const type: RequestType = new RequestType('json/validate'); } // Create a connection for the server @@ -212,11 +212,18 @@ connection.onNotification(SchemaContentChangeNotification.type, uri => { }); // Retry schema validation on all open documents -connection.onNotification(SchemaRetryNotification.type, uri => { - const document = documents.get(uri); - if (document) { - triggerValidation(document); - } +connection.onRequest(ForceValidateRequest.type, uri => { + return new Promise(resolve => { + const document = documents.get(uri); + if (document) { + updateConfiguration(); + validateTextDocument(document, diagnostics => { + resolve(diagnostics); + }); + } else { + resolve([]); + } + }); }); function updateConfiguration() { @@ -283,10 +290,15 @@ function triggerValidation(textDocument: TextDocument): void { }, validationDelayMs); } -function validateTextDocument(textDocument: TextDocument): void { +function validateTextDocument(textDocument: TextDocument, callback?: (diagnostics: Diagnostic[]) => void): void { + const respond = (diagnostics: Diagnostic[]) => { + connection.sendDiagnostics({ uri: textDocument.uri, diagnostics }); + if (callback) { + callback(diagnostics); + } + }; if (textDocument.getText().length === 0) { - // ignore empty documents - connection.sendDiagnostics({ uri: textDocument.uri, diagnostics: [] }); + respond([]); // ignore empty documents return; } const jsonDocument = getJSONDocument(textDocument); @@ -297,8 +309,7 @@ function validateTextDocument(textDocument: TextDocument): void { setTimeout(() => { const currDocument = documents.get(textDocument.uri); if (currDocument && currDocument.version === version) { - // Send the computed diagnostics to VSCode. - connection.sendDiagnostics({ uri: textDocument.uri, diagnostics }); + respond(diagnostics); // Send the computed diagnostics to VSCode. } }, 100); }, error => { From fa9d7fc7615e044499ac5a23dc51f12d54bc7f80 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 29 Oct 2018 21:35:06 +0100 Subject: [PATCH 10/10] only show alert --- .../json-language-features/client/src/jsonMain.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/extensions/json-language-features/client/src/jsonMain.ts b/extensions/json-language-features/client/src/jsonMain.ts index a882115d1b8..aff29e82bcd 100644 --- a/extensions/json-language-features/client/src/jsonMain.ts +++ b/extensions/json-language-features/client/src/jsonMain.ts @@ -87,7 +87,7 @@ export function activate(context: ExtensionContext) { let showStatusBarItem = (message: string) => { statusBarItem.tooltip = message + '\n' + localize('json.clickToRetry', 'Click to retry.'); - statusBarItem.text = '$(alert) JSON'; + statusBarItem.text = '$(alert)'; statusBarItem.show(); }; @@ -107,8 +107,7 @@ export function activate(context: ExtensionContext) { didChangeConfiguration: () => client.sendNotification(DidChangeConfigurationNotification.type, { settings: getSettings() }) }, handleDiagnostics: (uri: Uri, diagnostics: Diagnostic[], next: HandleDiagnosticsSignature) => { - const schemaErrorIndex = diagnostics - .findIndex(candidate => candidate.code === /* SchemaResolveError */ 0x300); + const schemaErrorIndex = diagnostics.findIndex(candidate => candidate.code === /* SchemaResolveError */ 0x300); if (schemaErrorIndex !== -1) { // Show schema resolution errors in status bar only; ref: #51032 const schemaResolveDiagnostic = diagnostics[schemaErrorIndex]; @@ -154,8 +153,9 @@ export function activate(context: ExtensionContext) { }; let handleActiveEditorChange = (activeEditor?: TextEditor) => { - if (activeEditor && fileSchemaErrors.has(activeEditor.document.uri.toString())) { - const message = fileSchemaErrors.get(activeEditor.document.uri.toString())!; + const uriStr = activeEditor && activeEditor.document.uri.toString(); + if (uriStr && fileSchemaErrors.has(uriStr)) { + const message = fileSchemaErrors.get(uriStr)!; showStatusBarItem(message); } else { statusBarItem.hide(); @@ -172,7 +172,7 @@ export function activate(context: ExtensionContext) { let handleRetrySchemaCommand = () => { if (window.activeTextEditor) { client.sendRequest(ForceValidateRequest.type, window.activeTextEditor.document.uri.toString()); - statusBarItem.text = '$(watch) JSON'; + statusBarItem.text = '$(watch)'; } };