Skip to content

Commit 2b49302

Browse files
committed
feat(apidom-ls): expand provided symbols
1 parent b6ea639 commit 2b49302

File tree

7 files changed

+65
-10
lines changed

7 files changed

+65
-10
lines changed

packages/apidom-ls/src/services/symbols/symbols-service.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { Range, SymbolInformation } from 'vscode-languageserver-protocol';
44
import { ArraySlice, Element, filter, MemberElement } from '@swagger-api/apidom-core';
55
import { SymbolKind } from 'vscode-languageserver-types';
66

7-
import { getSourceMap, isMember, SourceMap } from '../../utils/utils';
7+
import { buildPath, getSourceMap, isMember, SourceMap } from '../../utils/utils';
88
import { LanguageSettings, SymbolsContext } from '../../apidom-language-types';
99

1010
export interface SymbolsService {
@@ -54,6 +54,14 @@ export class DefaultSymbolsService implements SymbolsService {
5454
'components-parameters',
5555
'paths',
5656
'channels',
57+
'channelItem',
58+
'schema',
59+
'server',
60+
'servers',
61+
'channel-binding',
62+
'contact',
63+
'identifier',
64+
'message',
5765
'servers',
5866
'components-messages',
5967
];
@@ -105,7 +113,10 @@ export class DefaultSymbolsService implements SymbolsService {
105113
si.containerName = key.toValue() as string;
106114
symbols.push(si);
107115
} else {
108-
symbols.push(SymbolInformation.create(s, SymbolKind.Property, r));
116+
const si: SymbolInformation = SymbolInformation.create(s, SymbolKind.Property, r);
117+
const path = buildPath(e);
118+
si.containerName = path;
119+
symbols.push(si);
109120
}
110121
}
111122
});

packages/apidom-ls/src/utils/utils.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,38 @@ export function processPath(element: Element, path: string, api: Element): Eleme
328328
return targetEl;
329329
}
330330

331+
export function buildPath(element: Element): string {
332+
try {
333+
const path: string[] = [];
334+
if (!element.parent) return '';
335+
let targetEl = element;
336+
while (isArray(targetEl.parent)) {
337+
path.unshift('[]');
338+
targetEl = targetEl.parent;
339+
}
340+
341+
if (targetEl.parent && isMember(targetEl.parent)) {
342+
// @ts-ignore
343+
path.unshift(targetEl.parent.key.toValue() as string);
344+
}
345+
346+
while (targetEl.parent?.parent) {
347+
targetEl = targetEl.parent.parent;
348+
while (isArray(targetEl.parent)) {
349+
path.unshift('[]');
350+
targetEl = targetEl.parent;
351+
}
352+
if (targetEl.parent && isMember(targetEl.parent)) {
353+
// @ts-ignore
354+
path.unshift(targetEl.parent.key.toValue() as string);
355+
}
356+
}
357+
return `/${path.join('/')}`;
358+
} catch (e) {
359+
return '';
360+
}
361+
}
362+
331363
export function getCurrentWord(document: TextDocument | string, offset: number) {
332364
let i = offset - 1;
333365
const text = typeof document === 'string' ? document : document.getText();

packages/apidom-ls/test/asyncapi-json.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ const completionTestInput = [
109109
},
110110
{
111111
label: 'servers',
112-
insertText: '"servers": [\n $1\n],',
112+
insertText: '"servers": {\n $1\n},',
113113
kind: 14,
114114
insertTextFormat: 2,
115115
documentation: {
@@ -207,7 +207,7 @@ const completionTestInput = [
207207
},
208208
{
209209
label: 'servers',
210-
insertText: '"servers": [\n $1\n],\n',
210+
insertText: '"servers": {\n $1\n},\n',
211211
kind: 14,
212212
insertTextFormat: 2,
213213
documentation: {
@@ -305,7 +305,7 @@ const completionTestInput = [
305305
},
306306
{
307307
label: 'servers',
308-
insertText: '"servers": [\n $1\n],\n',
308+
insertText: '"servers": {\n $1\n},\n',
309309
kind: 14,
310310
insertTextFormat: 2,
311311
documentation: {

packages/apidom-ls/test/asyncapi-yaml.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ const completionTestInput = [
149149
},
150150
{
151151
label: 'servers',
152-
insertText: 'servers: \n - $1\n',
152+
insertText: 'servers: \n $1\n',
153153
kind: 14,
154154
insertTextFormat: 2,
155155
documentation: {
@@ -236,7 +236,7 @@ const completionTestInput = [
236236
},
237237
{
238238
label: 'servers',
239-
insertText: 'servers: \n - $1\n',
239+
insertText: 'servers: \n $1\n',
240240
kind: 14,
241241
insertTextFormat: 2,
242242
documentation: {

packages/apidom-ls/test/complete.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ describe('apidom-ls-complete', function () {
203203
},
204204
{
205205
label: 'servers',
206-
insertText: 'servers: \n - $1',
206+
insertText: 'servers: \n $1',
207207
kind: 14,
208208
insertTextFormat: 2,
209209
documentation: {
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
asyncapi: '2.2.0'
2+
components:
3+
schemas:
4+
foo:
5+
6+
bad:
7+
type: object
8+
properties:
9+
car:
10+
11+
bar:
12+
type: string
13+

packages/apidom-ls/test/openapi-yaml-parse.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,14 +98,13 @@ describe('apidom-parse-test', function () {
9898
console.log(
9999
node.element,
100100
node.getMetaProperty('classes', []).toValue(),
101-
node.getMetaProperty('httpMethod', []).toValue(),
102101
`[${sm.offset} / ${sm.line}:${sm.column} - ${sm.endLine}:${sm.endColumn}]`,
103102
node.toValue(),
104103
);
105104
}
106105

107106
// traverse(printSourceMap, api);
108-
traverse(printSourceMap, api);
107+
traverse(printContent, api);
109108

110109
if (result.annotations) {
111110
for (const annotation of result.annotations) {

0 commit comments

Comments
 (0)