1
1
'use strict' ;
2
2
3
- import { DocumentSymbolRequest , SymbolInformation as clientSymbolInformation , DocumentSymbol as clientDocumentSymbol , HoverRequest } from "vscode-languageclient" ;
3
+ import { DocumentSymbolRequest , SymbolInformation as clientSymbolInformation , DocumentSymbol as clientDocumentSymbol , HoverRequest , WorkspaceSymbolRequest } from "vscode-languageclient" ;
4
4
import { LanguageClient } from "vscode-languageclient/node" ;
5
- import { ExtensionContext , languages , DocumentSymbolProvider , TextDocument , CancellationToken , SymbolInformation , DocumentSymbol , TextDocumentContentProvider , workspace , Uri , Event , HoverProvider , Position , Hover } from "vscode" ;
6
- import { ClassFileContentsRequest } from "./protocol" ;
5
+ import { ExtensionContext , languages , DocumentSymbolProvider , TextDocument , CancellationToken , SymbolInformation , DocumentSymbol , TextDocumentContentProvider , workspace , Uri , Event , HoverProvider , Position , Hover , WorkspaceSymbolProvider , Range , commands , SymbolKind } from "vscode" ;
6
+ import { ClassFileContentsRequest , StatusNotification } from "./protocol" ;
7
7
import { createClientHoverProvider } from "./hoverAction" ;
8
8
import { getActiveLanguageClient } from "./extension" ;
9
9
import { apiManager } from "./apiManager" ;
10
10
import { ServerMode } from "./settings" ;
11
+ import { serverStatus , ServerStatusKind } from "./serverStatus" ;
12
+ import { Commands } from "./commands" ;
11
13
12
14
export interface ProviderOptions {
13
15
contentProviderEvent : Event < Uri > ;
@@ -26,6 +28,9 @@ export function registerClientProviders(context: ExtensionContext, options: Prov
26
28
27
29
const jdtProvider = createJDTContentProvider ( options ) ;
28
30
context . subscriptions . push ( workspace . registerTextDocumentContentProvider ( 'jdt' , jdtProvider ) ) ;
31
+
32
+ overwriteWorkspaceSymbolProvider ( context ) ;
33
+
29
34
return {
30
35
handles : [ hoverProvider , symbolProvider , jdtProvider ]
31
36
} ;
@@ -100,3 +105,50 @@ function createDocumentSymbolProvider(): DocumentSymbolProvider {
100
105
}
101
106
} ;
102
107
}
108
+
109
+ const START_OF_DOCUMENT = new Range ( new Position ( 0 , 0 ) , new Position ( 0 , 0 ) ) ;
110
+
111
+ function createWorkspaceSymbolProvider ( existingWorkspaceSymbolProvider : WorkspaceSymbolProvider ) : WorkspaceSymbolProvider {
112
+ return {
113
+ provideWorkspaceSymbols : existingWorkspaceSymbolProvider . provideWorkspaceSymbols ,
114
+ resolveWorkspaceSymbol : async ( symbol : SymbolInformation , token : CancellationToken ) : Promise < SymbolInformation > => {
115
+ const range = symbol . location . range ;
116
+ if ( range && ! range . isEqual ( START_OF_DOCUMENT ) ) {
117
+ return symbol ;
118
+ }
119
+
120
+ const languageClient = await getActiveLanguageClient ( ) ;
121
+ const serializableSymbol = {
122
+ name : symbol . name ,
123
+ // Cannot serialize SymbolKind as number, because GSON + lsp4j.SymbolKind expect a name.
124
+ kind : SymbolKind [ symbol . kind ] ,
125
+ location : {
126
+ uri : languageClient . code2ProtocolConverter . asUri ( symbol . location . uri ) ,
127
+ range : languageClient . code2ProtocolConverter . asRange ( symbol . location . range )
128
+ } ,
129
+ containerName : symbol . containerName
130
+ } ;
131
+
132
+ const response = await commands . executeCommand ( Commands . EXECUTE_WORKSPACE_COMMAND , Commands . RESOLVE_WORKSPACE_SYMBOL , JSON . stringify ( serializableSymbol ) ) ;
133
+ if ( token . isCancellationRequested ) {
134
+ return undefined ;
135
+ }
136
+ return languageClient . protocol2CodeConverter . asSymbolInformation ( response as clientSymbolInformation ) ;
137
+ }
138
+ } ;
139
+ }
140
+
141
+ function overwriteWorkspaceSymbolProvider ( context : ExtensionContext ) : void {
142
+ const disposable = apiManager . getApiInstance ( ) . onDidServerModeChange ( async ( mode ) => {
143
+ if ( mode === ServerMode . STANDARD ) {
144
+ const feature = ( await getActiveLanguageClient ( ) ) . getFeature ( WorkspaceSymbolRequest . method ) ;
145
+ const providers = feature . getProviders ( ) ;
146
+ if ( providers && providers . length > 0 ) {
147
+ feature . dispose ( ) ;
148
+ const workspaceSymbolProvider = createWorkspaceSymbolProvider ( providers [ 0 ] ) ;
149
+ context . subscriptions . push ( languages . registerWorkspaceSymbolProvider ( workspaceSymbolProvider ) ) ;
150
+ disposable . dispose ( ) ;
151
+ }
152
+ }
153
+ } ) ;
154
+ }
0 commit comments