diff --git a/src/extension.ts b/src/extension.ts index bb396636..9be0c92d 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -8,7 +8,7 @@ import * as path from 'path'; -import { workspace, ExtensionContext, extensions } from 'vscode'; +import { workspace, ExtensionContext, extensions, OutputChannel, window } from 'vscode'; import { LanguageClient, LanguageClientOptions, ServerOptions, TransportKind, NotificationType } from 'vscode-languageclient'; import { URI } from 'vscode-uri'; import { CUSTOM_SCHEMA_REQUEST, CUSTOM_CONTENT_REQUEST, SchemaExtensionAPI } from './schema-extension-api'; @@ -25,6 +25,8 @@ namespace DynamicCustomSchemaRequestRegistration { export const type: NotificationType<{}, {}> = new NotificationType('yaml/registerCustomSchemaRequest'); } +let client: LanguageClient; + export function activate(context: ExtensionContext) { // The YAML language server is implemented in node let serverModule = context.asAbsolutePath(path.join('node_modules', 'yaml-language-server', 'out', 'server', 'src', 'server.js')); @@ -57,7 +59,7 @@ export function activate(context: ExtensionContext) { }; // Create the language client and start it - let client = new LanguageClient('yaml', 'YAML Support', serverOptions, clientOptions); + client = new LanguageClient('yaml', 'YAML Support', serverOptions, clientOptions); let disposable = client.start(); const schemaExtensionAPI = new SchemaExtensionAPI(client); @@ -131,3 +133,7 @@ function getSchemaAssociation(context: ExtensionContext): ISchemaAssociations { return associations; } + +export function logToExtensionOutputChannel(message: string) { + client.outputChannel.appendLine(message); +} diff --git a/src/schema-extension-api.ts b/src/schema-extension-api.ts index c61d17c7..a47be6d5 100644 --- a/src/schema-extension-api.ts +++ b/src/schema-extension-api.ts @@ -1,6 +1,7 @@ import { URI } from 'vscode-uri' import { LanguageClient, RequestType } from 'vscode-languageclient'; import { workspace } from 'vscode'; +import { logToExtensionOutputChannel } from './extension'; interface SchemaContributorProvider { readonly requestSchema: (resource: string) => string; @@ -92,24 +93,28 @@ class SchemaExtensionAPI implements ExtensionAPI { public requestCustomSchema(resource: string): string[] { const matches = []; for (let customKey of Object.keys(this._customSchemaContributors)) { - const contributor = this._customSchemaContributors[customKey]; - let uri: string; - if (contributor.label && workspace.textDocuments) { - const labelRegexp = new RegExp(contributor.label, 'g'); - for (const doc of workspace.textDocuments) { - if (doc.uri.toString() === resource) { - if (labelRegexp.test(doc.getText())) { - uri = contributor.requestSchema(resource); - return [uri]; + try { + const contributor = this._customSchemaContributors[customKey]; + let uri: string; + if (contributor.label && workspace.textDocuments) { + const labelRegexp = new RegExp(contributor.label, 'g'); + for (const doc of workspace.textDocuments) { + if (doc.uri.toString() === resource) { + if (labelRegexp.test(doc.getText())) { + uri = contributor.requestSchema(resource); + return [uri]; + } } } } - } - uri = contributor.requestSchema(resource); + uri = contributor.requestSchema(resource); - if (uri) { - matches.push(uri); + if (uri) { + matches.push(uri); + } + } catch (error) { + logToExtensionOutputChannel(`Error thrown while requesting schema "${error}" when calling the registered contributor "${customKey}"`); } } return matches;