1+ import { Event , Location , Position , ProviderResult , Range , 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 ( new Position ( item . range . start . line , item . range . start . character ) ,
51+ new Position ( item . range . end . line , item . range . end . character ) ) ) ;
52+ }
53+
54+ }
55+
56+ class ExtendedOutlineProvider implements TreeDataProvider < ExtendedDocumentSymbol > {
57+ onDidChangeTreeData ?: Event < void | ExtendedDocumentSymbol > ;
58+
59+ constructor ( readonly symbols : ExtendedDocumentSymbol [ ] , readonly client : LanguageClient ) { }
60+
61+ getTreeItem ( element : ExtendedDocumentSymbol ) : TreeItem | Thenable < TreeItem > {
62+ let state = TreeItemCollapsibleState . None ;
63+ if ( element . children !== undefined && element . children . length > 0 ) {
64+ state = TreeItemCollapsibleState . Collapsed ;
65+ }
66+
67+ const item : TreeItem = new TreeItem ( element . name , state ) ;
68+ item . description = element . detail ;
69+ item . iconPath = getThemeIcon ( element . kind - 1 ) ;
70+ item . command = ( element . uri ) ? {
71+ command : 'vscode.open' ,
72+ title : 'Open Symbol Definition Location' ,
73+ arguments : [
74+ element . uri , < TextDocumentShowOptions > { selection : element . selectionRange }
75+ ]
76+ } : undefined ;
77+ return item ;
78+ }
79+
80+ getChildren ( element ?: ExtendedDocumentSymbol ) : ProviderResult < ExtendedDocumentSymbol [ ] > {
81+ if ( element === undefined ) {
82+ return Promise . resolve ( this . symbols ) ;
83+ } else {
84+ if ( element . children !== undefined ) {
85+ return Promise . resolve ( element . children as ExtendedDocumentSymbol [ ] ) ;
86+ }
87+ }
88+ return undefined ;
89+ }
90+
91+ getParent ?( _element : ExtendedDocumentSymbol ) : ProviderResult < ExtendedDocumentSymbol > {
92+ return undefined ;
93+ }
94+ }
0 commit comments