Skip to content

Commit 4d8492f

Browse files
hopehadfieldrgrunber
authored andcommitted
Fix class links in completion documentation
1 parent 38c8b58 commit 4d8492f

File tree

2 files changed

+31
-13
lines changed

2 files changed

+31
-13
lines changed

src/extension.ts

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import * as fse from 'fs-extra';
66
import * as os from 'os';
77
import * as path from 'path';
88
import * 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';
1010
import { CancellationToken, CodeActionParams, CodeActionRequest, Command, CompletionRequest, DidChangeConfigurationNotification, ExecuteCommandParams, ExecuteCommandRequest, LanguageClientOptions, RevealOutputChannelOn } from 'vscode-languageclient';
1111
import { LanguageClient } from 'vscode-languageclient/node';
1212
import { apiManager } from './apiManager';
@@ -20,7 +20,7 @@ import { cleanupLombokCache } from "./lombokSupport";
2020
import { markdownPreviewProvider } from "./markdownPreviewProvider";
2121
import { OutputInfoCollector } from './outputInfoCollector';
2222
import { collectJavaExtensions, getBundlesToReload, getShortcuts, IJavaShortcut, isContributedPartUpdated } from './plugin';
23-
import { registerClientProviders } from './providerDispatcher';
23+
import { fixJdtSchemeHoverLinks, registerClientProviders } from './providerDispatcher';
2424
import { initialize as initializeRecommendation } from './recommendation';
2525
import * as requirements from './requirements';
2626
import { 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 = /(\[(?:[^\]])+\]\()(jdt:\/\/(?:(?:(?:\\\))|([^)]))+))\)/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

97116
export 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) => {

src/providerDispatcher.ts

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { DocumentSymbol as clientDocumentSymbol, DocumentSymbolRequest, HoverReq
55
import { LanguageClient } from "vscode-languageclient/node";
66
import { apiManager } from "./apiManager";
77
import { Commands } from "./commands";
8-
import { getActiveLanguageClient } from "./extension";
8+
import { fixJdtLinksInDocumentation, getActiveLanguageClient } from "./extension";
99
import { createClientHoverProvider } from "./hoverAction";
1010
import { ClassFileContentsRequest } from "./protocol";
1111
import { ServerMode } from "./settings";
@@ -197,8 +197,6 @@ function overwriteWorkspaceSymbolProvider(context: ExtensionContext): void {
197197
});
198198
}
199199

200-
const REPLACE_JDT_LINKS_PATTERN: RegExp = /(\[(?:[^\]])+\]\()(jdt:\/\/(?:(?:(?:\\\))|([^)]))+))\)/g;
201-
202200
/**
203201
* Returns the hover with all jdt:// links replaced with a command:// link that opens the jdt URI.
204202
*
@@ -209,17 +207,11 @@ const REPLACE_JDT_LINKS_PATTERN: RegExp = /(\[(?:[^\]])+\]\()(jdt:\/\/(?:(?:(?:\
209207
* @param hover The hover to fix the jdt:// links for
210208
* @returns the hover with all jdt:// links replaced with a command:// link that opens the jdt URI
211209
*/
212-
function fixJdtSchemeHoverLinks(hover: Hover): Hover {
210+
export function fixJdtSchemeHoverLinks(hover: Hover): Hover {
213211
const newContents: (MarkedString | MarkdownString)[] = [];
214212
for (const content of hover.contents) {
215213
if (content instanceof MarkdownString) {
216-
const newContent: string = (<MarkdownString>content).value.replace(REPLACE_JDT_LINKS_PATTERN, (_substring, group1, group2) => {
217-
const uri = `command:${Commands.OPEN_FILE}?${encodeURI(JSON.stringify([encodeURIComponent(group2)]))}`;
218-
return `${group1}${uri})`;
219-
});
220-
const mdString = new MarkdownString(newContent);
221-
mdString.isTrusted = true;
222-
newContents.push(mdString);
214+
newContents.push(fixJdtLinksInDocumentation(content));
223215
} else {
224216
newContents.push(content);
225217
}

0 commit comments

Comments
 (0)