11'use strict' ;
22
3- import { CancellationToken , commands , DocumentSymbol , DocumentSymbolProvider , Event , ExtensionContext , Hover , HoverProvider , languages , MarkdownString , MarkedString , Position , Range , SymbolInformation , SymbolKind , TextDocument , TextDocumentContentProvider , Uri , workspace , WorkspaceSymbolProvider } from "vscode" ;
3+ import { CancellationToken , commands , DocumentSymbol , DocumentSymbolProvider , Event , ExtensionContext , Hover , HoverProvider , languages , MarkdownString , MarkedString , Position , Range , SymbolInformation , SymbolKind , TextDocument , TextDocumentContentProvider , Uri , workspace , WorkspaceSymbolProvider , Disposable , FileStat , FileSystemError , FileSystemProvider , FileType } from "vscode" ;
44import { DocumentSymbol as clientDocumentSymbol , DocumentSymbolRequest , HoverRequest , SymbolInformation as clientSymbolInformation , WorkspaceSymbolRequest } from "vscode-languageclient" ;
55import { LanguageClient } from "vscode-languageclient/node" ;
66import { apiManager } from "./apiManager" ;
@@ -25,8 +25,8 @@ export function registerClientProviders(context: ExtensionContext, options: Prov
2525 const symbolProvider = createDocumentSymbolProvider ( ) ;
2626 context . subscriptions . push ( languages . registerDocumentSymbolProvider ( 'java' , symbolProvider ) ) ;
2727
28- const jdtProvider = createJDTContentProvider ( options ) ;
29- context . subscriptions . push ( workspace . registerTextDocumentContentProvider ( 'jdt' , jdtProvider ) ) ;
28+ const jdtProvider = createJDTFileSystemProvider ( ) ;
29+ context . subscriptions . push ( workspace . registerFileSystemProvider ( 'jdt' , jdtProvider , { isCaseSensitive : true , isReadonly : true } ) ) ;
3030
3131 const classProvider = createClassContentProvider ( options ) ;
3232 context . subscriptions . push ( workspace . registerTextDocumentContentProvider ( 'class' , classProvider ) ) ;
@@ -67,20 +67,31 @@ export class ClientHoverProvider implements HoverProvider {
6767 }
6868}
6969
70- function createJDTContentProvider ( options : ProviderOptions ) : TextDocumentContentProvider {
71- return < TextDocumentContentProvider > {
72- onDidChange : options . contentProviderEvent ,
73- provideTextDocumentContent : async ( uri : Uri , token : CancellationToken ) : Promise < string > => {
74- const languageClient : LanguageClient | undefined = await getActiveLanguageClient ( ) ;
75-
76- if ( ! languageClient ) {
77- return '' ;
78- }
70+ async function getJDTContent ( uri : Uri ) : Promise < string > {
71+ const languageClient : LanguageClient | undefined = await getActiveLanguageClient ( ) ;
72+ if ( ! languageClient ) {
73+ return '' ;
74+ }
75+ return languageClient . sendRequest ( ClassFileContentsRequest . type , { uri : uri . toString ( ) } ) . then ( ( v : string ) : string => v || '' ) ;
76+ }
7977
80- return languageClient . sendRequest ( ClassFileContentsRequest . type , { uri : uri . toString ( ) } , token ) . then ( ( v : string ) : string => {
81- return v || '' ;
82- } ) ;
83- }
78+ function createJDTFileSystemProvider ( ) : FileSystemProvider {
79+ return {
80+ onDidChangeFile : ( ) => new Disposable ( ( ) => { } ) ,
81+ watch : ( ) => new Disposable ( ( ) => { } ) ,
82+ stat : async ( uri : Uri ) : Promise < FileStat > => {
83+ const content = await getJDTContent ( uri ) ;
84+ return { type : FileType . File , ctime : 0 , mtime : 0 , size : Buffer . byteLength ( content , 'utf8' ) } ;
85+ } ,
86+ readDirectory : ( ) => { throw FileSystemError . FileNotADirectory ( ) ; } ,
87+ createDirectory : ( ) => { throw FileSystemError . NoPermissions ( ) ; } ,
88+ readFile : async ( uri : Uri ) : Promise < Uint8Array > => {
89+ const content = await getJDTContent ( uri ) ;
90+ return Buffer . from ( content , 'utf8' ) ;
91+ } ,
92+ writeFile : ( ) => { throw FileSystemError . NoPermissions ( ) ; } ,
93+ delete : ( ) => { throw FileSystemError . NoPermissions ( ) ; } ,
94+ rename : ( ) => { throw FileSystemError . NoPermissions ( ) ; } ,
8495 } ;
8596}
8697
0 commit comments