Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 15 additions & 1 deletion apps/vscode/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -970,6 +970,20 @@
"default": true,
"markdownDescription": "Show parameter help when editing function calls."
},
"quarto.cells.diagnostics.enabled": {
"order": 25,
"scope": "window",
"type": "boolean",
"default": true,
"markdownDescription": "Enable diagnostics (linting) for code blocks from language servers."
},
"quarto.cells.diagnostics.debounceDelay": {
"order": 26,
"scope": "window",
"type": "number",
"default": 500,
"markdownDescription": "Delay in milliseconds before updating diagnostics after document changes."
},
"quarto.cells.background.enabled": {
"type": "boolean",
"description": "Enable coloring the background of executable code cells.",
Expand Down Expand Up @@ -1016,7 +1030,7 @@
"markdownDescription": "Millisecond delay between background color updates."
},
"quarto.cells.useReticulate": {
"order": 25,
"order": 27,
"scope": "window",
"type": "boolean",
"default": true,
Expand Down
16 changes: 11 additions & 5 deletions apps/vscode/src/lsp/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -72,14 +72,16 @@ import { imageHover } from "../providers/hover-image";
import { LspInitializationOptions, QuartoContext } from "quarto-core";
import { extensionHost } from "../host";
import semver from "semver";
import { EmbeddedDiagnosticsManager } from "../providers/embedded-diagnostics";

let client: LanguageClient;

export async function activateLsp(
context: ExtensionContext,
quartoContext: QuartoContext,
engine: MarkdownEngine,
outputChannel: LogOutputChannel
outputChannel: LogOutputChannel,
diagnosticsManager?: EmbeddedDiagnosticsManager
) {

// The server is implemented in node
Expand All @@ -105,7 +107,7 @@ export async function activateLsp(
const config = workspace.getConfiguration("quarto");
activateVirtualDocEmbeddedContent();
const middleware: Middleware = {
handleDiagnostics: createDiagnosticFilter(),
handleDiagnostics: createDiagnosticFilter(diagnosticsManager),
provideCompletionItem: embeddedCodeCompletionProvider(engine),
provideDefinition: embeddedGoToDefinitionProvider(engine),
provideDocumentFormattingEdits: embeddedDocumentFormattingProvider(engine),
Expand Down Expand Up @@ -369,15 +371,19 @@ function isWithinYamlComment(doc: TextDocument, pos: Position) {
*
* @returns A handler function for the middleware
*/
export function createDiagnosticFilter() {
export function createDiagnosticFilter(diagnosticsManager?: EmbeddedDiagnosticsManager) {
return (uri: Uri, diagnostics: Diagnostic[], next: HandleDiagnosticsSignature) => {
// If this is not a virtual document, pass through all diagnostics
if (!isVirtualDoc(uri)) {
next(uri, diagnostics);
return;
}

// For virtual documents, filter out all diagnostics
next(uri, []);
// For virtual docs from Quarto LSP, let diagnostics manager handle them
// (but most diagnostics come from other language servers via onDidChangeDiagnostics)
const remapped = diagnosticsManager?.handleDiagnostics(uri, diagnostics);

// Suppress vdoc diagnostics from being published by the LSP
next(uri, remapped ?? []);
};
}
35 changes: 33 additions & 2 deletions apps/vscode/src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,9 @@ import * as vscode from "vscode";
import * as path from "path";
import { tryAcquirePositronApi } from "@posit-dev/positron";
import { MarkdownEngine } from "./markdown/engine";
import { kQuartoDocSelector } from "./core/doc";
import { kQuartoDocSelector, isQuartoDoc } from "./core/doc";
import { activateLsp, deactivate as deactivateLsp } from "./lsp/client";
import { EmbeddedDiagnosticsManager } from "./providers/embedded-diagnostics";
import { cellCommands } from "./providers/cell/commands";
import { quartoCellExecuteCodeLensProvider } from "./providers/cell/codelens";
import { activateQuartoAssistPanel } from "./providers/assist/panel";
Expand Down Expand Up @@ -116,8 +117,38 @@ export async function activate(context: vscode.ExtensionContext): Promise<Quarto
// deno config
activateDenoConfig(context, engine);

// Initialize diagnostic manager for code blocks
const diagnosticsManager = new EmbeddedDiagnosticsManager(engine);
context.subscriptions.push(diagnosticsManager);

// Register document listeners for diagnostic manager
context.subscriptions.push(
vscode.workspace.onDidOpenTextDocument((doc) => {
if (isQuartoDoc(doc)) {
diagnosticsManager.handleDocumentOpen(doc);
}
}),
vscode.workspace.onDidChangeTextDocument((e) => {
if (isQuartoDoc(e.document)) {
diagnosticsManager.handleDocumentChange(e.document);
}
}),
vscode.workspace.onDidCloseTextDocument((doc) => {
if (isQuartoDoc(doc)) {
diagnosticsManager.handleDocumentClose(doc);
}
})
);

// Process already-open documents
vscode.workspace.textDocuments.forEach((doc) => {
if (isQuartoDoc(doc)) {
diagnosticsManager.handleDocumentOpen(doc);
}
});

// lsp
const lspClient = await activateLsp(context, quartoContext, engine, outputChannel);
const lspClient = await activateLsp(context, quartoContext, engine, outputChannel, diagnosticsManager);

// provide visual editor
const editorCommands = activateEditor(context, host, quartoContext, lspClient, engine);
Expand Down
Loading
Loading