Skip to content

Commit 5bafa9d

Browse files
committed
Wrap yam definition in a class to fix telemetry error
Signed-off-by: Yevhen Vydolob <[email protected]>
1 parent cd4303b commit 5bafa9d

File tree

3 files changed

+35
-22
lines changed

3 files changed

+35
-22
lines changed

src/languageservice/services/yamlDefinition.ts

+22-17
Original file line numberDiff line numberDiff line change
@@ -7,29 +7,34 @@ import { DefinitionParams, LocationLink, Range } from 'vscode-languageserver-pro
77
import { TextDocument } from 'vscode-languageserver-textdocument';
88
import { DefinitionLink } from 'vscode-languageserver-types';
99
import { isAlias } from 'yaml';
10+
import { Telemetry } from '../../languageserver/telemetry';
1011
import { yamlDocumentsCache } from '../parser/yaml-documents';
1112
import { matchOffsetToDocument } from '../utils/arrUtils';
1213
import { TextBuffer } from '../utils/textBuffer';
1314

14-
export function getDefinition(document: TextDocument, params: DefinitionParams): DefinitionLink[] | undefined {
15-
try {
16-
const yamlDocument = yamlDocumentsCache.getYamlDocument(document);
17-
const offset = document.offsetAt(params.position);
18-
const currentDoc = matchOffsetToDocument(offset, yamlDocument);
19-
if (currentDoc) {
20-
const [node] = currentDoc.getNodeFromPosition(offset, new TextBuffer(document));
21-
if (node && isAlias(node)) {
22-
const defNode = node.resolve(currentDoc.internalDocument);
23-
if (defNode && defNode.range) {
24-
const targetRange = Range.create(document.positionAt(defNode.range[0]), document.positionAt(defNode.range[2]));
25-
const selectionRange = Range.create(document.positionAt(defNode.range[0]), document.positionAt(defNode.range[1]));
26-
return [LocationLink.create(document.uri, targetRange, selectionRange)];
15+
export class YamlDefinition {
16+
constructor(private readonly telemetry: Telemetry) {}
17+
18+
getDefinition(document: TextDocument, params: DefinitionParams): DefinitionLink[] | undefined {
19+
try {
20+
const yamlDocument = yamlDocumentsCache.getYamlDocument(document);
21+
const offset = document.offsetAt(params.position);
22+
const currentDoc = matchOffsetToDocument(offset, yamlDocument);
23+
if (currentDoc) {
24+
const [node] = currentDoc.getNodeFromPosition(offset, new TextBuffer(document));
25+
if (node && isAlias(node)) {
26+
const defNode = node.resolve(currentDoc.internalDocument);
27+
if (defNode && defNode.range) {
28+
const targetRange = Range.create(document.positionAt(defNode.range[0]), document.positionAt(defNode.range[2]));
29+
const selectionRange = Range.create(document.positionAt(defNode.range[0]), document.positionAt(defNode.range[1]));
30+
return [LocationLink.create(document.uri, targetRange, selectionRange)];
31+
}
2732
}
2833
}
34+
} catch (err) {
35+
this.telemetry.sendError('yaml.definition.error', { error: err.toString() });
2936
}
30-
} catch (err) {
31-
this.telemetry.sendError('yaml.definition.error', { error: err.toString() });
32-
}
3337

34-
return undefined;
38+
return undefined;
39+
}
3540
}

src/languageservice/yamlLanguageService.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ import { YamlCompletion } from './services/yamlCompletion';
5454
import { yamlDocumentsCache } from './parser/yaml-documents';
5555
import { SettingsState } from '../yamlSettings';
5656
import { JSONSchemaSelection } from '../languageserver/handlers/schemaSelectionHandlers';
57-
import { getDefinition } from './services/yamlDefinition';
57+
import { YamlDefinition } from './services/yamlDefinition';
5858

5959
export enum SchemaPriority {
6060
SchemaStore = 1,
@@ -173,6 +173,7 @@ export function getLanguageService(
173173
const yamlCodeActions = new YamlCodeActions(clientCapabilities);
174174
const yamlCodeLens = new YamlCodeLens(schemaService, telemetry);
175175
const yamlLinks = new YamlLinks(telemetry);
176+
const yamlDefinition = new YamlDefinition(telemetry);
176177

177178
new JSONSchemaSelection(schemaService, yamlSettings, connection);
178179

@@ -210,7 +211,7 @@ export function getLanguageService(
210211
doHover: hover.doHover.bind(hover),
211212
findDocumentSymbols: yamlDocumentSymbols.findDocumentSymbols.bind(yamlDocumentSymbols),
212213
findDocumentSymbols2: yamlDocumentSymbols.findHierarchicalDocumentSymbols.bind(yamlDocumentSymbols),
213-
doDefinition: getDefinition.bind(getDefinition),
214+
doDefinition: yamlDefinition.getDefinition.bind(yamlDefinition),
214215
resetSchema: (uri: string) => {
215216
return schemaService.onResourceChange(uri);
216217
},

test/yamlDefinition.test.ts

+10-3
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,26 @@
55

66
import { setupTextDocument, TEST_URI } from './utils/testHelper';
77
import { expect } from 'chai';
8-
import { getDefinition } from '../src/languageservice/services/yamlDefinition';
8+
import { YamlDefinition } from '../src/languageservice/services/yamlDefinition';
99
import { LocationLink, Position, Range } from 'vscode-languageserver-protocol';
10+
import { Telemetry } from '../src/languageserver/telemetry';
1011

1112
describe('YAML Definition', () => {
1213
it('should not provide definition for non anchor node', () => {
1314
const doc = setupTextDocument('foo: &bar some\naaa: *bar');
14-
const result = getDefinition(doc, { position: Position.create(1, 2), textDocument: { uri: TEST_URI } });
15+
const result = new YamlDefinition({} as Telemetry).getDefinition(doc, {
16+
position: Position.create(1, 2),
17+
textDocument: { uri: TEST_URI },
18+
});
1519
expect(result).is.undefined;
1620
});
1721

1822
it('should provide definition for anchor', () => {
1923
const doc = setupTextDocument('foo: &bar some\naaa: *bar');
20-
const result = getDefinition(doc, { position: Position.create(1, 7), textDocument: { uri: TEST_URI } });
24+
const result = new YamlDefinition({} as Telemetry).getDefinition(doc, {
25+
position: Position.create(1, 7),
26+
textDocument: { uri: TEST_URI },
27+
});
2128
expect(result).is.not.undefined;
2229
expect(result[0]).is.eqls(LocationLink.create(TEST_URI, Range.create(0, 10, 1, 0), Range.create(0, 10, 0, 14)));
2330
});

0 commit comments

Comments
 (0)