1+ import { DocumentSymbol , Event , Location , Position , ProviderResult , Range , SymbolKind , TextDocumentShowOptions , TreeDataProvider , TreeItem , TreeItemCollapsibleState , Uri } from "vscode" ;
2+ import { DocumentSymbolParams , LanguageClient , TextDocumentIdentifier } from "vscode-languageclient/node" ;
3+ import { getActiveLanguageClient } from "../extension" ;
4+ import { getThemeIcon } from "../themeUtils" ;
5+ import { SymbolItemNavigation , SymbolTreeInput , SymbolTreeModel } from "../typeHierarchy/references-view" ;
6+ import { ExtendedDocumentSymbol , ExtendedDocumentSymbolsRequest } from "./protocol" ;
7+
8+ export class ExtendedOutlineTreeInput implements SymbolTreeInput < ExtendedDocumentSymbol > {
9+ readonly contextValue : string = "javaExtendedOutline" ;
10+ readonly title : string = "Extended Outline" ;
11+ client : LanguageClient ;
12+
13+ constructor ( readonly location : Location ) {
14+ }
15+
16+ async resolve ( ) : Promise < SymbolTreeModel < ExtendedDocumentSymbol > > {
17+ if ( ! this . client ) {
18+ this . client = await getActiveLanguageClient ( ) ;
19+ }
20+
21+ const params : DocumentSymbolParams = {
22+ textDocument : TextDocumentIdentifier . create ( this . location . uri . toString ( ) )
23+ } ;
24+ const symbols = await this . client . sendRequest ( ExtendedDocumentSymbolsRequest . type , params ) ;
25+ const treeModel : SymbolTreeModel < ExtendedDocumentSymbol > = {
26+ provider : new ExtendedOutlineProvider ( symbols , this . client ) ,
27+ message : undefined ,
28+ navigation : new ExtendedOutlineModel ( )
29+ } ;
30+ return Promise . resolve ( treeModel ) ;
31+ }
32+
33+ with ( location : Location ) : SymbolTreeInput < ExtendedDocumentSymbol > {
34+ return new ExtendedOutlineTreeInput ( location ) ;
35+ }
36+ }
37+
38+ export class ExtendedOutlineModel implements SymbolItemNavigation < ExtendedDocumentSymbol > {
39+ nearest ( _uri : Uri , _position : Position ) : ExtendedDocumentSymbol | undefined {
40+ return undefined ;
41+ }
42+
43+ next ( from : ExtendedDocumentSymbol ) : ExtendedDocumentSymbol {
44+ return from ;
45+ }
46+ previous ( from : ExtendedDocumentSymbol ) : ExtendedDocumentSymbol {
47+ return from ;
48+ }
49+ location ( item : ExtendedDocumentSymbol ) : Location {
50+ return new Location ( Uri . parse ( item . uri ) , new Range ( item . range . start , item . range . end ) ) ;
51+ }
52+
53+ }
54+
55+ class ExtendedOutlineProvider implements TreeDataProvider < ExtendedDocumentSymbol > {
56+ onDidChangeTreeData ?: Event < void | ExtendedDocumentSymbol > ;
57+
58+ constructor ( readonly symbols : ExtendedDocumentSymbol [ ] , readonly client : LanguageClient ) { }
59+
60+ getTreeItem ( element : ExtendedDocumentSymbol ) : TreeItem | Thenable < TreeItem > {
61+ let state = TreeItemCollapsibleState . None ;
62+ if ( element . children != null && element . children . length > 0 )
63+ state = TreeItemCollapsibleState . Collapsed ;
64+
65+ const item : TreeItem = new TreeItem ( element . name , state ) ;
66+ item . description = element . detail ;
67+ item . iconPath = getThemeIcon ( element . kind - 1 ) ;
68+ item . command = ( element . uri ) ? {
69+ command : 'vscode.open' ,
70+ title : 'Open Symbol Definition Location' ,
71+ arguments : [
72+ element . uri , < TextDocumentShowOptions > { selection : element . selectionRange }
73+ ]
74+ } : undefined ;
75+ return item ;
76+ }
77+
78+ getChildren ( element ?: ExtendedDocumentSymbol ) : ProviderResult < ExtendedDocumentSymbol [ ] > {
79+ if ( element == null ) {
80+ return Promise . resolve ( this . symbols ) ;
81+ } else {
82+ if ( element . children != null ) {
83+ return Promise . resolve ( element . children as ExtendedDocumentSymbol [ ] ) ;
84+ }
85+ }
86+ return undefined ;
87+ }
88+
89+ getParent ?( _element : ExtendedDocumentSymbol ) : ProviderResult < ExtendedDocumentSymbol > {
90+ return undefined ;
91+ }
92+ }
0 commit comments