Skip to content

Commit 27522e8

Browse files
authored
Merge pull request #257 from ananthakumaran/findDefinition
add support for textDocument/definition
2 parents f6b89fd + 6e44d6d commit 27522e8

File tree

6 files changed

+98
-8
lines changed

6 files changed

+98
-8
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
"js-yaml": "^3.13.1",
3333
"jsonc-parser": "^2.2.1",
3434
"request-light": "^0.2.4",
35-
"vscode-json-languageservice": "^3.5.2",
35+
"vscode-json-languageservice": "^3.6.0",
3636
"vscode-languageserver": "^5.2.1",
3737
"vscode-languageserver-types": "^3.15.1",
3838
"vscode-nls": "^4.1.2",
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { JSONSchemaRef, JSONSchema } from '../jsonSchema';
2+
import { TextDocument, Position, DefinitionLink } from 'vscode-languageserver-types';
3+
import { parse as parseYAML } from '../parser/yamlParser07';
4+
import { matchOffsetToDocument } from '../utils/arrUtils';
5+
import { findDefinition as JSONFindDefinition } from 'vscode-json-languageservice/lib/umd/services/jsonDefinition';
6+
7+
export function findDefinition(document: TextDocument, position: Position): Thenable<DefinitionLink[]> {
8+
const doc = parseYAML(document.getText());
9+
const offset = document.offsetAt(position);
10+
const currentDoc = matchOffsetToDocument(offset, doc);
11+
if (currentDoc === null) {
12+
return Promise.resolve([]);
13+
}
14+
15+
const currentDocIndex = doc.documents.indexOf(currentDoc);
16+
currentDoc.currentDocIndex = currentDocIndex;
17+
return JSONFindDefinition(document, position, currentDoc);
18+
}

src/languageservice/yamlLanguageService.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@
55
*--------------------------------------------------------------------------------------------*/
66

77
import { YAMLSchemaService, CustomSchemaProvider, SchemaAdditions, SchemaDeletions } from './services/yamlSchemaService';
8-
import { TextDocument, Position, CompletionList, Diagnostic, Hover, SymbolInformation, DocumentSymbol, CompletionItem, TextEdit } from 'vscode-languageserver-types';
8+
import { TextDocument, Position, CompletionList, Diagnostic, Hover, SymbolInformation, DocumentSymbol, CompletionItem, TextEdit, DefinitionLink } from 'vscode-languageserver-types';
99
import { JSONSchema } from './jsonSchema';
1010
import { YAMLDocumentSymbols } from './services/documentSymbols';
1111
import { YAMLCompletion } from './services/yamlCompletion';
1212
import { YAMLHover } from './services/yamlHover';
1313
import { YAMLValidation } from './services/yamlValidation';
1414
import { YAMLFormatter } from './services/yamlFormatter';
1515
import { getLanguageService as getJSONLanguageService, JSONWorkerContribution } from 'vscode-json-languageservice';
16+
import { findDefinition } from './services/yamlDefinition';
1617

1718
export interface LanguageSettings {
1819
validate?: boolean; //Setting for whether we want to validate the schema
@@ -116,6 +117,7 @@ export interface LanguageService {
116117
findDocumentSymbols(document: TextDocument): SymbolInformation[];
117118
findDocumentSymbols2(document: TextDocument): DocumentSymbol[];
118119
doResolve(completionItem): Thenable<CompletionItem>;
120+
findDefinition(document: TextDocument, position: Position): Thenable<DefinitionLink[]>;
119121
resetSchema(uri: string): boolean;
120122
doFormat(document: TextDocument, options: CustomFormatterOptions): TextEdit[];
121123
addSchema(schemaID: string, schema: JSONSchema): void;
@@ -154,6 +156,7 @@ export function getLanguageService(schemaRequestService: SchemaRequestService,
154156
registerCustomSchemaProvider: (schemaProvider: CustomSchemaProvider) => {
155157
schemaService.registerCustomSchemaProvider(schemaProvider);
156158
},
159+
findDefinition,
157160
doComplete: completer.doComplete.bind(completer),
158161
doResolve: completer.doResolve.bind(completer),
159162
doValidation: yamlValidation.doValidation.bind(yamlValidation),

src/server.ts

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ let workspaceRoot: URI = null;
104104
let workspaceFolders: WorkspaceFolder[] = [];
105105
let clientDynamicRegisterSupport = false;
106106
let hierarchicalDocumentSymbolSupport = false;
107+
let clientDefinitionLinkSupport = false;
107108

108109
/****************************
109110
* Reusable helper functions
@@ -353,6 +354,11 @@ connection.onInitialize((params: InitializeParams): InitializeResult => {
353354
capabilities.textDocument.rangeFormatting &&
354355
capabilities.textDocument.rangeFormatting.dynamicRegistration
355356
);
357+
clientDefinitionLinkSupport = !!(
358+
capabilities.textDocument &&
359+
capabilities.textDocument.definition &&
360+
capabilities.textDocument.definition.linkSupport
361+
);
356362

357363
return {
358364
capabilities: {
@@ -361,7 +367,8 @@ connection.onInitialize((params: InitializeParams): InitializeResult => {
361367
hoverProvider: true,
362368
documentSymbolProvider: true,
363369
documentFormattingProvider: false,
364-
documentRangeFormattingProvider: false
370+
documentRangeFormattingProvider: false,
371+
definitionProvider: true
365372
}
366373
};
367374
});
@@ -564,6 +571,20 @@ connection.onDocumentFormatting(formatParams => {
564571
return customLanguageService.doFormat(document, customFormatterSettings);
565572
});
566573

574+
connection.onDefinition(params => {
575+
const document = documents.get(params.textDocument.uri);
576+
if (!document) {
577+
return Promise.resolve([]);
578+
}
579+
580+
const definitionLinksPromise = customLanguageService.findDefinition(document, params.position);
581+
if (clientDefinitionLinkSupport) {
582+
return definitionLinksPromise;
583+
} else {
584+
return definitionLinksPromise.then(definitionLinks => definitionLinks.map(definitionLink => ({uri: definitionLink.targetUri, range: definitionLink.targetRange})));
585+
}
586+
});
587+
567588
connection.onRequest(SchemaModificationNotification.type, (modifications: SchemaAdditions | SchemaDeletions) => {
568589
if (modifications.action === MODIFICATION_ACTIONS.add) {
569590
customLanguageService.modifySchemaContent(modifications);

test/findDefintion.test.ts

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Red Hat. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
*--------------------------------------------------------------------------------------------*/
5+
import { getLanguageService } from '../src/languageservice/yamlLanguageService';
6+
import { schemaRequestService, setupTextDocument, workspaceContext } from './utils/testHelper';
7+
import assert = require('assert');
8+
9+
const languageService = getLanguageService(schemaRequestService, workspaceContext, [], null);
10+
11+
suite('FindDefintion Tests', () => {
12+
13+
describe('Jump to defintion', function () {
14+
15+
function findDefinitions(content: string, position: number) {
16+
const testTextDocument = setupTextDocument(content);
17+
return languageService.findDefinition(testTextDocument, testTextDocument.positionAt(position));
18+
}
19+
20+
it('Find source defintion', done => {
21+
const content = "definitions:\n link:\n type: string\ntype: object\nproperties:\n uri:\n $ref: '#/definitions/link'\n";
22+
const definitions = findDefinitions(content, content.lastIndexOf('/li'));
23+
definitions.then(function (results) {
24+
assert.equal(results.length, 1);
25+
assert.deepEqual(results[0].originSelectionRange, {
26+
start: {
27+
line: 6,
28+
character: 10
29+
},
30+
end: {
31+
line: 6,
32+
character: 30
33+
}
34+
});
35+
assert.deepEqual(results[0].targetRange, {
36+
start: {
37+
line: 2,
38+
character: 4
39+
},
40+
end: {
41+
line: 2,
42+
character: 16
43+
}
44+
});
45+
}).then(done, done);
46+
});
47+
});
48+
});

yarn.lock

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1490,15 +1490,15 @@ verror@1.10.0:
14901490
core-util-is "1.0.2"
14911491
extsprintf "^1.2.0"
14921492

1493-
vscode-json-languageservice@^3.5.2:
1494-
version "3.5.2"
1495-
resolved "https://registry.yarnpkg.com/vscode-json-languageservice/-/vscode-json-languageservice-3.5.2.tgz#4b898140a8e581359c10660845a4cae15dcbb4f9"
1496-
integrity sha512-9cUvBq00O08lpWVVOx6tQ1yLxCHss79nsUdEAVYGomRyMbnPBmc0AkYPcXI9WK1EM6HBo0R9Zo3NjFhcICpy4A==
1493+
vscode-json-languageservice@^3.6.0:
1494+
version "3.6.0"
1495+
resolved "https://registry.yarnpkg.com/vscode-json-languageservice/-/vscode-json-languageservice-3.6.0.tgz#133a1e2c3a3dffe38564a1ba948516805c3c1869"
1496+
integrity sha512-dXzFywypUZ9T0tjr4fREZiknXDz6vAGx1zsxbQY1+9DOpjMfbz0VLP873KmcbuvL4K3nseKTxc4TKHu8kLXRMw==
14971497
dependencies:
14981498
jsonc-parser "^2.2.1"
14991499
vscode-languageserver-textdocument "^1.0.1"
15001500
vscode-languageserver-types "^3.15.1"
1501-
vscode-nls "^4.1.1"
1501+
vscode-nls "^4.1.2"
15021502
vscode-uri "^2.1.1"
15031503

15041504
vscode-jsonrpc@^4.0.0:

0 commit comments

Comments
 (0)