Skip to content

Commit c82830b

Browse files
authored
Merge pull request #94 from redhat-developer/register-schema-provider
Added registration for custom schema provider
2 parents d13a903 + 619438d commit c82830b

File tree

3 files changed

+28
-11
lines changed

3 files changed

+28
-11
lines changed

src/languageservice/services/jsonSchemaService.ts

+7-3
Original file line numberDiff line numberDiff line change
@@ -243,14 +243,14 @@ export class JSONSchemaService implements IJSONSchemaService {
243243
private callOnDispose: Function[];
244244
private requestService: SchemaRequestService;
245245
private promiseConstructor: PromiseConstructor;
246-
private customSchemaProvider: CustomSchemaProvider;
246+
private customSchemaProvider: CustomSchemaProvider | undefined;
247247

248-
constructor(requestService: SchemaRequestService, contextService?: WorkspaceContextService, customSchemaProvider?: CustomSchemaProvider, promiseConstructor?: PromiseConstructor) {
248+
constructor(requestService: SchemaRequestService, contextService?: WorkspaceContextService, promiseConstructor?: PromiseConstructor) {
249249
this.contextService = contextService;
250250
this.requestService = requestService;
251251
this.promiseConstructor = promiseConstructor || Promise;
252252
this.callOnDispose = [];
253-
this.customSchemaProvider = customSchemaProvider;
253+
this.customSchemaProvider = undefined;
254254
this.contributionSchemas = {};
255255
this.contributionAssociations = {};
256256
this.schemasById = {};
@@ -259,6 +259,10 @@ export class JSONSchemaService implements IJSONSchemaService {
259259
this.registeredSchemasIds = {};
260260
}
261261

262+
registerCustomSchemaProvider(customSchemaProvider: CustomSchemaProvider) {
263+
this.customSchemaProvider = customSchemaProvider;
264+
}
265+
262266
public getRegisteredSchemaIds(filter?: (scheme) => boolean): string[] {
263267
return Object.keys(this.registeredSchemasIds).filter(id => {
264268
let scheme = URI.parse(id).scheme;

src/languageservice/yamlLanguageService.ts

+10-5
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
* Copyright (c) Microsoft Corporation. All rights reserved.
44
* Licensed under the MIT License. See License.txt in the project root for license information.
55
*--------------------------------------------------------------------------------------------*/
6-
import { JSONSchemaService } from './services/jsonSchemaService'
7-
import { TextDocument, Position, CompletionList, Diagnostic } from 'vscode-languageserver-types';
6+
7+
import { JSONSchemaService, CustomSchemaProvider } from './services/jsonSchemaService'
8+
import { TextDocument, Position, CompletionList, FormattingOptions, Diagnostic } from 'vscode-languageserver-types';
89
import { JSONSchema } from './jsonSchema';
910
import { YAMLDocumentSymbols } from './services/documentSymbols';
1011
import { YAMLCompletion } from "./services/yamlCompletion";
@@ -100,7 +101,8 @@ export interface CustomFormatterOptions {
100101

101102
export interface LanguageService {
102103
configure(settings): void;
103-
doComplete(document: TextDocument, position: Position, doc): Thenable<CompletionList>;
104+
registerCustomSchemaProvider(schemaProvider: CustomSchemaProvider): void; // Register a custom schema provider
105+
doComplete(document: TextDocument, position: Position, doc): Thenable<CompletionList>;
104106
doValidation(document: TextDocument, yamlDocument): Thenable<Diagnostic[]>;
105107
doHover(document: TextDocument, position: Position, doc);
106108
findDocumentSymbols(document: TextDocument, doc);
@@ -109,10 +111,10 @@ export interface LanguageService {
109111
doFormat(document: TextDocument, options: CustomFormatterOptions);
110112
}
111113

112-
export function getLanguageService(schemaRequestService, workspaceContext, contributions, customSchemaProvider, promiseConstructor?): LanguageService {
114+
export function getLanguageService(schemaRequestService, workspaceContext, contributions, promiseConstructor?): LanguageService {
113115
let promise = promiseConstructor || Promise;
114116

115-
let schemaService = new JSONSchemaService(schemaRequestService, workspaceContext, customSchemaProvider);
117+
let schemaService = new JSONSchemaService(schemaRequestService, workspaceContext);
116118

117119
let completer = new YAMLCompletion(schemaService, contributions, promise);
118120
let hover = new YAMLHover(schemaService, contributions, promise);
@@ -132,6 +134,9 @@ export function getLanguageService(schemaRequestService, workspaceContext, contr
132134
let customTagsSetting = settings && settings["customTags"] ? settings["customTags"] : [];
133135
completer.configure(settings, customTagsSetting);
134136
},
137+
registerCustomSchemaProvider: (schemaProvider: CustomSchemaProvider) => {
138+
schemaService.registerCustomSchemaProvider(schemaProvider);
139+
},
135140
doComplete: completer.doComplete.bind(completer),
136141
doResolve: completer.doResolve.bind(completer),
137142
doValidation: yamlValidation.doValidation.bind(yamlValidation),

src/server.ts

+11-3
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import Strings = require('./languageservice/utils/strings');
2222
import { getLineOffsets, removeDuplicatesObj } from './languageservice/utils/arrUtils';
2323
import { getLanguageService as getCustomLanguageService, LanguageSettings, CustomFormatterOptions } from './languageservice/yamlLanguageService';
2424
import * as nls from 'vscode-nls';
25-
import { FilePatternAssociation } from './languageservice/services/jsonSchemaService';
25+
import { FilePatternAssociation, CustomSchemaProvider } from './languageservice/services/jsonSchemaService';
2626
import { parse as parseYAML } from './languageservice/parser/yamlParser';
2727
import { JSONDocument } from './languageservice/parser/jsonParser';
2828
import { JSONSchema } from './languageservice/jsonSchema';
@@ -36,6 +36,10 @@ namespace SchemaAssociationNotification {
3636
export const type: NotificationType<{}, {}> = new NotificationType('json/schemaAssociations');
3737
}
3838

39+
namespace DynamicCustomSchemaRequestRegistration {
40+
export const type: NotificationType<{}, {}> = new NotificationType('yaml/registerCustomSchemaRequest');
41+
}
42+
3943
namespace VSCodeContentRequest {
4044
export const type: RequestType<{}, {}, {}, {}> = new RequestType('vscode/content');
4145
}
@@ -167,8 +171,7 @@ let schemaRequestService = (uri: string): Thenable<string> => {
167171

168172
export let KUBERNETES_SCHEMA_URL = "https://gist.githubusercontent.com/JPinkney/ccaf3909ef811e5657ca2e2e1fa05d76/raw/f85e51bfb67fdb99ab7653c2953b60087cc871ea/openshift_schema_all.json";
169173
export let KEDGE_SCHEMA_URL = "https://raw.githubusercontent.com/kedgeproject/json-schema/master/master/kedge-json-schema.json";
170-
export let customLanguageService = getCustomLanguageService(schemaRequestService, workspaceContext, [],
171-
(resource) => connection.sendRequest(CustomSchemaRequest.type, resource));
174+
export let customLanguageService = getCustomLanguageService(schemaRequestService, workspaceContext, []);
172175

173176
// The settings interface describes the server relevant settings part
174177
interface Settings {
@@ -305,6 +308,11 @@ connection.onNotification(SchemaAssociationNotification.type, associations => {
305308
updateConfiguration();
306309
});
307310

311+
connection.onNotification(DynamicCustomSchemaRequestRegistration.type, () => {
312+
const schemaProvider = ((resource) => connection.sendRequest(CustomSchemaRequest.type, resource)) as CustomSchemaProvider;
313+
customLanguageService.registerCustomSchemaProvider(schemaProvider);
314+
});
315+
308316
function updateConfiguration() {
309317
let languageSettings: LanguageSettings = {
310318
validate: yamlShouldValidate,

0 commit comments

Comments
 (0)