From 3b538e4d88e3cfbee181ea1495c7dde516e6dfce Mon Sep 17 00:00:00 2001 From: MEHER SRUJANA MATCHA Date: Mon, 27 Jul 2026 17:40:34 +0100 Subject: [PATCH] Add FileSystemProvider for jdt scheme (fixes #4038) --- src/providerDispatcher.ts | 43 ++++++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/src/providerDispatcher.ts b/src/providerDispatcher.ts index abacbe141..60ee3e712 100644 --- a/src/providerDispatcher.ts +++ b/src/providerDispatcher.ts @@ -1,6 +1,6 @@ 'use strict'; -import { CancellationToken, commands, DocumentSymbol, DocumentSymbolProvider, Event, ExtensionContext, Hover, HoverProvider, languages, MarkdownString, MarkedString, Position, Range, SymbolInformation, SymbolKind, TextDocument, TextDocumentContentProvider, Uri, workspace, WorkspaceSymbolProvider } from "vscode"; +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"; import { DocumentSymbol as clientDocumentSymbol, DocumentSymbolRequest, HoverRequest, SymbolInformation as clientSymbolInformation, WorkspaceSymbolRequest } from "vscode-languageclient"; import { LanguageClient } from "vscode-languageclient/node"; import { apiManager } from "./apiManager"; @@ -25,8 +25,8 @@ export function registerClientProviders(context: ExtensionContext, options: Prov const symbolProvider = createDocumentSymbolProvider(); context.subscriptions.push(languages.registerDocumentSymbolProvider('java', symbolProvider)); - const jdtProvider = createJDTContentProvider(options); - context.subscriptions.push(workspace.registerTextDocumentContentProvider('jdt', jdtProvider)); + const jdtProvider = createJDTFileSystemProvider(); + context.subscriptions.push(workspace.registerFileSystemProvider('jdt', jdtProvider, { isCaseSensitive: true, isReadonly: true })); const classProvider = createClassContentProvider(options); context.subscriptions.push(workspace.registerTextDocumentContentProvider('class', classProvider)); @@ -67,20 +67,31 @@ export class ClientHoverProvider implements HoverProvider { } } -function createJDTContentProvider(options: ProviderOptions): TextDocumentContentProvider { - return { - onDidChange: options.contentProviderEvent, - provideTextDocumentContent: async (uri: Uri, token: CancellationToken): Promise => { - const languageClient: LanguageClient | undefined = await getActiveLanguageClient(); - - if (!languageClient) { - return ''; - } +async function getJDTContent(uri: Uri): Promise { + const languageClient: LanguageClient | undefined = await getActiveLanguageClient(); + if (!languageClient) { + return ''; + } + return languageClient.sendRequest(ClassFileContentsRequest.type, { uri: uri.toString() }).then((v: string): string => v || ''); +} - return languageClient.sendRequest(ClassFileContentsRequest.type, { uri: uri.toString() }, token).then((v: string): string => { - return v || ''; - }); - } +function createJDTFileSystemProvider(): FileSystemProvider { + return { + onDidChangeFile: () => new Disposable(() => { }), + watch: () => new Disposable(() => { }), + stat: async (uri: Uri): Promise => { + const content = await getJDTContent(uri); + return { type: FileType.File, ctime: 0, mtime: 0, size: Buffer.byteLength(content, 'utf8') }; + }, + readDirectory: () => { throw FileSystemError.FileNotADirectory(); }, + createDirectory: () => { throw FileSystemError.NoPermissions(); }, + readFile: async (uri: Uri): Promise => { + const content = await getJDTContent(uri); + return Buffer.from(content, 'utf8'); + }, + writeFile: () => { throw FileSystemError.NoPermissions(); }, + delete: () => { throw FileSystemError.NoPermissions(); }, + rename: () => { throw FileSystemError.NoPermissions(); }, }; }