Skip to content

Commit

Permalink
WIP Support schema associations in yaml files redhat-developer#204
Browse files Browse the repository at this point in the history
Signed-off-by: Aurélien Pupier <[email protected]>
  • Loading branch information
apupier committed Jul 15, 2020
1 parent 2d5a758 commit cf39ede
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 3 deletions.
2 changes: 1 addition & 1 deletion src/languageservice/services/yamlCompletion.ts
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ export class YAMLCompletion extends JSONCompletion {
}

currentDoc.currentDocIndex = currentDocIndex;
return this.schemaService.getSchemaForResource(document.uri, currentDoc).then(schema => {
return this.schemaService.getSchemaForResource(document, currentDoc).then(schema => {

if (!schema) {
return Promise.resolve(result);
Expand Down
19 changes: 17 additions & 2 deletions src/languageservice/services/yamlSchemaService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import { URI } from 'vscode-uri';

import * as nls from 'vscode-nls';
import { convertSimple2RegExpPattern } from '../utils/strings';
import { TextDocument } from 'vscode-languageserver';
const localize = nls.loadMessageBundle();

export declare type CustomSchemaProvider = (uri: string) => Thenable<string | string[]>;
Expand Down Expand Up @@ -214,11 +215,25 @@ export class YAMLSchemaService extends JSONSchemaService {
}
//tslint:enable

public getSchemaForResource (resource: string, doc = undefined): Thenable<ResolvedSchema> {
public getSchemaForResource (textDocument: TextDocument, doc = undefined): Thenable<ResolvedSchema> {
const resource: string = textDocument.uri;
const resolveSchema = () => {

const seen: { [schemaId: string]: boolean } = Object.create(null);
const schemas: string[] = [];

const wholeText = textDocument.getText();
const yamlModelineIndex = wholeText.indexOf('# yaml-language-server:');
if (yamlModelineIndex != -1) {
const modelineContent = wholeText.substring(yamlModelineIndex, wholeText.indexOf('\n', yamlModelineIndex + '# yaml-language-server:'.length));
const indexOfJsonSchemaParameter = modelineContent.indexOf('$schema=');
if(modelineContent.indexOf('$schema=') != -1){
const schema = modelineContent.substring(indexOfJsonSchemaParameter + '$schema='.length);
schemas.push(schema);
seen[schema] = true;
}
}

for (const entry of this.filePatternAssociations) {
if (entry.matchesPattern(resource)) {
for (const schemaId of entry.getURIs()) {
Expand Down
54 changes: 54 additions & 0 deletions test/autoCompletion.withschemainfile.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Red Hat. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { TextDocument } from 'vscode-languageserver';
import { getLanguageService } from '../src/languageservice/yamlLanguageService';
import { toFsPath, schemaRequestService, workspaceContext } from './utils/testHelper';
import assert = require('assert');
import path = require('path');

const languageService = getLanguageService(schemaRequestService, workspaceContext, [], null);

const languageSettings = {
schemas: [],
completion: true
};

const uri = toFsPath(path.join(__dirname, './fixtures/testArrayMaxProperties.json'));
languageService.configure(languageSettings);

suite('Auto Completion Tests with schema defined in file', () => {

describe('yamlCompletion with schema defined in file', function () {

describe('doComplete', function () {

function setup(content: string) {
return TextDocument.create('file://~/Desktop/vscode-k8s/test.yaml', 'yaml', 0, content);
}

function parseSetup(content: string, position) {
const testTextDocument = setup(content);
return languageService.doComplete(testTextDocument, testTextDocument.positionAt(position), false);
}

it('Provide completion from schema decalred in file', done => {
const content = `# yaml-language-server: $schema=${uri}\n- `;
const completion = parseSetup(content, content.length);
completion.then(function (result) {
assert.equal(result.items.length, 3);
}).then(done, done);
});

it('Provide completion from schema declared in file overriding schemastore ', done => {

});

it('Provide completion from schema declared in file overriding yaml.schemas ', done => {

});

});
});
});

0 comments on commit cf39ede

Please sign in to comment.