@@ -6,7 +6,7 @@ import * as fse from 'fs-extra';
66import * as os from 'os' ;
77import * as path from 'path' ;
88import * as semver from 'semver' ;
9- import { CodeActionContext , commands , ConfigurationTarget , Diagnostic , env , EventEmitter , ExtensionContext , extensions , IndentAction , InputBoxOptions , languages , QuickPickItemKind , RelativePattern , TextDocument , TextEditorRevealType , UIKind , Uri , ViewColumn , window , workspace , WorkspaceConfiguration } from 'vscode' ;
9+ import { CodeActionContext , commands , CompletionItem , ConfigurationTarget , Diagnostic , env , EventEmitter , ExtensionContext , extensions , IndentAction , InputBoxOptions , languages , MarkdownString , QuickPickItemKind , RelativePattern , TextDocument , TextEditorRevealType , UIKind , Uri , ViewColumn , window , workspace , WorkspaceConfiguration } from 'vscode' ;
1010import { CancellationToken , CodeActionParams , CodeActionRequest , Command , CompletionRequest , DidChangeConfigurationNotification , ExecuteCommandParams , ExecuteCommandRequest , LanguageClientOptions , RevealOutputChannelOn } from 'vscode-languageclient' ;
1111import { LanguageClient } from 'vscode-languageclient/node' ;
1212import { apiManager } from './apiManager' ;
@@ -20,7 +20,7 @@ import { cleanupLombokCache } from "./lombokSupport";
2020import { markdownPreviewProvider } from "./markdownPreviewProvider" ;
2121import { OutputInfoCollector } from './outputInfoCollector' ;
2222import { collectJavaExtensions , getBundlesToReload , getShortcuts , IJavaShortcut , isContributedPartUpdated } from './plugin' ;
23- import { registerClientProviders } from './providerDispatcher' ;
23+ import { fixJdtSchemeHoverLinks , registerClientProviders } from './providerDispatcher' ;
2424import { initialize as initializeRecommendation } from './recommendation' ;
2525import * as requirements from './requirements' ;
2626import { languageStatusBarProvider } from './runtimeStatusBarProvider' ;
@@ -93,6 +93,25 @@ function getHeapDumpFolderFromSettings(): string {
9393 return results [ 1 ] || results [ 2 ] || results [ 3 ] ;
9494}
9595
96+ const REPLACE_JDT_LINKS_PATTERN : RegExp = / ( \[ (?: [ ^ \] ] ) + \] \( ) ( j d t : \/ \/ (?: (?: (?: \\ \) ) | ( [ ^ ) ] ) ) + ) ) \) / g;
97+
98+ /**
99+ * Replace `jdt://` links in the documentation with links that execute the VS Code command required to open the referenced file.
100+ *
101+ * Extracted from {@link fixJdtSchemeHoverLinks} for use in completion item documentation.
102+ *
103+ * @param oldDocumentation the documentation to fix the links in
104+ * @returns the documentation with fixed links
105+ */
106+ export function fixJdtLinksInDocumentation ( oldDocumentation : MarkdownString ) : MarkdownString {
107+ const newContent : string = oldDocumentation . value . replace ( REPLACE_JDT_LINKS_PATTERN , ( _substring , group1 , group2 ) => {
108+ const uri = `command:${ Commands . OPEN_FILE } ?${ encodeURI ( JSON . stringify ( [ encodeURIComponent ( group2 ) ] ) ) } ` ;
109+ return `${ group1 } ${ uri } )` ;
110+ } ) ;
111+ const mdString = new MarkdownString ( newContent ) ;
112+ mdString . isTrusted = true ;
113+ return mdString ;
114+ }
96115
97116export async function activate ( context : ExtensionContext ) : Promise < ExtensionAPI > {
98117 await loadSupportedJreNames ( context ) ;
@@ -225,6 +244,13 @@ export async function activate(context: ExtensionContext): Promise<ExtensionAPI>
225244 } ) ;
226245 }
227246 } ,
247+ resolveCompletionItem : async ( item , token , next ) : Promise < CompletionItem > => {
248+ const completionItem = await next ( item , token ) ;
249+ if ( completionItem . documentation instanceof MarkdownString ) {
250+ completionItem . documentation = fixJdtLinksInDocumentation ( completionItem . documentation ) ;
251+ }
252+ return completionItem ;
253+ } ,
228254 // https://github.com/redhat-developer/vscode-java/issues/2130
229255 // include all diagnostics for the current line in the CodeActionContext params for the performance reason
230256 provideCodeActions : async ( document , range , context , token , next ) => {
0 commit comments