Skip to content

Commit c740899

Browse files
committed
Change document symbol provider to be recursive for structs
Signed-off-by: worksofliam <[email protected]>
1 parent 4da7c1e commit c740899

File tree

1 file changed

+23
-19
lines changed

1 file changed

+23
-19
lines changed

extension/server/src/providers/documentSymbols.ts

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,28 @@ export default async function documentSymbolProvider(handler: DocumentSymbolPara
1212
return def.range.start !== null && def.range.start >= 0 && def.range.end !== null;
1313
}
1414

15+
const expandStruct = (def: Declaration): DocumentSymbol => {
16+
let start = def.range.start || def.position.range.line;
17+
let end = def.range.end || def.position.range.line;
18+
let hasChildren = def.subItems && def.subItems.length > 0;
19+
20+
const parent = DocumentSymbol.create(
21+
def.name,
22+
prettyKeywords(def.keyword),
23+
hasChildren ? SymbolKind.Struct : SymbolKind.Property,
24+
Range.create(start, 0, end, 0),
25+
Range.create(start, 0, start, 0),
26+
);
27+
28+
if (hasChildren) {
29+
parent.children = def.subItems
30+
.filter(subitem => subitem.position && subitem.position.path === currentPath)
31+
.map(subitem => expandStruct(subitem));
32+
}
33+
34+
return parent;
35+
}
36+
1537
if (document) {
1638
const doc = await parser.getDocs(currentPath, document.getText());
1739

@@ -143,25 +165,7 @@ export default async function documentSymbolProvider(handler: DocumentSymbolPara
143165
scope.structs
144166
.filter(struct => struct.position && struct.position.path === currentPath && validRange(struct))
145167
.forEach(struct => {
146-
const structDef = DocumentSymbol.create(
147-
struct.name,
148-
prettyKeywords(struct.keyword),
149-
SymbolKind.Struct,
150-
Range.create(struct.range.start!, 0, struct.range.end!, 0),
151-
Range.create(struct.range.start!, 0, struct.range.start!, 0),
152-
);
153-
154-
structDef.children = struct.subItems
155-
.filter(subitem => subitem.position && subitem.position.path === currentPath)
156-
.map(subitem => DocumentSymbol.create(
157-
subitem.name,
158-
prettyKeywords(subitem.keyword),
159-
SymbolKind.Property,
160-
Range.create(subitem.position.range.line, 0, subitem.position.range.line, 0),
161-
Range.create(subitem.position.range.line, 0, subitem.position.range.line, 0)
162-
));
163-
164-
currentScopeDefs.push(structDef);
168+
currentScopeDefs.push(expandStruct(struct));
165169
});
166170

167171
return currentScopeDefs;

0 commit comments

Comments
 (0)