Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'editors/code/src/main.ts')
-rw-r--r--editors/code/src/main.ts61
1 files changed, 42 insertions, 19 deletions
diff --git a/editors/code/src/main.ts b/editors/code/src/main.ts
index 9a9667b2cd..dd439317c7 100644
--- a/editors/code/src/main.ts
+++ b/editors/code/src/main.ts
@@ -3,6 +3,7 @@ import * as lc from "vscode-languageclient/node";
import * as commands from "./commands";
import { CommandFactory, Ctx, fetchWorkspace } from "./ctx";
+import * as diagnostics from "./diagnostics";
import { activateTaskProvider } from "./tasks";
import { setContextValue } from "./util";
@@ -48,30 +49,52 @@ async function activateServer(ctx: Ctx): Promise<RustAnalyzerExtensionApi> {
ctx.pushExtCleanup(activateTaskProvider(ctx.config));
}
+ const diagnosticProvider = new diagnostics.TextDocumentProvider(ctx);
ctx.pushExtCleanup(
vscode.workspace.registerTextDocumentContentProvider(
- "rust-analyzer-diagnostics-view",
- new (class implements vscode.TextDocumentContentProvider {
- async provideTextDocumentContent(uri: vscode.Uri): Promise<string> {
- const diags = ctx.client?.diagnostics?.get(
- vscode.Uri.parse(uri.fragment, true)
- );
- if (!diags) {
- return "Unable to find original rustc diagnostic";
- }
-
- const diag = diags[parseInt(uri.query)];
- if (!diag) {
- return "Unable to find original rustc diagnostic";
- }
- const rendered = (diag as unknown as { data?: { rendered?: string } }).data
- ?.rendered;
- return rendered ?? "Unable to find original rustc diagnostic";
- }
- })()
+ diagnostics.URI_SCHEME,
+ diagnosticProvider
)
);
+ const decorationProvider = new diagnostics.AnsiDecorationProvider(ctx);
+ ctx.pushExtCleanup(decorationProvider);
+
+ async function decorateVisibleEditors(document: vscode.TextDocument) {
+ for (const editor of vscode.window.visibleTextEditors) {
+ if (document === editor.document) {
+ await decorationProvider.provideDecorations(editor);
+ }
+ }
+ }
+
+ vscode.workspace.onDidChangeTextDocument(
+ async (event) => await decorateVisibleEditors(event.document),
+ null,
+ ctx.subscriptions
+ );
+ vscode.workspace.onDidOpenTextDocument(decorateVisibleEditors, null, ctx.subscriptions);
+ vscode.window.onDidChangeActiveTextEditor(
+ async (editor) => {
+ if (editor) {
+ diagnosticProvider.triggerUpdate(editor.document.uri);
+ await decorateVisibleEditors(editor.document);
+ }
+ },
+ null,
+ ctx.subscriptions
+ );
+ vscode.window.onDidChangeVisibleTextEditors(
+ async (visibleEditors) => {
+ for (const editor of visibleEditors) {
+ diagnosticProvider.triggerUpdate(editor.document.uri);
+ await decorationProvider.provideDecorations(editor);
+ }
+ },
+ null,
+ ctx.subscriptions
+ );
+
vscode.workspace.onDidChangeWorkspaceFolders(
async (_) => ctx.onWorkspaceFolderChanges(),
null,